using System; using System.Collections.Generic; namespace EmbyToolbox.Models; /// Переопределения пользователя: видео-параметры и дорожки. public sealed class ConversionTaskOverride { public string TargetContainer { get; set; } = string.Empty; public string TargetVideo { get; set; } = string.Empty; public string TargetPixelFormat { get; set; } = string.Empty; public string TargetResolution { get; set; } = string.Empty; public string TargetFps { get; set; } = string.Empty; public string TargetAudioBitrate { get; set; } = "256 kbps"; public string TargetVideoBitrateMode { get; set; } = "Auto"; public double? TargetVideoBitrateMbps { get; set; } public List TrackOverrides { get; } = new(); public void CopyFrom(ConversionTaskOverride o) { TargetContainer = o.TargetContainer; TargetVideo = o.TargetVideo; TargetPixelFormat = o.TargetPixelFormat; TargetResolution = o.TargetResolution; TargetFps = o.TargetFps; TargetAudioBitrate = o.TargetAudioBitrate; TargetVideoBitrateMode = o.TargetVideoBitrateMode; TargetVideoBitrateMbps = o.TargetVideoBitrateMbps; TrackOverrides.Clear(); foreach (var t in o.TrackOverrides) { TrackOverrides.Add(t.Clone()); } } public ConversionTaskOverride Clone() { var c = new ConversionTaskOverride(); c.CopyFrom(this); return c; } } public sealed class TrackOverrideEntry { /// Stream index (ffprobe) для встроенных; отрицательный — внешняя дорожка, см. . public int StreamIndex { get; init; } public string? ExternalPath { get; init; } public SourceKind Source { get; init; } public MediaStreamKind StreamKind { get; init; } public TrackActionKind Action { get; set; } = TrackActionKind.Keep; public bool? Default { get; set; } public string? Language { get; set; } public string? Title { get; set; } public string? AudioBitrateKbps { get; set; } /// Для внешнего аудио: порядковый номер потока внутри файла (0…) для ffmpeg -map input:a:N. public int ExternalAudioStreamOrdinal { get; set; } /// Кодек потока (ffprobe) для отображения / snapshot при внешнем аудио. public string? ExternalStreamCodec { get; set; } /// Сводка для столбца Details у внешних дорожек. public string? ExternalStreamDetails { get; set; } /// Число аудиопотоков в том же внешнем файле (для заголовка по умолчанию / snapshot). public int SameFileExternalAudioStreamCount { get; set; } = 1; /// При внешнем аудио: title из ffprobe-тегов, если был; иначе (заголовок сгенерирован из имени файла). public string? ExternalFfprobeTitle { get; set; } public TrackOverrideEntry Clone() => new() { StreamIndex = StreamIndex, ExternalPath = ExternalPath, Source = Source, StreamKind = StreamKind, Action = Action, Default = Default, Language = Language, Title = Title, AudioBitrateKbps = AudioBitrateKbps, ExternalAudioStreamOrdinal = ExternalAudioStreamOrdinal, ExternalStreamCodec = ExternalStreamCodec, ExternalStreamDetails = ExternalStreamDetails, SameFileExternalAudioStreamCount = SameFileExternalAudioStreamCount, ExternalFfprobeTitle = ExternalFfprobeTitle }; }