91 lines
3.9 KiB
C#
91 lines
3.9 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
|
||
namespace EmbyToolbox.Models;
|
||
|
||
/// <summary>Переопределения пользователя: видео-параметры и дорожки.</summary>
|
||
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<TrackOverrideEntry> 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
|
||
{
|
||
/// <summary>Stream index (ffprobe) для встроенных; отрицательный — внешняя дорожка, см. <see cref="ExternalPath"/>.</summary>
|
||
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; }
|
||
|
||
/// <summary>Для внешнего аудио: порядковый номер потока внутри файла (0…) для ffmpeg <c>-map</c> <i>input:a:N</i>.</summary>
|
||
public int ExternalAudioStreamOrdinal { get; set; }
|
||
|
||
/// <summary>Кодек потока (ffprobe) для отображения / snapshot при внешнем аудио.</summary>
|
||
public string? ExternalStreamCodec { get; set; }
|
||
|
||
/// <summary>Сводка для столбца Details у внешних дорожек.</summary>
|
||
public string? ExternalStreamDetails { get; set; }
|
||
|
||
/// <summary>Число аудиопотоков в том же внешнем файле (для заголовка по умолчанию / snapshot).</summary>
|
||
public int SameFileExternalAudioStreamCount { get; set; } = 1;
|
||
|
||
/// <summary>При внешнем аудио: title из ffprobe-тегов, если был; иначе <see langword="null"/> (заголовок сгенерирован из имени файла).</summary>
|
||
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
|
||
};
|
||
}
|