2024-09-01 23:25:50 +03:00

56 lines
2.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using YoutubeExplode.Videos.Streams;
namespace YoutubeDownloader.Core.Downloading;
public record VideoDownloadPreference(
Container PreferredContainer,
VideoQualityPreference PreferredVideoQuality
)
{
public VideoDownloadOption? TryGetBestOption(IReadOnlyList<VideoDownloadOption> options)
{
// Short-circuit for audio-only formats
if (PreferredContainer.IsAudioOnly)
return options.FirstOrDefault(o => o.Container == PreferredContainer);
var orderedOptions = options.OrderBy(o => o.VideoQuality).ToArray();
var preferredOption = PreferredVideoQuality switch
{
VideoQualityPreference.Highest => orderedOptions.LastOrDefault(o =>
o.Container == PreferredContainer
),
VideoQualityPreference.UpTo1080p => orderedOptions
.Where(o => o.VideoQuality?.MaxHeight <= 1080)
.LastOrDefault(o => o.Container == PreferredContainer),
VideoQualityPreference.UpTo720p => orderedOptions
.Where(o => o.VideoQuality?.MaxHeight <= 720)
.LastOrDefault(o => o.Container == PreferredContainer),
VideoQualityPreference.UpTo480p => orderedOptions
.Where(o => o.VideoQuality?.MaxHeight <= 480)
.LastOrDefault(o => o.Container == PreferredContainer),
VideoQualityPreference.UpTo360p => orderedOptions
.Where(o => o.VideoQuality?.MaxHeight <= 360)
.LastOrDefault(o => o.Container == PreferredContainer),
VideoQualityPreference.Lowest => orderedOptions.LastOrDefault(o =>
o.Container == PreferredContainer
),
_ => throw new InvalidOperationException(
$"Unknown video quality preference '{PreferredVideoQuality}'."
),
};
return preferredOption
?? orderedOptions.FirstOrDefault(o => o.Container == PreferredContainer);
}
}