使用YouTube API v3(dotnet,C#,Null错误,挑战)上传字幕 [英] Uploading Captions using YouTube API v3 (dotnet, C#, Null Error, CHALLENGING)

查看:84
本文介绍了使用YouTube API v3(dotnet,C#,Null错误,挑战)上传字幕的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用带有YouTube dotnet库的oauth2上传隐藏式字幕.这些示例不包含.NET,而且我知道这是新功能(即API中使用很少的功能).我正在竭尽全力,不知道我是否缺少某些东西,或者API中是否可能存在错误.请帮忙!

I'm trying to upload closed captions using oauth2 with the youtube dotnet libraries. The samples don't include .NET and I understand this is new (i.e. lightly used functionality in the API). I'm pulling my hair out on this one and don't know if I'm missing something or if there could be a bug in the API. Please Help!

我得到的错误是:发送的字节数:0异常:{值不能为空.\ r \ n参数名称:baseUri"}状态:失败

我的代码可以上传视频,但是在上传CAPTION时出现上述错误.

My code WORKS for uploading a VIDEO but gives the error above when uploading a CAPTION.

这是包含正常的视频上传和损坏的字幕上传的代码.

Here is the code which includes both working VIDEO UPLOAD and broken 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;
    }

这是上面的代码输出的错误:

Here is the error output from the code above:

?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中包含行号,因此输出可能会为调试提供更多信息.这是进行异步调用时的错误输出(代码未显示):

Note, I tried doing this as an async task and get the same error but maybe the output will be more informative for debugging since it includes line numbers in ResumableUpload. Here is the error output when making the async call (code not shown):

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库,因此我使用的是我可用的最新代码.

BTW, I updated my nuget youtube libraries on the evening of Aug 03, 2015 so I'm using the latest code available to me.

感谢任何可以帮助您的人!!!!

Thank you to anyone who can help!!!!

推荐答案

您的代码帮助我解决了同一任务遇到的另一个问题.至于您的错误,我认为它来自

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"

Insert()方法中的

参数.似乎该API同时需要一个代码段和状态对象(您随cmdUploadVideo_Click()传递了该对象)方法.以下代码对我有用...

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.

这篇关于使用YouTube API v3(dotnet,C#,Null错误,挑战)上传字幕的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆