private void OnProgress(object sender, DownloadProgressData data) { var episodeView = EpisodeViews.Single(a => a.Episode.Number == data.EpisodeNumber); if (Math.Abs(data.Percent - 1) < 0.001) { episodeView.Status = Emoji.Done; episodeView.Percent = data.Percent; episodeView.BytesReceived = ByteSize.FromBytes(data.TotalBytes).ToString("0.00"); episodeView.TotalBytes = ByteSize.FromBytes(data.TotalBytes).ToString("0.00"); episodeView.BytesPerSecond = ByteSize.FromBytes(0).ToString("0.00") + "/s"; return; } if (!string.IsNullOrEmpty(data.Error)) { episodeView.Error = data.Error; } if (DateTime.Now - lastUpdate < TimeSpan.FromMilliseconds(100)) { return; } lastUpdate = DateTime.Now; episodeView.Percent = data.Percent; episodeView.BytesReceived = ByteSize.FromBytes(data.BytesReceived).ToString("0.00"); episodeView.TotalBytes = ByteSize.FromBytes(data.TotalBytes).ToString("0.00"); episodeView.BytesPerSecond = ByteSize.FromBytes(data.BytesPerSecond).ToString("0.00") + "/s"; var timeRemained = TimeSpan.FromSeconds( (data.TotalBytes - data.BytesReceived) / (data.BytesPerSecond == 0 ? 1.0 : data.BytesPerSecond)); episodeView.TimeRemained = $"Remained: {timeRemained:hh\\:mm\\:ss}"; }
private static void OnProgressChanged(object sender, DownloadProgressData e) { lock (ConsoleWriterLock) { Console.SetCursorPosition(0, e.EpisodeNumber); var name = _episodes.Single(episode => episode.Number == e.EpisodeNumber).Name; var totalBytes = ByteSize.FromBytes(e.TotalBytes).ToString("0.00"); var bytesReceived = ByteSize.FromBytes(e.BytesReceived).ToString("0.00"); var bytesPerSecond = ByteSize.FromBytes(e.BytesPerSecond).ToString("0.00"); var timeRemained = TimeSpan.FromSeconds((e.TotalBytes - e.BytesReceived) / (e.BytesPerSecond == 0 ? 1.0 : e.BytesPerSecond)); if (e.Error != null) { Console.ForegroundColor = ConsoleColor.Red; } else if (Math.Abs(e.Percent - 1.0) < 0.01) { Console.ForegroundColor = ConsoleColor.Green; } else { Console.ForegroundColor = ConsoleColor.Yellow; } Console.Write($">> {name} {Math.Round(e.Percent * 100, 2)}% - {bytesReceived}/{totalBytes}" + $" | {bytesPerSecond}/s Remained: {timeRemained:hh\\:mm\\:ss} " + $"{(e.Error != null ? string.Concat("ERROR: ", e.Error) : string.Empty)}"); Console.Write(new string(' ', Console.BufferWidth - Console.CursorLeft)); Console.Write('\n'); Console.ResetColor(); Console.SetCursorPosition(0, e.EpisodeNumber); } }
private void TracksDownloadButton_Click(object sender, EventArgs e) { try { // reset track list colors foreach (DataGridViewRow row in TracksListDataGridView.Rows) { SetDataGridRowColor(SystemColors.Control, row, null); } // determine and create target output folder var folder = DownloadLocationTextBox.Text; if (DownloadCreateSubfolderCheckBox.Checked) { var name = CurrentAlbum.Name; foreach (var c in Path.GetInvalidPathChars()) { name = name.Replace(c, '_'); } folder = Path.Combine(folder, name); } if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } // create object for holding progress relevant data during download DownloadData = new DownloadProgressData() { FolderPath = folder, RemainingTracks = new List <Track>(CurrentAlbum.Tracks) }; // deactivate form and start TaskbarUtils.SetProgressState(Handle, TaskbarUtils.ProgressState.Normal); TaskbarUtils.SetProgressValue(Handle, 0, (ulong)CurrentAlbum.SizeInBytes); SetFormEnabled(false); StartDownload(); } catch (Exception ex) { ShowEx("Failed to start download", ex); } }
public async Task DownloadEpisode(Episode episode) { if (episode.IsDownloaded) { Progress?.Report(new DownloadProgressData(episode.Number, 1.0, episode.TotalBytes, episode.TotalBytes)); } if (episode.DownloadUri is null) { if (episode.EpisodeUri is null) { throw new InvalidOperationException($"{nameof(episode.EpisodeUri)} was null."); } episode.DownloadUri = await GetEpisodeDownloadUrl(episode); Config.Checkpoint.Save(Config.DownloadDirectory, Episodes); } if (episode.Path == null) { episode.Path = Path.Combine(Config.DownloadDirectory, $"{episode.Number}.mp4"); } var config = new DownloadConfiguration { CheckDiskSizeBeforeDownload = true, OnTheFlyDownload = false, }; var downloader = new DownloadService(config); Downloaders[episode.Number] = downloader; DateTime timeSinceLastSave = DateTime.Now; downloader.DownloadProgressChanged += (sender, args) => { var downloadProgressData = new DownloadProgressData(episode.Number, args.ProgressPercentage / 100, args.ReceivedBytesSize, args.TotalBytesToReceive, (long)args.BytesPerSecondSpeed); Progress.Report(downloadProgressData); if (DateTime.Now - timeSinceLastSave > SaveProgressConfig.SaveTime) { downloader.Package.SavePackage(episode.Path); timeSinceLastSave = DateTime.Now; } }; downloader.DownloadFileCompleted += (sender, args) => { if (!args.Cancelled && args.Error == null) { episode.IsDownloaded = true; Config.Checkpoint.Save(Config.DownloadDirectory, Episodes); downloader.Package.Delete(episode.Path); downloader.Dispose(); } else if (args.Cancelled) { Downloaders.Remove(episode.Number); } }; downloader.DownloadStarted += (sender, args) => { episode.TotalBytes = args.TotalBytesToReceive; Config.Checkpoint.Save(Config.DownloadDirectory, Episodes); }; var package = downloader.Package.LoadPackage(episode.Path); if (package == null) { await downloader.DownloadFileTaskAsync(episode.DownloadUri.AbsoluteUri, episode.Path) .ConfigureAwait(false); } else { await downloader.DownloadFileTaskAsync(package).ConfigureAwait(false); } episode.IsDownloaded = true; downloader.Package.Delete(episode.Path); }
private void ProgressUpdater(object sender, DownloadProgressData e) { Bar2.Value = e.Percent; }