private bool IsAcceptableQuality(IReadOnlyList <IStreamInfo> streamInfos, DownloadQuality quality)
        {
            var videoStreamInfo = streamInfos.Where(s => s is IVideoStreamInfo).Cast <IVideoStreamInfo>().FirstOrDefault();

            if (videoStreamInfo == null)
            {
                return(false);
            }

            switch (quality)
            {
            case DownloadQuality.Minimum:
                return(videoStreamInfo.VideoQuality <= VideoQuality.Low144);

            case DownloadQuality.Low:
                return(videoStreamInfo.VideoQuality <= VideoQuality.Medium480);

            case DownloadQuality.Medium:
                return(videoStreamInfo.VideoQuality <= VideoQuality.High720);

            case DownloadQuality.High:
                return(videoStreamInfo.VideoQuality <= VideoQuality.High1080);

            case DownloadQuality.Maximum:
            default:
                return(true);
            }
        }
        private async Task <List <FileDownloadingInfo> > InitDownloadingAsync(IList <Video> videos, string directory, DownloadQuality quality, string audioExtForced)
        {
            List <FileDownloadingInfo> result = new List <FileDownloadingInfo>();

            //_client.DownloadClosedCaptionTrackAsync();

            //ThreadPool.SetMaxThreads(Environment.ProcessorCount, Environment.ProcessorCount);

            if (!Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }

            foreach (var vid in videos)
            {
                try
                {
                    StreamManifest infoSet = await _client.Videos.Streams.GetManifestAsync(vid.Id);

                    string vidTitle = RemoveProhibitedChars(vid.Title);

                    switch (quality)
                    {
                    case DownloadQuality.Default:
                    case DownloadQuality.MuxedBest:

                        IEnumerable <MuxedStreamInfo> muxedStreams = infoSet.GetMuxedStreams();
                        IVideoStreamInfo muxedHighestQuality       = muxedStreams.GetWithHighestVideoQuality();
                        string           ext = muxedHighestQuality.Container.Name;
                        //string ext = "mkv";
                        string path = directory + "/" + vidTitle + "." + ext;

                        var file = new FileDownloadingInfo()
                        {
                            Name = vidTitle, StreamInfo = muxedHighestQuality
                        };
                        InitStreamDownloading(file, path, vid);
                        result.Add(file);
                        break;

                    case DownloadQuality.SeparateBest:

                        IEnumerable <IVideoStreamInfo> videoStreams = infoSet.GetVideoStreams();
                        IEnumerable <IAudioStreamInfo> audioStreams = infoSet.GetAudioStreams();
                        IStreamInfo highestBitRate      = audioStreams.GetWithHighestBitrate();
                        IStreamInfo videoHighestQuality = videoStreams.GetWithHighestVideoQuality();

                        string extVideo = videoHighestQuality.Container.Name;

                        string pathVideo = directory + "/" + vidTitle + "." + extVideo;

                        string extAudio  = highestBitRate.Container.Name;
                        string pathAudio = directory + "/" + vidTitle + "." + extAudio;

                        if (audioExtForced == String.Empty)
                        {
                            if (pathAudio.Equals(pathVideo))
                            {
                                pathAudio += ".audio." + extAudio;
                            }
                        }
                        else
                        {
                            pathAudio += "." + audioExtForced;
                        }

                        FileDownloadingInfo audio = new FileDownloadingInfo()
                        {
                            Name = vidTitle + "(audio)", StreamInfo = highestBitRate
                        };
                        FileDownloadingInfo video = new FileDownloadingInfo()
                        {
                            Name       = vidTitle,
                            StreamInfo = videoHighestQuality
                        };

                        if (File.Exists(pathAudio))
                        {
                            _logger.Log("File " + pathAudio + "already exists!. Consider removing or renaming.");
                        }
                        else
                        {
                            InitStreamDownloading(audio, pathAudio, vid);
                            result.Add(audio);
                        }

                        if (File.Exists(pathVideo))
                        {
                            _logger.Log("File " + pathVideo + "already exists!. Consider removing or renaming.");
                        }
                        else
                        {
                            InitStreamDownloading(video, pathVideo, vid);
                            result.Add(video);
                        }

                        break;

                    default:
                        throw new ArgumentOutOfRangeException(nameof(quality), quality, null);
                    }
                }
                catch (Exception ex)
                {
                    _logger.Log(ex.InnerException?.Message);
                }
            }

            return(result);
        }
 public async Task <List <FileDownloadingInfo> > RequestVideoDownloadingAsync(IList <Video> videos, string directory, DownloadQuality quality, string audioExt)
 {
     return(await InitDownloadingAsync(videos, directory, quality, audioExt));
 }
示例#4
0
        public static DownloadViewModel CreateDownloadViewModel(this IViewModelFactory factory, Video video,
                                                                string filePath, string format, DownloadQuality quality)
        {
            var viewModel = factory.CreateDownloadViewModel();

            viewModel.Video    = video;
            viewModel.FilePath = filePath;
            viewModel.Format   = format;
            viewModel.Quality  = quality;

            return(viewModel);
        }
        public async Task <DownloadOption> GetBestDownloadOptionAsync(string videoId, string format, DownloadQuality quality)
        {
            // Get all download options
            var downloadOptions = await GetDownloadOptionsAsync(videoId);

            // Go from worst quality download option up to highest requested
            var bestOption = downloadOptions
                             .Where(o => o.Format == format)
                             .Reverse()
                             .TakeWhile(o => IsAcceptableQuality(o.StreamInfos, quality))
                             .LastOrDefault();

            if (bestOption != null)
            {
                return(bestOption);
            }

            // Get first download option for this format only
            return(downloadOptions.FirstOrDefault(o => o.Format == format));
        }