YouTube API上传"任务已取消"

时间:2015-12-13 08:10:13

标签: file-upload youtube youtube-data-api

我们已运行服务超过一年,现在使用API​​ v3上传(使用.NET库Google.Apis.YouTube.v3)将视频上传到YouTube。

在过去的两天里,我们突然开始上传所有上传都失败,错误从YouTube返回"任务被取消"。这些视频部分上传到YouTube上,它们正在经历各种不同的进展(有些只有几MB,有些高达17-20MB,但看起来似乎较大的进展在早期的失败列表中)。

这件事发生在周五晚上,我能够在星期六早上推出所有失败的视频而没有发生任何事故,但后来又在星期六早上再次开始,因为周六下午和晚上的所有视频都失败了。我们一共谈论了大约25个视频,而不是数百个。视频大小都在40MB左右。

一次只能上传2-3个视频。虽然我在星期六早上成功地推动了他们所有人,但我实际上每次推高4-5。

其他人可以提出可能的原因或任何疑难解答提示吗?我们还没有看到任何服务器连接问题,并且在此服务器上运行的网站没有任何明显的问题。我无法看到除此之外的任何其他错误"任务被取消"来自YouTube的错误,直到该错误,上传者的进度成功。

编辑:我也能够从我的开发环境运行我们上传的一个重现此问题。我刚刚尝试获取一组全新的API凭据(实际上是针对不同的YouTube帐户),刷新了oAuth令牌并仍然存在同样的问题。

1 个答案:

答案 0 :(得分:3)

您需要在使用服务之前设置超时,如果用户更改了服务,您需要暂停所有上传,使服务无效并重新初始化。

我很确定我可以确认设置YouTubeService.HttpClient.Timeout确实解决了这个问题。

对我迟迟不予回应道歉。

internal YouTubeService YouTubeService { get; set; }

internal async Task InitialiseYouTubeServiceAsync(int timeoutSeconds)
{

    var scope = new List<string> { YouTubeService.Scope.YoutubeUpload, YouTubeService.Scope.Youtube, };
    var clientSecrets = new ClientSecrets()
    {
        ClientId = Constants.ClientId,
        ClientSecret = Constants.ClientSecret
    };

    var fileDataStore = new FileDataStore(Constants.FileDataStore);         

    try
    {

        var credentialTask = GoogleWebAuthorizationBroker.AuthorizeAsync(
            clientSecrets, scope, Environment.UserName, CancellationToken.None, fileDataStore);

        //This is a hack to allow a progress bar timeout when the user closes the 
        //browser without authorising. It's not associated with the question at hand.
        await Task.WhenAny(credentialTask, Task.Delay(TimeSpan.FromSeconds(timeoutSeconds)));

        if (credentialTask.Status == TaskStatus.WaitingForActivation) return;

        var initializer = new BaseClientService.Initializer()
        {
            HttpClientInitializer = credentialTask.Result,
            ApplicationName = Constants.ApplicationName,                    
        };

        YouTubeService = new YouTubeService(initializer);               

        //This is the answer to the question at hand.
        YouTubeService.HttpClient.Timeout = TimeSpan.FromMinutes(Settings.Default.TimeoutMinutes);              

    }
    catch (AggregateException)
    {
        Exceptions.LogSilent(new Exception(ResourceExceptions.AuthorisationDenied), MethodBase.GetCurrentMethod(), EventLogEntryType.Information);
    }

}