namespace EmbyToolbox.Models; /// Сторонний аудиофайл (контейнер или raw), возможно с несколькими аудиопотоками. public sealed class ExternalAudioFile { public ExternalAudioFile(string fullPath, IReadOnlyList streams) { FullPath = fullPath; Streams = streams; } public string FullPath { get; } public IReadOnlyList Streams { get; } } /// Один аудиопоток внутри (индекс для ffmpeg -map input:a:N). public sealed class ExternalAudioStream { public required string FileFullPath { get; init; } /// Порядковый номер аудиопотока внутри файла (0 = первый audio), для -map M:a:N. public int StreamOrdinal { get; init; } public required string CodecName { get; init; } public string? TitleFromProbe { get; init; } public int? Channels { get; init; } public int? SampleRateHz { get; init; } public long? BitRateBps { get; init; } } /// Результат поиска sidecar: объединённые файлы для плана/ffmpeg и разобранное внешнее аудио. public sealed class SidecarDiscoveryResult { public SidecarDiscoveryResult(IReadOnlyList sidecars, IReadOnlyList externalAudioFiles) { Sidecars = sidecars; ExternalAudioFiles = externalAudioFiles; } public IReadOnlyList Sidecars { get; } /// Разбор аудиофайлов (пути совпадают с audio-). public IReadOnlyList ExternalAudioFiles { get; } }