using System.Collections.Generic; namespace EmbyToolbox.Models; public sealed class TrackSettingsSnapshot { public string FilePath { get; init; } = string.Empty; /// Нормализованный абсолютный каталог исходного видеофайла (родитель имени). public string ScopeDirectory { get; init; } = string.Empty; /// При добавлении каталогом — корень выбранной папки; при перетаскивании — общий предок каталогов батча. public string? ScopeBatchRoot { get; init; } public TrackStructureSignature Signature { get; init; } = new(); public IReadOnlyList Items { get; init; } = []; } public sealed class TrackStructureSignature { public IReadOnlyList Tracks { get; init; } = []; } public sealed class TrackStructureSignatureItem { public int Order { get; init; } public MediaStreamKind StreamKind { get; init; } public SourceKind Source { get; init; } public string Codec { get; init; } = string.Empty; public string Language { get; init; } = string.Empty; public string Title { get; init; } = string.Empty; } public sealed class TrackSettingsSnapshotItem { public int Order { get; init; } public MediaStreamKind StreamKind { get; init; } public SourceKind Source { get; init; } public string Codec { get; init; } = string.Empty; public string Language { get; init; } = string.Empty; public string Title { get; init; } = string.Empty; public TrackActionKind Action { get; init; } public string? Bitrate { get; init; } public bool? Default { get; init; } public string? TargetCodec { get; init; } /// True, если Title в UI отличается от типового (ffprobe/filename) — тогда при apply копируем Title. public bool SnapshotTitleWasUserEdited { get; init; } }