我无法解决如何在C#YouTube API的V3中恢复被中断的上传。YouTube C#API V3,您如何恢复中断的上传?
我现有的代码使用V1和正常工作,但我切换到V3。
如果我在不更改任何内容的情况下调用UploadAsync(),它将从头开始。使用Fiddler,我可以看到没有遵循protocol given here,上传重新开始。
我试着根据V1设置流内的位置,但没有ResumeAsync()方法可用。
Python示例使用NextChunk,但SendNextChunk方法受保护,并且在C#中不可用。
在下面的代码中,UploadVideo()和Resume()工作正常,如果我让他们完成,但整个视频上传,而不是其他部分。
如何使用google.apis.youtube.v3恢复中断上传?
这是我到目前为止尝试过的C#代码。
private ResumableUpload<Video> UploadVideo(
YouTubeService youTubeService, Video video, Stream stream, UserCredential userCredentials)
{
var resumableUpload = youTubeService.Videos.Insert(video,
"snippet,status,contentDetails", stream, "video/*");
resumableUpload.OauthToken = userCredentials.Token.AccessToken;
resumableUpload.ChunkSize = 256 * 1024;
resumableUpload.ProgressChanged += resumableUpload_ProgressChanged;
resumableUpload.ResponseReceived += resumableUpload_ResponseReceived;
resumableUpload.UploadAsync();
return resumableUpload;
}
private void Resume(ResumableUpload<Video> resumableUpload)
{
//I tried seeking like V1 but it doesn't work
//if (resumableUpload.ContentStream.CanSeek)
// resumableUpload.ContentStream.Seek(resumableUpload.ContentStream.Position, SeekOrigin.Begin);
resumableUpload.UploadAsync(); // <----This restarts the upload
}
void resumableUpload_ResponseReceived(Video obj)
{
Debug.WriteLine("Video status: {0}", obj.Status.UploadStatus);
}
void resumableUpload_ProgressChanged(IUploadProgress obj)
{
Debug.WriteLine("Position: {0}", (resumableUploadTest == null) ? 0 : resumableUploadTest.ContentStream.Position);
Debug.WriteLine("Status: {0}", obj.Status);
Debug.WriteLine("Bytes sent: {0}", obj.BytesSent);
}
private void button2_Click(object sender, EventArgs e)
{
Resume(resumableUploadTest);
}
任何解决方案/建议/演示或指向“google.apis.youtube.v3”源代码的链接将非常有帮助。
在此先感谢!
编辑:新的信息
我仍然在做这个,我相信API根本没有完成。无论是我还是缺少一些简单的东西。
我仍然无法找到“google.apis.youtube.v3”源代码,因此我下载了最新的“google-api-dotnet-client”源代码。这包含YouTube API使用的ResumableUpload类。
我设法通过跳过UploadAsync()方法中的前四行代码成功地继续上传。我创建了一个名为ResumeAsync()的新方法,它的前四行初始化代码被删除,它是UploadAsync()的副本。一切正常,上传从原来的位置恢复并完成。
我宁愿不改变API中的代码,所以如果有人知道我应该如何使用它,请告诉我。
我会继续堵塞,看看我能否解决问题。
这是原始的UploadAsync()方法和我的ResumeAsync()hack。
public async Task<IUploadProgress> UploadAsync(CancellationToken cancellationToken)
{
try
{
BytesServerReceived = 0;
UpdateProgress(new ResumableUploadProgress(UploadStatus.Starting, 0));
// Check if the stream length is known.
StreamLength = ContentStream.CanSeek ? ContentStream.Length : UnknownSize;
UploadUri = await InitializeUpload(cancellationToken).ConfigureAwait(false);
Logger.Debug("MediaUpload[{0}] - Start uploading...", UploadUri);
using (var callback = new ServerErrorCallback(this))
{
while (!await SendNextChunkAsync(ContentStream, cancellationToken).ConfigureAwait(false))
{
UpdateProgress(new ResumableUploadProgress(UploadStatus.Uploading, BytesServerReceived));
}
UpdateProgress(new ResumableUploadProgress(UploadStatus.Completed, BytesServerReceived));
}
}
catch (TaskCanceledException ex)
{
Logger.Error(ex, "MediaUpload[{0}] - Task was canceled", UploadUri);
UpdateProgress(new ResumableUploadProgress(ex, BytesServerReceived));
throw ex;
}
catch (Exception ex)
{
Logger.Error(ex, "MediaUpload[{0}] - Exception occurred while uploading media", UploadUri);
UpdateProgress(new ResumableUploadProgress(ex, BytesServerReceived));
}
return Progress;
}
public async Task<IUploadProgress> ResumeAsync(CancellationToken cancellationToken)
{
try
{
using (var callback = new ServerErrorCallback(this))
{
while (!await SendNextChunkAsync(ContentStream, cancellationToken).ConfigureAwait(false))
{
UpdateProgress(new ResumableUploadProgress(UploadStatus.Uploading, BytesServerReceived));
}
UpdateProgress(new ResumableUploadProgress(UploadStatus.Completed, BytesServerReceived));
}
}
catch (TaskCanceledException ex)
{
UpdateProgress(new ResumableUploadProgress(ex, BytesServerReceived));
throw ex;
}
catch (Exception ex)
{
UpdateProgress(new ResumableUploadProgress(ex, BytesServerReceived));
}
return Progress;
}
这些是显示上传恢复的Fiddler records。
现在,Google API v3 .NET客户端库包含一个功能,用于在ResumableUpload期间保存UploadUri,并在稍后使用UploadUri在程序重新启动时恢复上载。 https://github.com/google/google-api-dotnet-client-samples中有两个ResumableUpload示例 –