Я не могу понять, как возобновить прерванную загрузку в V3 C# YouTube API.
Мой существующий код использует V1 и работает нормально, но я перехожу на V3.
Если я вызову UploadAsync() без каких-либо изменений, он начнется с самого начала. Используя Fiddler, я вижу, что данный здесь протокол не соблюдается, и загрузка перезапускается. .
Я попытался установить позицию в потоке в соответствии с V1, но метод ResumeAsync() недоступен.
В примере Python используется NextChunk, но метод SendNextChunk защищен и недоступен в C#.
В приведенном ниже коде и UploadVideo(), и Resume() работают нормально, если я оставляю их до завершения, но загружается все видео, а не только оставшиеся части.
Как возобновить прерванную загрузку с помощью google.apis.youtube.v3?
Вот код С#, который я пробовал до сих пор.
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". Он содержит класс 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, показывающие возобновление загрузки.