using ErsatzTV.FFmpeg.Format; using ErsatzTV.FFmpeg.Option; using ErsatzTV.FFmpeg.State; namespace ErsatzTV.FFmpeg; public abstract record InputFile(string Path, IList Streams) { public List InputOptions { get; } = new(); public List FilterSteps { get; } = new(); } public record ConcatInputFile(string Url, FrameSize Resolution) : InputFile( Url, new List { new VideoStream( 0, string.Empty, Option.None, Resolution, Option.None, false) }) { public void AddOption(IInputOption option) { if (option.AppliesTo(this)) { InputOptions.Add(option); } } } public record AudioInputFile(string Path, IList AudioStreams, AudioState DesiredState) : InputFile( Path, AudioStreams.Cast().ToList()) { public void AddOption(IInputOption option) { if (option.AppliesTo(this)) { InputOptions.Add(option); } } } public record VideoInputFile(string Path, IList VideoStreams) : InputFile( Path, VideoStreams.Cast().ToList()) { public void AddOption(IInputOption option) { if (option.AppliesTo(this)) { InputOptions.Add(option); } } } public record WatermarkInputFile (string Path, IList VideoStreams, WatermarkState DesiredState) : VideoInputFile(Path, VideoStreams); public record SubtitleInputFile(string Path, IList SubtitleStreams, bool Copy) : InputFile(Path, SubtitleStreams) { public bool IsImageBased = SubtitleStreams.All(s => s.Codec is "hdmv_pgs_subtitle" or "dvd_subtitle"); }