Пример #1
0
        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();
        }
Пример #2
0
        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;
            }
        }