YouTube C # API V3, как возобновить прерванную загрузку?
Я не могу понять, как возобновить прерванную загрузку в V3 API C # YouTube.
Мой существующий код использует V1 и работает нормально, но я переключаюсь на V3.
Если я вызываю UploadAsync (), ничего не меняя, он начинается с начала. Используя Fiddler, я вижупротокол, приведенный здесь не сопровождается и загрузка возобновляется.
Я попытался установить позицию в потоке в соответствии с 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". Он содержит класс 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;
}
ЭтиФидлер записи показывая возобновление загрузки.