Exemple #1
0
        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;
        }
Exemple #2
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);
        }