2

YouTube dotnet ライブラリで oauth2 を使用してクローズド キャプションをアップロードしようとしています。サンプルには .NET が含まれていませんが、これが新しいものであることは理解しています (つまり、API であまり使用されていない機能)。私はこれについて頭を悩ませていますが、何かが欠けているのか、それとも API にバグがあるのか​​ どうかわかりません。助けてください!

私が得るエラーは次のとおりです。 BytesSent: 0 Exception: {"Value cannot be null.\r\nParameter name: baseUri"} Status: Failed

私のコードはビデオをアップロードするために機能しますが、キャプションをアップロードすると上記のエラーが発生します。

これは、動作中の VIDEO UPLOAD と破損した CAPTION UPLOAD の両方を含むコードです。

// THIS ONE WORKS !!!!
        private void cmdUploadVideo_Click(object sender, EventArgs e)
    {
        YouTubeService youtubeService = getYouTubeService();

        Video newVideo = new Video();
        newVideo.Snippet = new VideoSnippet();
        newVideo.Snippet.Title = "Learning YouTube API 2";
        newVideo.Snippet.Description = "Description of video";
        newVideo.Snippet.Tags = new string[] { "tag1", "tag2" };
        newVideo.Snippet.CategoryId = "22"; // See https://developers.google.com/youtube/v3/docs/videoCategories/list
        newVideo.Status = new VideoStatus();
        newVideo.Status.PrivacyStatus = "unlisted"; // or "private" or "public"
        var filePath = @"c:\\_IM\\TestVideo.mp4"; 

        using (var fileStream = new FileStream(filePath, FileMode.Open))
        {
            VideosResource.InsertMediaUpload videosInsertRequest = youtubeService.Videos.Insert(newVideo, "snippet,status", fileStream, "video/*");
            IUploadProgress results = videosInsertRequest.Upload();
        }
    }

// HELP PLEASE!!! VERY SIMILAR STRUCTURE BUT GETS ERROR
    private void cmdUploadVideoCaption_Click(object sender, EventArgs e)
    {
        YouTubeService youtubeService = getYouTubeService();

        Caption newCaption = new Caption();
        newCaption.Snippet = new CaptionSnippet();
        newCaption.Snippet.Name = "test";
        newCaption.Snippet.Language = "en";
        newCaption.Snippet.VideoId = txtVideoID.Text;
        var filePath = @"c:\\_IM\\captions.txt"; // Replace with path to actual movie file.

        using (var fileStream = new FileStream(filePath, FileMode.Open))
        {
            CaptionsResource.InsertMediaUpload captionInsertRequest = youtubeService.Captions.Insert(newCaption, "snippet,status", fileStream, "*/*");
            captionInsertRequest.Sync = true;
            IUploadProgress result = captionInsertRequest.Upload();
// HELP WITH LINE ABOVE ... THAT IS WHERE THE ERROR OCCURS
        }
    }

// THIS PART WORKS !!!! IT IS USED BY BOTH, OAUTH2
    private YouTubeService getYouTubeService()
    {
        UserCredential credential;
        using (FileStream stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
        {
            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                new[] { YouTubeService.Scope.Youtube, YouTubeService.Scope.YoutubeUpload, YouTubeService.Scope.YoutubeForceSsl },
                "user",
                CancellationToken.None,
                new FileDataStore("YouTube.Auth.Store")).Result;
        }

        YouTubeService youtubeService = new YouTubeService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
        });

        return youtubeService;
    }

上記のコードからのエラー出力は次のとおりです。

?result
{Google.Apis.Upload.ResumableUpload<Google.Apis.YouTube.v3.Data.Caption>.ResumableUploadProgress}
    [Google.Apis.Upload.ResumableUpload<Google.Apis.YouTube.v3.Data.Caption>.ResumableUploadProgress]: {Google.Apis.Upload.ResumableUpload<Google.Apis.YouTube.v3.Data.Caption>.ResumableUploadProgress}
    BytesSent: 0
    Exception: {"Value cannot be null.\r\nParameter name: baseUri"}
    Status: Failed

?result.Exception
{"Value cannot be null.\r\nParameter name: baseUri"}
    [System.ArgumentNullException]: {"Value cannot be null.\r\nParameter name: baseUri"}
    _className: null
    _data: null
    _dynamicMethods: null
    _exceptionMethod: null
    _exceptionMethodString: null
    _helpURL: null
    _HResult: -2147467261
    _innerException: null
    _ipForWatsonBuckets: 1903238454
    _message: "Value cannot be null."
    _remoteStackIndex: 0
    _remoteStackTraceString: null
    _safeSerializationManager: {System.Runtime.Serialization.SafeSerializationManager}
    _source: null
    _stackTrace: {sbyte[96]}
    _stackTraceString: null
    _watsonBuckets: null
    _xcode: -532462766
    _xptrs: 0
    Data: {System.Collections.ListDictionaryInternal}
    HelpLink: null
    HResult: -2147467261
    InnerException: null
    IPForWatsonBuckets: 1903238454
    IsTransient: false
    Message: "Value cannot be null.\r\nParameter name: baseUri"
    RemoteStackTrace: null
    Source: "Microsoft.Threading.Tasks"
    StackTrace: "   at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)\r\n   at Microsoft.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)\r\n   at Microsoft.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()\r\n   at Google.Apis.Upload.ResumableUpload`1.<UploadCoreAsync>d__e.MoveNext() in c:\\code\\github\\google-api-dotnet-client\\Tools\\Google.Apis.Release\\bin\\Release\\1.9.2\\default\\Src\\GoogleApis\\Apis\\[Media]\\Upload\\ResumableUpload.cs:line 460"
    TargetSite: {Void ThrowForNonSuccess(System.Threading.Tasks.Task)}
    WatsonBuckets: null

これを非同期タスクとして実行しようとしたところ、同じエラーが発生しましたが、ResumableUpload に行番号が含まれているため、出力にはデバッグ用の情報が含まれている可能性があります。非同期呼び出しを行ったときのエラー出力は次のとおりです (コードは示されていません)。

A first chance exception of type 'System.Net.Http.HttpRequestException' occurred in System.Net.Http.dll
A first chance exception of type 'System.Net.Http.HttpRequestException' occurred in Microsoft.Threading.Tasks.dll
An error prevented the upload from completing.
System.Net.Http.HttpRequestException: Response status code does not indicate success: 403 (Forbidden).
   at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)
   at Microsoft.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at Microsoft.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at Google.Apis.Upload.ResumableUpload`1.<UploadAsync>d__0.MoveNext() in c:\code\github\google-api-dotnet-client\Tools\Google.Apis.Release\bin\Release\1.9.2\default\Src\GoogleApis\Apis\[Media]\Upload\ResumableUpload.cs:line 378
A first chance exception of type 'System.ArgumentNullException' occurred in System.dll
A first chance exception of type 'System.ArgumentNullException' occurred in Microsoft.Threading.Tasks.dll
An error prevented the upload from completing.
System.ArgumentNullException: Value cannot be null.
Parameter name: baseUri
   at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)
   at Microsoft.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at Microsoft.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at Google.Apis.Upload.ResumableUpload`1.<UploadCoreAsync>d__e.MoveNext() in c:\code\github\google-api-dotnet-client\Tools\Google.Apis.Release\bin\Release\1.9.2\default\Src\GoogleApis\Apis\[Media]\Upload\ResumableUpload.cs:line 460

ところで、2015 年 8 月 3 日の夜に nuget youtube ライブラリを更新したので、利用可能な最新のコードを使用しています。

助けてくれる人に感謝します!!!!

4

2 に答える 2

1

Your code helped me solve a separate issue I was having with the same task. As for your error, I think it comes from the

"snippet/status"

parameter in the Insert() method. It seems that the API expects both a snippet and status object (which you are passing with your cmdUploadVideo_Click() method. The following code works for me...

    YouTubeService youtubeService = GetYouTubeService();

    Caption caption = new Caption();
    caption.Snippet = new CaptionSnippet();
    caption.Snippet.Name = "Test Caption";
    caption.Snippet.Language = "en";
    caption.Snippet.VideoId = "videoId";
    caption.Snippet.IsDraft = false;

    var filePath = "{filepath}";
    using (var fileStream = new FileStream(filePath, FileMode.Open))
    {
        CaptionsResource.InsertMediaUpload captionInsertRequest = youtubeService.Captions.Insert(caption, "snippet", fileStream, "*/*");
        captionInsertRequest.Sync = true;
        captionInsertRequest.ProgressChanged += captionInsertRequest_ProgressChanged;
        captionInsertRequest.ResponseReceived += captionInsertRequest_ResponseReceived;
        IUploadProgress result = captionInsertRequest.Upload();
    }

Hope this helps. Thanks.

于 2015-10-26T13:57:25.140 に答える