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
};
}