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);
     }
 }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
        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);
        }
Exemple #5
0
 private void ProgressUpdater(object sender, DownloadProgressData e)
 {
     Bar2.Value = e.Percent;
 }