久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

<legend id='zFZOL'><style id='zFZOL'><dir id='zFZOL'><q id='zFZOL'></q></dir></style></legend>

<small id='zFZOL'></small><noframes id='zFZOL'>

    <tfoot id='zFZOL'></tfoot>

        <i id='zFZOL'><tr id='zFZOL'><dt id='zFZOL'><q id='zFZOL'><span id='zFZOL'><b id='zFZOL'><form id='zFZOL'><ins id='zFZOL'></ins><ul id='zFZOL'></ul><sub id='zFZOL'></sub></form><legend id='zFZOL'></legend><bdo id='zFZOL'><pre id='zFZOL'><center id='zFZOL'></center></pre></bdo></b><th id='zFZOL'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='zFZOL'><tfoot id='zFZOL'></tfoot><dl id='zFZOL'><fieldset id='zFZOL'></fieldset></dl></div>
        • <bdo id='zFZOL'></bdo><ul id='zFZOL'></ul>
      1. YouTube C# API V3,如何恢復中斷的上傳?

        YouTube C# API V3, how do you resume an interrupted upload?(YouTube C# API V3,如何恢復中斷的上傳?)
        <tfoot id='1WS0I'></tfoot>
        <i id='1WS0I'><tr id='1WS0I'><dt id='1WS0I'><q id='1WS0I'><span id='1WS0I'><b id='1WS0I'><form id='1WS0I'><ins id='1WS0I'></ins><ul id='1WS0I'></ul><sub id='1WS0I'></sub></form><legend id='1WS0I'></legend><bdo id='1WS0I'><pre id='1WS0I'><center id='1WS0I'></center></pre></bdo></b><th id='1WS0I'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='1WS0I'><tfoot id='1WS0I'></tfoot><dl id='1WS0I'><fieldset id='1WS0I'></fieldset></dl></div>
        • <bdo id='1WS0I'></bdo><ul id='1WS0I'></ul>
          <legend id='1WS0I'><style id='1WS0I'><dir id='1WS0I'><q id='1WS0I'></q></dir></style></legend>

            1. <small id='1WS0I'></small><noframes id='1WS0I'>

                <tbody id='1WS0I'></tbody>
                • 本文介紹了YouTube C# API V3,如何恢復中斷的上傳?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

                  問題描述

                  限時送ChatGPT賬號..

                  我不知道如何在 C# YouTube API V3 中恢復中斷的上傳.

                  I can't work out how to resume an interrupted upload in V3 of the C# YouTube API.

                  我現有的代碼使用 V1 并且工作正常,但我正在切換到 V3.

                  My existing code uses V1 and works fine but I'm switching to V3.

                  如果我在不更改任何內容的情況下調用 UploadAsync(),它會從頭開始.使用 Fiddler,我可以看到未遵循 此處給出的協議,并且上傳重新開始.

                  If I call UploadAsync() without changing anything, it starts from the beginning. Using Fiddler, I can see the protocol given here is not followed and the upload restarts.

                  我嘗試按照 V1 設置流中的位置,但沒有可用的 ResumeAsync() 方法.

                  I've tried setting the position within the stream as per V1 but there is no ResumeAsync() method available.

                  Python 示例使用 NextChunk,但 SendNextChunk 方法受到保護,在 C# 中不可用.

                  The Python example uses NextChunk but the SendNextChunk method is protected and not available in C#.

                  在下面的代碼中,如果我讓 UploadVideo() 和 Resume() 完成,但上傳的是整個視頻而不是其余部分,則它們都可以正常工作.

                  In the code below, both UploadVideo() and Resume() work fine if I leave them to completion but the entire video is uploaded instead of just the remaining parts.

                  如何使用 google.apis.youtube.v3 恢復中斷的上傳?

                  How do I resume an interrupted upload using google.apis.youtube.v3?

                  這是我目前嘗試過的 C# 代碼.

                  Here is the C# code I have tried so far.

                  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"源代碼的鏈接都會非常有幫助.

                  Any solution/suggestion/demo or a link to the "google.apis.youtube.v3" source code will be very helpful.

                  提前致謝!

                  新信息

                  我仍在努力,我相信 API 還沒有完成.要么那個,要么我錯過了一些簡單的東西.

                  I'm still working on this and I believe the API simply isn't finished. Either that or I'm missing something simple.

                  我仍然找不到google.apis.youtube.v3"源代碼,所以我下載了最新的google-api-dotnet-client"源代碼.這包含 YouTube API 使用的 ResumableUpload 類.

                  I still can't find the "google.apis.youtube.v3" source code so I downloaded the latest "google-api-dotnet-client" source code. This contains the ResumableUpload class used by the YouTube API.

                  通過跳過 UploadAsync() 方法中的前四行代碼,我成功地繼續上傳.我創建了一個名為 ResumeAsync() 的新方法,它是 UploadAsync() 的副本,其中刪除了前四行初始化代碼.一切正常,上傳從原來的位置恢復并完成.

                  I managed to successfully continue an upload by skipping the first four lines of code in the UploadAsync() method. I created a new method called ResumeAsync(), a copy of UploadAsync() with the first four lines of initialization code removed. Everything worked and the upload resumed from where it was and completed.

                  我不想更改 API 中的代碼,所以如果有人知道我應該如何使用它,請告訴我.

                  I'd rather not be changing code in the API so if anyone knows how I should be using this, let me know.

                  我會繼續努力,看看能不能解決.

                  I'll keep plugging away and see if I can work it out.

                  這是原始的 UploadAsync() 方法和我的 ResumeAsync() hack.

                  This is the original UploadAsync() method and my 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 記錄.

                  These are the Fiddler records showing the upload resuming.

                  推薦答案

                  我已經設法使用反射使其工作,并完全避免了修改 API 的需要.為了完整起見,我將記錄該過程,但不建議這樣做.在可恢復的上傳對象中設置私有屬性不是一個好主意.

                  I've managed to get this to work using reflection and avoided the need to modify the API at all. For completeness, I'll document the process but it isn't recommended. Setting private properties in the resumable upload object is not a great idea.

                  當您的可恢復上傳對象在應用程序重啟或重啟后被銷毀時,您仍然可以使用 Google.Apis.YouTube.v3 客戶端庫.

                  When your resumeable upload object has been destroyed after an application restart or reboot, you can still resume an upload using version "1.8.0.960-rc" of the Google.Apis.YouTube.v3 Client Library.

                  private static void SetPrivateProperty<T>(Object obj, string propertyName, object value)
                  {
                      var propertyInfo = typeof(T).GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Instance);
                      if (propertyInfo == null) return;
                      propertyInfo.SetValue(obj, value, null);
                  }
                  
                  private static object GetPrivateProperty<T>(Object obj, string propertyName)
                  {
                      if (obj == null) return null;
                      var propertyInfo = typeof(T).GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Instance);
                      return propertyInfo == null ? null : propertyInfo.GetValue(obj, null);
                  }
                  

                  您需要在 ProgressChanged 事件期間保存 UploadUri.

                  You need to save the UploadUri during the ProgressChanged event.

                  Upload.ResumeUri = GetPrivateProperty<ResumableUpload<Video>>(InsertMediaUpload, "UploadUri") as Uri;
                  

                  您需要在調用 ResumeAsync 之前設置 UploadUri 和 StreamLength.

                  You need to set the UploadUri and StreamLength before calling ResumeAsync.

                  private const long UnknownSize = -1;
                  SetPrivateProperty<ResumableUpload<Video>>(InsertMediaUpload, "UploadUri", Upload.ResumeUri);
                  SetPrivateProperty<ResumableUpload<Video>>(InsertMediaUpload, "StreamLength", fileStream.CanSeek ? fileStream.Length : Constants.UnknownSize);
                  Task = InsertMediaUpload.ResumeAsync(CancellationTokenSource.Token);
                  

                  這篇關于YouTube C# API V3,如何恢復中斷的上傳?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

                  【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

                  相關文檔推薦

                  What are good algorithms for vehicle license plate detection?(車牌檢測有哪些好的算法?)
                  onClick event for Image in Unity(Unity中圖像的onClick事件)
                  Running Total C#(運行總 C#)
                  Deleting a directory when clicked on a hyperlink with JAvascript.ASP.NET C#(單擊帶有 JAvascript.ASP.NET C# 的超鏈接時刪除目錄)
                  asp.net listview highlight row on click(asp.net listview 在單擊時突出顯示行)
                  Calling A Button OnClick from a function(從函數調用按鈕 OnClick)

                  <small id='h0wYY'></small><noframes id='h0wYY'>

                    <tfoot id='h0wYY'></tfoot>

                    1. <legend id='h0wYY'><style id='h0wYY'><dir id='h0wYY'><q id='h0wYY'></q></dir></style></legend>
                        <bdo id='h0wYY'></bdo><ul id='h0wYY'></ul>

                          <tbody id='h0wYY'></tbody>

                          <i id='h0wYY'><tr id='h0wYY'><dt id='h0wYY'><q id='h0wYY'><span id='h0wYY'><b id='h0wYY'><form id='h0wYY'><ins id='h0wYY'></ins><ul id='h0wYY'></ul><sub id='h0wYY'></sub></form><legend id='h0wYY'></legend><bdo id='h0wYY'><pre id='h0wYY'><center id='h0wYY'></center></pre></bdo></b><th id='h0wYY'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='h0wYY'><tfoot id='h0wYY'></tfoot><dl id='h0wYY'><fieldset id='h0wYY'></fieldset></dl></div>
                            主站蜘蛛池模板: www.日韩 | 日韩at| 国内精品免费久久久久软件老师 | 国产一区视频在线 | 蜜桃官网| 精品亚洲一区二区三区 | 成年视频在线观看福利资源 | 美女久久久 | 亚洲欧洲成人av每日更新 | 看黄在线| 日本在线一二 | 在线欧美亚洲 | 夜夜爽99久久国产综合精品女不卡 | 亚洲精品欧美精品 | 香蕉视频在线播放 | 综合久久综合久久 | 成人在线播放 | 亚洲精品二区 | 另类 综合 日韩 欧美 亚洲 | 在线观看中文字幕视频 | 亚洲一区二区三区在线 | 国产欧美一区二区在线观看 | 365夜爽爽欧美性午夜免费视频 | 毛片高清| 亚洲影视在线 | 国产国产精品久久久久 | 久久久久中文字幕 | 黄色大片视频 | 玖玖玖在线观看 | 青青草视频免费观看 | 久久伊人精品一区二区三区 | 国产精品欧美精品 | 黄视频免费在线 | 两性午夜视频 | 欧美激情99| 国产激情在线观看 | 一区二区精品 | 99久久久久久久 | 黄色在线免费观看视频网站 | 精品欧美乱码久久久久久 | 亚洲国产69 |