private void InitDownloader() { var config = new DownloadConfiguration() { ChunkCount = Model.ChunksCount, ParallelDownload = Model.ParallelDownload, OnTheFlyDownload = Model.DownloadOnTheFly, MaximumBytesPerSecond = Model.Speed, TempDirectory = Model.TempDirectory, CheckDiskSizeBeforeDownload = true }; _downloader?.Dispose(); _downloader = new DownloadService(config); _downloader.DownloadStarted += OnDownloadStarted; _downloader.DownloadProgressChanged += OnProgressChanged; _downloader.DownloadFileCompleted += OnDownloadCompleted; }
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); }