Определите размер электронной книги перед загрузкой из API книг Google - PullRequest
0 голосов
/ 25 июня 2018

Я пишу настольный электронный ридер для Google Книг в качестве упражнения, используя API книг Google.

Я застрял при попытке определить размер книги перед ее загрузкой.Я хочу добавить индикатор выполнения, чтобы указать ход загрузки.

Я использую Google.Apis.Download.MediaDownloader, чтобы выполнить загрузку, и, хотя мне это удалось, я не могу найти какую-либо информацию в Интернетеотносительно получения размера файла перед загрузкой.

Единственная информация, которую я могу найти, - это как определить размер файла при загрузке с Google Диска.Но, насколько я могу судить, код не может быть использован для API книг.

Ниже приведена текущая версия моей функции загрузки для контекста:

private async Task Download(string VolID)
{      
  UserCredential credential;
  using (FileStream stream = new FileStream(ClientSecret_Path, FileMode.Open, FileAccess.Read))
  {
    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        new[] { BooksService.Scope.Books },
        "user", CancellationToken.None, new FileDataStore("Books.ListMyLibrary"));
  }

  BooksService service = new BooksService(new BaseClientService.Initializer
  {
    HttpClientInitializer = credential,
    ApplicationName = "Desktop eReader",
  });

  Google.Apis.Books.v1.Data.Volume volume = await service.Volumes.Get(VolID).ExecuteAsync();
  string bookPath = filePath + volume.VolumeInfo.Title + ".epub";
  if (!File.Exists(bookPath)) //Only DL if not already done.
  {
    MediaDownloader downloader = new MediaDownloader(service);
    MemoryStream dlStream = new MemoryStream();

    downloader.ProgressChanged += Downloader_ProgressChanged;
    downloader.ChunkSize = 51200; //ping every 50Kbs


    /*
     * Add logic in here to determine the file size.
     * Maybe add a download confirmation pop-up.
     * 
     */

    await downloader.DownloadAsync(volume.AccessInfo.Epub.DownloadLink, dlStream);

    using (FileStream dlStream2 = new FileStream(bookPath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
    {
      dlStream.WriteTo(dlStream2);
    }
  }     

  int Chapter = 0;
  int ChapterPos = 0;
  //insert logic here to find last reading position
  ContinueBook(bookPath, Chapter, ChapterPos); //function that will later be used to display last reading position
}
...