1

私はすべての解決策を見つけることができませんでした答えを見つけるために検索しようとしました。 youtube data v3からyoutubeチャンネルに動画をアップロード中にExceptionが発生しました。私はインストールされたアプリケーションのためのキーを作成しました。動画のタイトルとその詳細もうまくアップロードされています。唯一の問題は例外が発生することです。YouTubeデータapi v3動画アップロードエラー

タスクはキャンセルされています。詳細は最後のStack Traceをご覧ください。

は、ここに私のコード

private async Task Run() 
    { 
     UserCredential credential; 
     using (var stream = new FileStream("client_secret_766914936775-1ak2tk5e3u0krlbuu9rdip1sfa9u8k44.apps.googleusercontent.com.json", FileMode.Open, FileAccess.Read)) 
     { 
      credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
       GoogleClientSecrets.Load(stream).Secrets, 
       // This OAuth 2.0 access scope allows an application to upload files to the 
       // authenticated user's YouTube channel, but doesn't allow other types of access. 
       new[] { YouTubeService.Scope.YoutubeUpload }, 
       "techno.1", 
       CancellationToken.None 
      ); 
     } 

     YouTubeService youtubeService = new YouTubeService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = "techno ", 

     }); 



     var video = new Video(); 
     video.Snippet = new VideoSnippet(); 
     video.Snippet.Title = "Default Video Title"; 
     video.Snippet.Description = "Default Video Description"; 
     video.Snippet.Tags = new string[] { "tag1", "tag2" }; 
     video.Snippet.CategoryId = "22"; // See https://developers.google.com/youtube/v3/docs/videoCategories/list 
     video.Status = new VideoStatus(); 
     video.Status.PrivacyStatus = "unlisted"; // or "private" or "public" 
     var filePath = @"abc.mp4"; // Replace with path to actual movie file. 

     using (var fileStream = new FileStream(filePath, FileMode.Open)) 
     { 
      var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, "video/*"); 
      videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged; 
      videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived; 

      await videosInsertRequest.UploadAsync(); 
     } 
    } 

    private void videosInsertRequest_ProgressChanged(Google.Apis.Upload.IUploadProgress progress) 
    { 
     switch (progress.Status) 
     { 
      case UploadStatus.Uploading: 
       Console.WriteLine("{0} bytes sent.", progress.BytesSent); 
       break; 

      case UploadStatus.Failed: 
       Console.WriteLine("An error prevented the upload from completing.\n{0}", progress.Exception); 
       break; 
     } 
    } 

    private void videosInsertRequest_ResponseReceived(Video video) 
    { 
     Console.WriteLine("Video id '{0}' was successfully uploaded.", video.Id); 
    } 
} 

私はuploadStatus.Failed videosInsertRequest_ProgressChange方法を取得しています。

Iはすでに

youtubeService.HttpClient.Timeout = TimeSpan.FromMinutes(60)は、このコードを使用しようとしました。

ただし、タイムアウトプロパティは使用できません。その取得のみ。最後に

An error prevented the upload from completing. System.Threading.Tasks.TaskCanceledException: A task was canceled.
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable 1.ConfiguredTaskAwaiter.GetResult() at Google.Apis.Upload.ResumableUpload 1.d__94.MoveNext() in C:\Apiary\v1.20\google-api-dotnet-client\Src\Support\GoogleApis\Apis[Media]\Upload\ResumableUpload.cs:line 652 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable 1.ConfiguredTaskAwaiter.GetResult() at Google.Apis.Upload.ResumableUpload 1.d__91.MoveNext() in C:\Apiary\v1.20\google-api-dotnet-client\Src\Support\GoogleApis\Apis[Media]\Upload\ResumableUpload.cs:line 581 Error: A task was canceled.

+0

JSONファイルをダウンロードするこの[SOスレッド](http://stackoverflow.com/a/27744211/5832311)で他の提案を試してみてください。 JSONファイル名を 'client_secrets.json'に変更し、bin/Debug ot bin/Releaseと同じ* .exeをディレクトリとして保存します。また、この[関連する問題](https://github.com/youtube/api-samples/issues/7)で説明されているように、ネットワークの速度が遅かった可能性があります。 – abielita

+0

これらのファイルの名前を変更してbin/Releaseに配置しようとしましたが、動作しませんでした。 –

答えて

0

タイムアウト値が15分を超えて長すぎます。私は1分使います。

youtubeService.HttpClient.Timeout = TimeSpan.FromMinutes(1); 

実際の問題のように、返されたエラーを処理せずにアップロードを再開しているようです。サンプルプログラム "ResumeableUpload.C​​S.Sample"(https://github.com/google/google-api-dotnet-client-samples )サンプルプログラムでは、同じインスタンス内でエラーが発生した後にアップロードを再開する方法と、プログラムを再起動した場合にアップロードを再開する方法を示します。

タイムアウト時間が短く、アップロードを再開するコードを使用すると、アップロードサーバーがビジー状態のときにアップロードが大幅に高速化されます。

+0

ええ、あなたは正しいです。しかし、同時に複数のスレッドをアップロードする必要があります。 IUploadSessionDataのuploaduriのどのプロパティを複数のプロセスにdbで保存する必要があるのか​​教えてください。 –

+0

アップロードUriのすべてのプロパティを再開用データベースに保存したくない –

+0

GitHubのサンプルプログラムを見てください。 ** UploadUri.AbsoluteUri **とアップロードされるファイルの絶対パス名を保存します。 –

0

、それは私が間違った方法でのTimeSpanを与えていた

youtubeService.HttpClient.Timeout = TimeSpan.FromMinutes(15.00); 

を働きました。

関連する問題