2013-11-27 55 views
0

我试图通过使用ResumableUploaderYouTube的C#API - 如何恢复上传失败

的代码看起来像这样的C#API大的视频文件上传到YouTube:

  var settings = new YouTubeRequestSettings(Configuration.YouTubeApplicationName, Configuration.YouTubeApplicationKey, Configuration.YouTubeUsername, Configuration.YouTubePassword); 
      settings.Timeout = int.MaxValue; 

      var newVideo = new Video(); 

      newVideo.Title = title.Trim(); 
      newVideo.Tags.Add(new MediaCategory("Games", YouTubeNameTable.CategorySchema)); 
      newVideo.Keywords = keywords; 
      newVideo.Description = description; 
      newVideo.YouTubeEntry.Private = false; 
      newVideo.Tags.Add(new MediaCategory("StarCraft2, Replay", YouTubeNameTable.DeveloperTagSchema)); 
      var contentType = MediaFileSource.GetContentTypeForFileName(filePathToUpload); 
      newVideo.YouTubeEntry.MediaSource = new MediaFileSource(filePathToUpload, contentType); 

      var link = new AtomLink("http://uploads.gdata.youtube.com/resumable/feeds/api/users/default/uploads"); 
      link.Rel = ResumableUploader.CreateMediaRelation; 
      newVideo.YouTubeEntry.Links.Add(link); 

      var resumableUploader = new ResumableUploader(256); //chunksize 256 kilobyte 
      resumableUploader.AsyncOperationCompleted += resumableUploader_AsyncOperationCompleted; 
      resumableUploader.AsyncOperationProgress += resumableUploader_AsyncOperationProgress; 

      var youTubeAuthenticator = new ClientLoginAuthenticator(Configuration.YouTubeApplicationName, ServiceNames.YouTube, Configuration.YouTubeUsername, Configuration.YouTubePassword); 
      youTubeAuthenticator.DeveloperKey = Configuration.YouTubeApplicationKey; 

      resumableUploader.InsertAsync(youTubeAuthenticator, newVideo.YouTubeEntry, new object()); 

我尝试获取异步操作完成后的视频ID,如下所示:

private static void resumableUploader_AsyncOperationCompleted(object sender, AsyncOperationCompletedEventArgs e) 
{ 
    try 
    { 
     var settings = new YouTubeRequestSettings(Configuration.YouTubeApplicationName, Configuration.YouTubeApplicationKey, Configuration.YouTubeUsername, Configuration.YouTubePassword); 
     var request = new YouTubeRequest(settings); 
     Video v = request.ParseVideo(e.ResponseStream);   

    } 
    catch (Exception ex) 
    { 
     //Upload has been disturbed. 
    } 

} 

问题是。有些时候,上传,连接不稳定或类似的问题。当发生错误时AsyncOperationCompleted被调用。

现在的问题是。我如何恢复上传?我可以通过AsyncOperationProgress事件获取当前位置。但是,如何继续上传?

回答

0

我知道这是一个老问题,但我在尝试使用YouTube API的V3做同样的事情时发现它。这看起来像来自早期版本的API的代码,所以my question要求对V3的相同内容可能有助于升级。

我已经粘贴了一些旧的代码,如果有人正在为此苦苦挣扎,但我正在切换到新版本并替换所有代码。 youtube_upload对象是我自己的滚动类,而不是api的一部分。我现在也在使用ReSharper并遵循他们的命名约定。

//Grab the rendered YouTube video ready for upload 
string content_type = MediaFileSource.GetContentTypeForFileName(youtube_upload.YouTubeFileName); 
MediaFileSource media_file_source = new MediaFileSource(youtube_upload.YouTubeFileName, content_type); 

//Generate a media stream and move to the currently uploaded position within it 
media_stream_resume = media_file_source.GetDataStream(); 
media_stream_resume.Seek(youtube_upload.CurrentPosition, SeekOrigin.Begin); 

youtube_uploading_id = youtube_upload.YouTubeID;   

//Attempt to resume the upload 
resumable_uploader.ResumeAsync(youtube_authenticator, youtube_upload.ResumeUri, 
    youtube_upload.httpVerb, media_stream_resume, content_type, youtube_upload); 

youtube_upload.ErrorText = Constants.YouTubeStatusResuming; 
youtube_upload.SaveYouTube();