Я не могу решить, как возобновить прерванную загрузку в V3 API-интерфейса YouTube C#.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» исходный код будет очень полезно.
Спасибо заранее!
EDIT: Новая информация
Я все еще работаю над этим, и я считаю, что API просто не закончена. Либо это, либо я пропустил что-то простое.
Я до сих пор не могу найти исходный код google.apis.youtube.v3, поэтому я загрузил исходный код «google-api-dotnet-client». Это содержит класс ResumableUpload, используемый API YouTube.
Мне удалось успешно продолжить загрузку, пропустив первые четыре строки кода в методе UploadAsync(). Я создал новый метод под названием ResumeAsync(), экземпляр UploadAsync() с удалением первых четырех строк кода инициализации. Все работало, и загрузка возобновилась с того места, где она была и была завершена.
Я бы предпочел не менять код в API, поэтому, если кто-нибудь знает, как я должен использовать это, дайте мне знать.
Я буду продолжать подключаться и посмотреть, смогу ли я это обработать.
Это оригинальный метод UploadAsync() и мой метод ResumeAsync().
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 показывая RESUMING загрузки.
В API v3 библиотеки .NET Клиент Google теперь содержит функцию для сохранения UploadUri во время ResumableUpload и позже использовать что UploadUri возобновить загрузку в случае перезапуска программы. Есть два примера ResumableUpload в https://github.com/google/google-api-dotnet-client-samples –