/// <inheritdoc />
        public async Task DownloadVideoAsync(MediaStreamInfoSet mediaStreamInfoSet, string filePath, string format,
                                             IProgress <double> progress         = null,
                                             CancellationToken cancellationToken = default(CancellationToken))
        {
            mediaStreamInfoSet.GuardNotNull(nameof(mediaStreamInfoSet));
            filePath.GuardNotNull(nameof(filePath));
            format.GuardNotNull(nameof(format));

            var mediaStreamInfos = new List <MediaStreamInfo>();

            // Get best audio stream (priority: transcoding -> bitrate)
            var audioStreamInfo = mediaStreamInfoSet.Audio
                                  .OrderByDescending(s => !IsTranscodingRequired(s.Container, format))
                                  .ThenByDescending(s => s.Bitrate)
                                  .FirstOrDefault();

            // Add to result
            mediaStreamInfos.Add(audioStreamInfo);

            // If needs video - get best video stream (priority: quality -> framerate -> transcoding)
            if (!IsAudioOnlyFormat(format))
            {
                var videoStreamInfo = mediaStreamInfoSet.Video
                                      .OrderByDescending(s => s.VideoQuality)
                                      .ThenByDescending(s => s.Framerate)
                                      .ThenByDescending(s => !IsTranscodingRequired(s.Container, format))
                                      .FirstOrDefault();

                // Add to result
                mediaStreamInfos.Add(videoStreamInfo);
            }

            // Download media streams and process them
            await DownloadAndProcessMediaStreamsAsync(mediaStreamInfos, filePath, format, progress, cancellationToken);
        }
        /// <inheritdoc />
        public async Task DownloadVideoAsync(MediaStreamInfoSet mediaStreamInfoSet, string filePath, string format,
                                             IProgress <double> progress = null, CancellationToken cancellationToken = default)
        {
            mediaStreamInfoSet.GuardNotNull(nameof(mediaStreamInfoSet));
            filePath.GuardNotNull(nameof(filePath));
            format.GuardNotNull(nameof(format));

            // Select best media stream infos based on output format
            var mediaStreamInfos = GetBestMediaStreamInfos(mediaStreamInfoSet, format).ToArray();

            // Download media streams and process them
            await DownloadAndProcessMediaStreamsAsync(mediaStreamInfos, filePath, format, progress, cancellationToken);
        }