using Flaro.Core.Delivery;
using Flaro.Core.Library;
namespace Flaro.Core.Tests;
public class DeliveryDeciderTests
{
private static ProbedStream Bild(string codec = "h264") =>
new(0, MediaStreamKind.Video, codec, null, null, true, false, null, 1920, 1080);
private static ProbedStream Ton(int index, string codec = "aac", string? sprache = "deu", string? name = null) =>
new(index, MediaStreamKind.Audio, codec, sprache, name, index == 1, false, 6, null, null);
private static ProbedStream Text(int index, string codec = "subrip") =>
new(index, MediaStreamKind.Subtitle, codec, "deu", null, false, false, null, null, null);
[Test]
public void Eine_passende_MP4_geht_unveraendert_hinaus()
{
var plan = DeliveryDecider.ForDownload("mp4", [Bild(), Ton(1)]);
Assert.That(plan.Method, Is.EqualTo(DeliveryMethod.DirectFile));
Assert.That(plan.NeedsWork, Is.False);
Assert.That(plan.Reasons, Is.EqualTo(new[] { DeliveryReason.NativelySupported }));
}
[Test]
public void Eine_Matroska_muss_umgepackt_werden_auch_wenn_alles_darin_passt()
{
var plan = DeliveryDecider.ForDownload("mkv", [Bild(), Ton(1)]);
Assert.That(plan.Method, Is.EqualTo(DeliveryMethod.Remux));
Assert.That(plan.Reasons, Does.Contain(DeliveryReason.ContainerUnsupported));
// Das Bild bleibt unberührt, und kein Ton muss gerechnet werden.
Assert.That(plan.AudioToEncode, Is.Empty);
}
/// Der Fall, um den es im ganzen Projekt geht.
///
///
/// Zwei Tonspuren, und beide kommen mit. Der Plan hat gar kein Feld
/// „welche Tonspur" — und das ist der Unterschied zu Jellyfin, dessen
/// Transcode-Endpunkt je Sitzung genau eine abbildet. Wer hier eine
/// auswählen wollte, fände keine Stelle dafür.
///
[Test]
public void Alle_Tonspuren_bleiben_erhalten()
{
var plan = DeliveryDecider.ForDownload("mkv",
[Bild(), Ton(1, name: "Deutsch"), Ton(2, name: "Audiodeskription"), Ton(3, sprache: "eng")]);
Assert.That(plan.Method, Is.EqualTo(DeliveryMethod.Remux));
Assert.That(plan.AudioToEncode, Is.Empty, "Alle drei passen und werden nur umgepackt");
Assert.That(plan.SubtitlesDropped, Is.Empty);
}
/// DTS kennt AVPlayer nicht — nur diese eine Spur wird gerechnet.
[Test]
public void Nur_untaugliche_Tonspuren_werden_neu_gerechnet()
{
var plan = DeliveryDecider.ForDownload("mkv", [Bild(), Ton(1, "aac"), Ton(2, "dts"), Ton(3, "truehd")]);
Assert.That(plan.AudioToEncode, Is.EqualTo(new[] { 2, 3 }));
Assert.That(plan.Reasons, Does.Contain(DeliveryReason.AudioCodecUnsupported));
}
[Test]
public void Textuntertitel_werden_fuer_MP4_umgeschrieben()
{
var plan = DeliveryDecider.ForDownload("mkv", [Bild(), Ton(1), Text(2, "subrip")]);
Assert.That(plan.Reasons, Does.Contain(DeliveryReason.SubtitlesNeedConversion));
Assert.That(plan.SubtitlesDropped, Is.Empty);
}
/// Betrifft fast jeden Blu-ray-Rip.
///
///
/// PGS liegt als Bild vor, und in eine MP4 passt das nicht. Diese Spuren
/// fallen weg — und das muss gesagt werden, statt stillschweigend zu
/// geschehen: sonst sucht jemand nach Untertiteln, die der Server bewusst
/// weggelassen hat.
///
[Test]
public void Bilduntertitel_fallen_weg_und_das_steht_im_Plan()
{
var plan = DeliveryDecider.ForDownload("mkv",
[Bild(), Ton(1), Text(2, "hdmv_pgs_subtitle"), Text(3, "subrip")]);
Assert.That(plan.SubtitlesDropped, Is.EqualTo(new[] { 2 }));
Assert.That(plan.Reasons, Does.Contain(DeliveryReason.ImageSubtitlesDropped));
}
[Test]
public void Ein_untaugliches_Bild_verlangt_ebenfalls_Umpacken()
{
var plan = DeliveryDecider.ForDownload("mkv", [Bild("vp9"), Ton(1)]);
Assert.That(plan.Reasons, Does.Contain(DeliveryReason.VideoCodecUnsupported));
}
/// Was die Datei nicht nennt, gilt als passend.
///
///
/// Vorsichtshalber umzupacken hiesse, aus einer tadellosen MP4 eine neue
/// Datei zu machen — für eine Angabe, die schlicht fehlt.
///
[Test]
public void Fehlende_Angaben_loesen_kein_Umpacken_aus()
{
var plan = DeliveryDecider.ForDownload(null,
[Bild(null!) with { Codec = null }, Ton(1) with { Codec = null }]);
Assert.That(plan.Method, Is.EqualTo(DeliveryMethod.DirectFile));
}
[Test]
public void Jeder_Grund_steht_nur_einmal_da()
{
var plan = DeliveryDecider.ForDownload("mkv", [Bild(), Ton(1, "dts"), Ton(2, "truehd"), Ton(3, "vorbis")]);
Assert.That(plan.Reasons.Count(g => g == DeliveryReason.AudioCodecUnsupported), Is.EqualTo(1));
}
[Test]
public void Ein_eigenes_Geraeteprofil_sticht_die_Voreinstellung()
{
var alleskoenner = new DeviceProfile(
new HashSet { "mkv" }, new HashSet { "h264" }, new HashSet { "dts" });
var plan = DeliveryDecider.ForDownload("mkv", [Bild(), Ton(1, "dts")], alleskoenner);
Assert.That(plan.Method, Is.EqualTo(DeliveryMethod.DirectFile));
}
}