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;
}

ЭтиФидлер записи показывая возобновление загрузки.

Ответы на вопрос(3)

Ваш ответ на вопрос