emby-toolbox/EmbyToolbox/Models/MediaAnalysisResult.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

48 lines
1.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
namespace EmbyToolbox.Models;
/// <summary>Результат детального ffprobe.</summary>
public sealed class MediaAnalysisResult
{
public string? ContainerFormat { get; init; }
public string? FormatName { get; init; }
public long? FormatBitRateBps { get; init; }
public double? DurationSeconds { get; init; }
public IReadOnlyList<MediaStreamInfo> VideoStreams { get; init; } = Array.Empty<MediaStreamInfo>();
public IReadOnlyList<MediaStreamInfo> AudioStreams { get; init; } = Array.Empty<MediaStreamInfo>();
public IReadOnlyList<MediaStreamInfo> SubtitleStreams { get; init; } = Array.Empty<MediaStreamInfo>();
public IReadOnlyList<MediaStreamInfo> DataStreams { get; init; } = Array.Empty<MediaStreamInfo>();
public IReadOnlyList<MediaStreamInfo> AllStreams { get; init; } = Array.Empty<MediaStreamInfo>();
public long? SourceVideoBitrateBps { get; init; }
/// <summary>Основной видеопоток: самый крупный по площади кадра (не первый подряд в JSON — иначе cover/mjpeg может оказаться «основным»).</summary>
public MediaStreamInfo? PrimaryVideo =>
VideoStreams
.OrderByDescending(static v => ((long)(v.Width ?? 0)) * (v.Height ?? 0))
.ThenByDescending(static v => v.IsDefault ? 1 : 0)
.FirstOrDefault();
/// <summary>format.duration, иначе максимум duration среди streams (ffprobe).</summary>
public double? GetEffectiveDurationSeconds()
{
if (DurationSeconds is { } f && f > 0)
{
return f;
}
double? best = null;
foreach (var s in AllStreams)
{
if (s.DurationSeconds is { } d && d > 0)
{
best = best is { } b ? Math.Max(b, d) : d;
}
}
return best;
}
}