emby-toolbox/EmbyToolbox/Models/ConversionTaskOverride.cs
Emby Toolbox 6264b487fe Initial commit: Emby Toolbox (conversion scroll fix, bulk Del for tracks).
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 21:33:47 +05:00

91 lines
3.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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