48 lines
1.9 KiB
C#
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;
|
|
}
|
|
}
|