internal IEnumerable<Music> GetMusicInfo() { var result = new BlockingCollection<Music>(); Task.Factory.StartNew(async () => { int offset = 0; int batch = 200; int vkCount; do { var response = await _client.CallApiMethod(ApiMethod.audio_get, new Dictionary<string, string> { ["owner_id"] = _args.UserId, ["count"] = batch.ToString(), ["offset"] = (offset * batch).ToString() }); vkCount = response["count"].ToObject<int>(); offset++; foreach (var item in response["items"]) { var music = new Music { Title = item["title"].ToObject<string>().Trim(), Artist = item["artist"].ToObject<string>(), Id = item["id"].ToObject<string>(), Url = item["url"].ToObject<string>() }; result.Add(music); } } while (offset * batch < vkCount); result.CompleteAdding(); }); return result.GetConsumingEnumerable(); }
internal bool Download(Music music) { var targetFilename = Path.Combine(_args.Folder, $"{CleanFileName(music.Title)}.mp3"); if (File.Exists(targetFilename)) return true; using (var client = new WebClient()) { var downloadStateItem = new ConsoleState.DownloadState { Id = music.Id, Title = music.Title, PercentComplete = " NEW" }; _reporter.Update(s => { s.Downloads = s.Downloads.Add(downloadStateItem); }); long lastBytes = 0; var locker = new ManualResetEventSlim(false); client.DownloadProgressChanged += (o, downloadProgress) => { _reporter.Update(s => { downloadStateItem.PercentComplete = $"{downloadProgress.ProgressPercentage}%".PadLeft(4, ' '); s.TotalBytes += downloadProgress.BytesReceived - lastBytes; lastBytes = downloadProgress.BytesReceived; }); }; client.DownloadFileCompleted += (o, completed) => { locker.Set(); }; client.DownloadFileAsync(new Uri(music.Url), targetFilename); locker.Wait(); _reporter.Update(s => { downloadStateItem.PercentComplete = "DONE"; }); return true; } }