private void SendVideoInternal(TLMessage message, CompressingVideoFile file)
        {
            if (file.IsCompressionEnabled)
            {
                message.Status = MessageStatus.Compressing;

                GetCompressedFile(file,
                                  (compressedFile, compressedSize) =>
                {
                    message.Media.IsoFileName = compressedFile.Path;
                    message.Media.File        = compressedFile;
                    message.Status            = MessageStatus.Sending;
                    var mediaVideo            = message.Media as TLMessageMediaVideo;
                    if (mediaVideo != null)
                    {
                        var video = mediaVideo.Video as TLVideo;
                        if (video != null)
                        {
                            video.Size = new TLInt((int)compressedSize);
                            SendCompressedVideoInternal(message, compressedFile);
                        }
                    }
                },
                                  error =>
                {
                    message.Status = MessageStatus.Failed;
                });
            }
            else
            {
                SendCompressedVideoInternal(message, file.Source);
            }
        }
        private static async void GetCompressedFile(CompressingVideoFile file, Action <StorageFile, ulong> callback, Action <double> progressCallback, Action <IAsyncActionWithProgress <double> > faultCallback)
        {
            var fileName        = Path.GetFileName(file.Source.Name);
            var videoParameters = string.Empty;

            if (file.EncodingProfile != null)
            {
                videoParameters = string.Format("{0}_{1}_{2}_{3}", file.EncodingProfile.Video.Width, file.EncodingProfile.Video.Height, file.EncodingProfile.Video.Bitrate, file.EncodingProfile.Video.FrameRate);
            }
            var audioParameters = string.Empty;

            if (file.EncodingProfile != null)
            {
                audioParameters = file.EncodingProfile.Audio != null?file.EncodingProfile.Audio.Bitrate.ToString() : "0";
            }

            var hashString = string.Format("{0}_{1}_{2}_{3}", audioParameters, videoParameters, file.TrimStartTime, file.TrimStopTime);

            var transcodedFileName = string.Format("vid_{0}_{1}", hashString.GetHashCode(), fileName);

            //Telegram.Api.Helpers.Execute.ShowDebugMessage(transcodedFileName + Environment.NewLine + hashString);

            var fulltranscodedFileName = Path.Combine(KnownFolders.CameraRoll.Path, transcodedFileName);

            if (File.Exists(fulltranscodedFileName))
            {
                StorageFile transcodedFile   = null;
                ulong       transcodedLength = 0;
                try
                {
                    transcodedFile = await KnownFolders.CameraRoll.GetFileAsync(transcodedFileName);

                    if (transcodedFile != null)
                    {
                        transcodedLength = (ulong)new FileInfo(fulltranscodedFileName).Length;
                    }
                }
                catch (Exception ex)
                {
                    Telegram.Api.Helpers.Execute.ShowDebugMessage("Get transcoded file ex: \n" + ex);
                }

                if (transcodedFile != null && transcodedLength > 0)
                {
                    callback.SafeInvoke(transcodedFile, transcodedLength);
                    return;
                }
            }

            var dest = await KnownFolders.CameraRoll.CreateFileAsync(transcodedFileName, CreationCollisionOption.ReplaceExisting);

            TranscodeFile(file.EncodingProfile, file.TrimStartTime, file.TrimStopTime, file.Source, dest, callback, progressCallback, faultCallback);
        }
        private static async void GetCompressedFile(CompressingVideoFile file, Action <StorageFile, ulong> callback, Action <IAsyncActionWithProgress <double> > faultCallback)
        {
            //Compression here
            var fileName           = Path.GetFileName(file.Source.Name);
            var transcodedFileName = "vid_" + fileName;

            var fulltranscodedFileName = Path.Combine(KnownFolders.CameraRoll.Path, transcodedFileName);

            if (File.Exists(fulltranscodedFileName))
            {
                StorageFile transcodedFile   = null;
                ulong       transcodedLength = 0;
                try
                {
                    transcodedFile = await KnownFolders.CameraRoll.GetFileAsync(transcodedFileName);

                    if (transcodedFile != null)
                    {
                        transcodedLength = (ulong)new FileInfo(fulltranscodedFileName).Length;
                    }
                }
                catch (Exception ex)
                {
                    Telegram.Api.Helpers.Execute.ShowDebugMessage("Get transcoded file ex: \n" + ex);
                }

                if (transcodedFile != null && transcodedLength > 0)
                {
                    callback.SafeInvoke(transcodedFile, transcodedLength);
                    return;
                }
            }

            var dest = await KnownFolders.CameraRoll.CreateFileAsync(transcodedFileName, CreationCollisionOption.ReplaceExisting);

            TranscodeFile(VideoEncodingQuality.Vga, file.Source, dest, callback, faultCallback);
        }
        private void SendVideoInternal(TLMessage message, CompressingVideoFile file)
        {
            if (file.EncodingProfile != null ||
                file.TrimStartTime.Ticks > 0 ||
                file.TrimStopTime.Ticks > 0)
            {
                message.Status = MessageStatus.Compressing;
                message.Media.UploadingProgress   = 0.001;
                message.Media.CompressingProgress = 0.0;

                GetCompressedFile(
                    file,
                    async(compressedFile, compressedSize) =>
                {
                    if (message.Status == MessageStatus.Failed)
                    {
                        return;
                    }
                    //var videoProperties = await file.Source.Properties.GetVideoPropertiesAsync();
                    //var videoProperties2 = await compressedFile.Properties.GetVideoPropertiesAsync();

                    message.Media.IsoFileName         = compressedFile.Path;
                    message.Media.File                = compressedFile;
                    message.Media.CompressingProgress = 0.0;
                    message.Status    = MessageStatus.Sending;
                    var mediaDocument = message.Media as TLMessageMediaDocument45;
                    if (mediaDocument != null)
                    {
                        var document = mediaDocument.Document as TLDocument;
                        if (document != null)
                        {
                            if (file.EncodingProfile != null &&
                                file.EncodingProfile.Audio == null &&
                                compressedSize < Telegram.Api.Constants.GifMaxSize)
                            {
                                // copy to local storage
                                var localFile = await compressedFile.CopyAsync(ApplicationData.Current.LocalFolder,
                                                                               document.GetFileName(), NameCollisionOption.ReplaceExisting);
                                message.Media.IsoFileName = localFile.Path;
                                message.Media.File        = localFile;
                            }

                            document.Size = new TLInt((int)compressedSize);
                            SendCompressedVideoInternal(message, compressedFile);
                        }
                    }

                    var mediaVideo = message.Media as TLMessageMediaVideo;
                    if (mediaVideo != null)
                    {
                        var video = mediaVideo.Video as TLVideo;
                        if (video != null)
                        {
                            video.Size = new TLInt((int)compressedSize);
                            SendCompressedVideoInternal(message, compressedFile);
                        }
                    }
                },
                    progress =>
                {
                    message.Media.CompressingProgress = progress / 100.0;
                },
                    error =>
                {
                    message.Status = MessageStatus.Failed;
                    message.Media.CompressingProgress = 0.0;
                });
            }
            else
            {
                SendCompressedVideoInternal(message, file.Source);
            }
        }
        public void ContinueSendVideo(CompressingVideoFile videoFile)
        {
            if (videoFile == null)
            {
                return;
            }

            var file = videoFile.Source;

            if (file == null)
            {
                return;
            }

            if (!CheckDocumentSize(videoFile.Size))
            {
                MessageBox.Show(
                    string.Format(AppResources.MaximumFileSizeExceeded, MediaSizeConverter.Convert((int)Telegram.Api.Constants.MaximumUploadedFileSize)),
                    AppResources.Error,
                    MessageBoxButton.OK);
                return;
            }

            // to get access to the file with StorageFile.GetFileFromPathAsync in future
            AddFileToFutureAccessList(file);

            var documentAttributeVideo = new TLDocumentAttributeVideo
            {
                Duration = new TLInt((int)videoFile.Duration),
                W        = new TLInt((int)videoFile.Width),
                H        = new TLInt((int)videoFile.Height)
            };

            var documentAttributeFileName = new TLDocumentAttributeFileName
            {
                FileName = new TLString(file.Name)
            };

            var document = new TLDocument54
            {
                Id         = TLLong.Random(),
                AccessHash = new TLLong(0),
                Date       = TLUtils.DateToUniversalTimeTLInt(MTProtoService.ClientTicksDelta, DateTime.Now),
                MimeType   = new TLString(file.ContentType),
                Size       = new TLInt((int)videoFile.Size),
                Thumb      = videoFile.ThumbPhoto ?? new TLPhotoSizeEmpty {
                    Type = TLString.Empty
                },
                DCId       = new TLInt(0),
                Version    = new TLInt(0),
                Attributes = new TLVector <TLDocumentAttributeBase> {
                    documentAttributeFileName, documentAttributeVideo
                }
            };

            if (videoFile.EncodingProfile != null &&
                videoFile.EncodingProfile.Audio == null &&
                videoFile.Size < Telegram.Api.Constants.GifMaxSize &&
                TLString.Equals(document.MimeType, new TLString("video/mp4"), StringComparison.OrdinalIgnoreCase))
            {
                document.Attributes.Add(new TLDocumentAttributeAnimated());
            }

            var media = new TLMessageMediaDocument75 {
                Flags = new TLInt(0), Document = document, IsoFileName = file.Path, File = file, Caption = TLString.Empty
            };

            var caption = string.IsNullOrEmpty(videoFile.Caption) ? TLString.Empty : new TLString(videoFile.Caption);
            var message = GetMessage(caption, media);

            if (videoFile.TimerSpan != null && videoFile.TimerSpan.Seconds > 0)
            {
                message.NotListened = true;
                var ttlMessageMedia = message.Media as ITTLMessageMedia;
                if (ttlMessageMedia != null)
                {
                    ttlMessageMedia.TTLSeconds = new TLInt(videoFile.TimerSpan.Seconds);
                }
            }

            _mentions = videoFile.Mentions;
            var processedText = string.Empty;
            var entities      = GetEntities(message.Message.ToString(), out processedText);

            _mentions = null;

            if (entities.Count > 0)
            {
                message.Message  = new TLString(processedText);
                message.Entities = new TLVector <TLMessageEntityBase>(entities);
            }

            BeginOnUIThread(() =>
            {
                var previousMessage = InsertSendingMessage(message);
                IsEmptyDialog       = Items.Count == 0 && (_messages == null || _messages.Count == 0) && LazyItems.Count == 0;

                BeginOnThreadPool(() =>
                                  CacheService.SyncSendingMessage(
                                      message, previousMessage,
                                      m => SendVideoInternal(message, videoFile)));
            });
        }
        public void SendVideo(CompressingVideoFile videoFile)
        {
            if (videoFile == null)
            {
                return;
            }

            var file = videoFile.Source;

            if (file == null)
            {
                return;
            }

            if (!CheckDocumentSize(videoFile.Size))
            {
                MessageBox.Show(
                    string.Format(AppResources.MaximumFileSizeExceeded, MediaSizeConverter.Convert((int)Telegram.Api.Constants.MaximumUploadedFileSize)),
                    AppResources.Error,
                    MessageBoxButton.OK);
                return;
            }

            // to get access to the file with StorageFile.GetFileFromPathAsync in future
            AddFileToFutureAccessList(file);

            var video = new TLVideo
            {
                Id         = new TLLong(0),
                Caption    = new TLString(Path.GetFileName(file.Name)),
                AccessHash = new TLLong(0),
                Date       = TLUtils.DateToUniversalTimeTLInt(MTProtoService.ClientTicksDelta, DateTime.Now),
                UserId     = new TLInt(StateService.CurrentUserId),
                Duration   = new TLInt((int)videoFile.Duration),
                MimeType   = new TLString(file.ContentType),
                Size       = new TLInt((int)videoFile.Size),
                Thumb      = videoFile.ThumbPhoto ?? new TLPhotoSizeEmpty {
                    Type = TLString.Empty
                },
                DCId = new TLInt(0),
                W    = new TLInt((int)videoFile.Width),
                H    = new TLInt((int)videoFile.Height)
            };

            var media = new TLMessageMediaVideo28 {
                Video = video, IsoFileName = file.Path, File = file, Caption = TLString.Empty
            };

            var message = GetMessage(TLString.Empty, media);

            BeginOnUIThread(() =>
            {
                var previousMessage = InsertSendingMessage(message);
                IsEmptyDialog       = Items.Count == 0 && LazyItems.Count == 0;

                BeginOnThreadPool(() =>
                                  CacheService.SyncSendingMessage(
                                      message, previousMessage,
                                      TLUtils.InputPeerToPeer(Peer, StateService.CurrentUserId),
                                      m => SendVideoInternal(message, videoFile)));
            });
        }