private async Task UploadItem(UploadQueueItem uploadQueueItem, DataChunkSize dataChunkSize) { if (uploadQueueItem.Title.Trim().Length == 0) { App.TaskDialogShow("오류", "입력에 오류가 있습니다.", "영상 제목은 반드시 채워져야 합니다.", TaskDialogIcon.Error, TaskDialogCommonButtonFlags.OK); return; } string itemName = $"{uploadQueueItem.Title}({Path.GetFileName ( HttpUtility.UrlDecode ( uploadQueueItem.FileName.AbsolutePath ) )})"; switch (await uploadQueueItem.UploadStart(dataChunkSize)) { case UploadResult.Succeed: switch (uploadQueueItem.UploadingStatus) { case UploadingStatus.UploadCompleted: NotificatorManager.Notify("안내", $"{itemName}에 대한 업로드를 성공했습니다.", NotifyType.CustomType1); break; case UploadingStatus.UpdateComplete: NotificatorManager.Notify("안내", $"{itemName}에 대한 업데이트를 성공했습니다.", NotifyType.CustomType1); break; case UploadingStatus.UploadFailed: NotificatorManager.Notify("안내", $"{itemName}에 대한 업로드를 실패했습니다.", NotifyType.Warning); break; case UploadingStatus.UpdateFailed: NotificatorManager.Notify("안내", $"{itemName}에 대한 업데이트를 실패했습니다.", NotifyType.Warning); break; } break; case UploadResult.UploadCanceled: NotificatorManager.Notify("안내", $"{itemName}에 대한 업로드가 중단됐습니다.\n업로드 재개가 가능합니다.", NotifyType.Warning); break; case UploadResult.AlreadyUploading: NotificatorManager.Notify("오류", $"{itemName}은 이미 업로드가 시작되었습니다.", NotifyType.Error); break; case UploadResult.FailedUploadRequest: NotificatorManager.Notify("오류", $"{itemName}의 업로드 요청을 시작할 수 없었습니다.", NotifyType.Error); break; case UploadResult.CannotStartUpload: NotificatorManager.Notify("오류", $"{itemName}의 업로드 작업을 시작할 수 없었습니다.", NotifyType.Error); break; } }
private async void ButtonAllUpload_Click(object sender, RoutedEventArgs e) { List <UploadQueueItem> copied = new List <UploadQueueItem> (uploadQueueListBox.ItemsSource as IEnumerable <UploadQueueItem>); DataChunkSize chunkSize = ( DataChunkSize )dataChunkSize.SelectedIndex; await Task.Run(new Action (() => { foreach (var item in copied) { if (item.UploadingStatus == UploadingStatus.Queued || item.UploadingStatus == UploadingStatus.UploadFailed) { ThreadPool.QueueUserWorkItem(async(i) => { await UploadItem(i as UploadQueueItem, chunkSize); }, item); while (item.UploadingStatus < UploadingStatus.Uploading) { Thread.Sleep(1); } } } } )); }
public async Task <UploadResult> UploadStart(DataChunkSize dataChunkSize = DataChunkSize.ChunkSize_10MB) { youtubeSession.TryGetTarget(out YouTubeSession session); if (UploadingStatus == UploadingStatus.UploadCanceled) { UploadingStatus = UploadingStatus.Queued; video.Id = null; if (mediaStream != null) { mediaStream.Dispose(); } mediaStream = null; Progress = 0; TotalUploaded = 0; TimeRemaining = new TimeSpan(); videoInsertRequest = null; IsManuallyPaused = false; } if (video.Id != null && ( UploadingStatus == UploadingStatus.UploadFailed || UploadingStatus == UploadingStatus.UploadCompleted || UploadingStatus == UploadingStatus.UpdateFailed || UploadingStatus == UploadingStatus.UpdateComplete )) { UploadingStatus = UploadingStatus.UpdateStart; await UploadThumbnail(video.Id); var videoUpdateRequest = session.YouTubeService.Videos.Update(video, "snippet,status"); var result = await videoUpdateRequest.ExecuteAsync(); if (result != null) { UploadingStatus = UploadingStatus.UpdateComplete; PC(nameof(UploadingStatus)); Completed?.Invoke(this, EventArgs.Empty); return(UploadResult.Succeed); } else { UploadingStatus = UploadingStatus.UpdateFailed; PC(nameof(UploadingStatus)); Failed?.Invoke(this, EventArgs.Empty); return(UploadResult.Succeed); } } if (!(UploadingStatus == UploadingStatus.Queued || UploadingStatus == UploadingStatus.UploadFailed)) { return(UploadResult.AlreadyUploading); } UploadingStatus = UploadingStatus.PrepareUpload; bool virIsNull = videoInsertRequest == null; if (virIsNull) { videoInsertRequest = session.YouTubeService.Videos.Insert(video, "snippet,status", mediaStream, "video/*"); if (videoInsertRequest == null) { UploadingStatus = UploadingStatus.UploadFailed; return(UploadResult.FailedUploadRequest); } DataChunkSize = dataChunkSize; videoInsertRequest.ProgressChanged += (uploadProgress) => { TotalUploaded = uploadProgress.BytesSent; Progress = uploadProgress.BytesSent / ( double )mediaStream.Length; double percentage = (uploadProgress.BytesSent - lastSentBytes) / ( double )mediaStream.Length; lastSentBytes = uploadProgress.BytesSent; double totalSeconds = (DateTime.Now.TimeOfDay - startTime).TotalSeconds; TimeRemaining = Progress != 0 ? TimeSpan.FromSeconds((totalSeconds / Progress) * (1 - Progress)) : TimeSpan.FromDays(999); switch (uploadProgress.Status) { case UploadStatus.Starting: startTime = DateTime.Now.TimeOfDay; UploadingStatus = UploadingStatus.UploadStart; Started?.Invoke(this, EventArgs.Empty); break; case UploadStatus.Uploading: UploadingStatus = UploadingStatus.Uploading; Uploading?.Invoke(this, EventArgs.Empty); break; case UploadStatus.Failed: UploadingStatus = UploadingStatus.UploadFailed; Failed?.Invoke(this, EventArgs.Empty); break; case UploadStatus.Completed: UploadingStatus = UploadingStatus.UploadCompleted; Uploading?.Invoke(this, EventArgs.Empty); Completed?.Invoke(this, EventArgs.Empty); mediaStream.Dispose(); mediaStream = null; break; } PC(nameof(Progress)); PC(nameof(UploadingStatus)); PC(nameof(TotalUploaded)); PC(nameof(TimeRemaining)); }; videoInsertRequest.ResponseReceived += async(video) => { await UploadThumbnail(video.Id); foreach (var playlist in Playlists) { playlist.AddVideo(video.Id); } }; } try { startTime = DateTime.Now.TimeOfDay; cancellationTokenSource = new CancellationTokenSource(); var uploadStatus = virIsNull ? await videoInsertRequest.UploadAsync(cancellationTokenSource.Token) : await videoInsertRequest.ResumeAsync(cancellationTokenSource.Token); cancellationTokenSource.Dispose(); video = videoInsertRequest.ResponseBody ?? video; if (uploadStatus.Status == UploadStatus.NotStarted) { UploadingStatus = UploadingStatus.UploadFailed; return(UploadResult.CannotStartUpload); } } catch { UploadingStatus = UploadingStatus.UploadFailed; return(UploadResult.UploadCanceled); } return(UploadResult.Succeed); }