using Microsoft.Extensions.Logging.Abstractions;
namespace Flaro.Media.Tests;
/// Untertitel aus einer Datei holen und ablegen.
///
///
/// Der Anlass. Im Spieler stand „Diese Untertitelspur liess sich nicht
/// laden", und auf der zweiten Spur kam gar nichts. Nicht das Format war
/// schuld, sondern die Zeit: jeder Abruf startete ffmpeg, ffmpeg las die
/// ganze Datei, und nach dreissig Sekunden wurde abgebrochen. An einem
/// Prüffilm von fünfzehn Megabyte fällt das nie auf — deshalb prüft hier
/// nicht die Dauer, sondern das Verfahren: ein Durchlauf für alle Spuren,
/// und was herauskommt, bleibt liegen.
///
[TestFixture]
public class UntertitelLeserTests
{
private string _ordner = "";
[SetUp]
public void Anlegen() => _ordner = Directory.CreateDirectory(
Path.Combine(Path.GetTempPath(), "flaro-ut-" + Guid.CreateVersion7().ToString("N"))).FullName;
[TearDown]
public void Aufraeumen()
{
try { Directory.Delete(_ordner, recursive: true); } catch (IOException) { /* Kür */ }
}
private UntertitelLeser Leser() => new(
new FfmpegOptions(Testdateien.Suchen("ffmpeg")!, Testdateien.Suchen("ffprobe")!),
NullLogger.Instance);
/// Die Spur landet als WebVTT auf der Platte.
[Test]
public async Task Eine_Textspur_wird_abgelegt()
{
if (!Testdateien.FfmpegVorhanden) Assert.Ignore("Ohne ffmpeg nicht prüfbar.");
var film = Path.Combine(_ordner, "film.mkv");
Testdateien.MitZweiTonspuren(film);
var ziel = Path.Combine(_ordner, "ablage", "spur3.vtt");
// Bild 0, Ton 1 und 2, Untertitel 3 — so legt der Erzeuger sie an.
var fertig = await Leser().ZiehenAsync(film, [new UntertitelLeser.Auftrag(3, ziel)]);
Assert.Multiple(() =>
{
Assert.That(fertig, Is.EquivalentTo(new[] { 3 }));
Assert.That(File.Exists(ziel), Is.True, "die Spur muss liegen bleiben");
Assert.That(File.ReadAllText(ziel), Does.Contain("-->"));
Assert.That(File.ReadAllText(ziel), Does.Contain("Ein Untertitel"));
});
}
/// Nichts Halbes bleibt liegen.
///
///
/// Geschrieben wird unter .teil und erst danach umbenannt. Bliebe
/// eine abgebrochene Datei am richtigen Namen liegen, gälte sie für immer
/// als fertig — und niemand käme je wieder an die vollständige Spur.
///
[Test]
public async Task Keine_Teildatei_bleibt_zurueck()
{
if (!Testdateien.FfmpegVorhanden) Assert.Ignore("Ohne ffmpeg nicht prüfbar.");
var film = Path.Combine(_ordner, "film.mkv");
Testdateien.MitZweiTonspuren(film);
var ziel = Path.Combine(_ordner, "ablage", "spur3.vtt");
await Leser().ZiehenAsync(film, [new UntertitelLeser.Auftrag(3, ziel)]);
Assert.That(Directory.GetFiles(Path.GetDirectoryName(ziel)!, "*.teil"), Is.Empty);
}
/// Eine Spur ohne Text hinterlässt eine leere Datei, keine fehlende.
///
///
/// Die leere Datei ist die Antwort „hier ist nichts". Ohne sie
/// würde bei jedem Abruf aufs Neue die ganze Datei gelesen, um wieder
/// nichts zu finden — und der Spieler bekäme nie eine Auskunft, sondern
/// immer nur eine Wartezeit.
///
[Test]
public async Task Eine_Tonspur_ergibt_eine_leere_Ablage()
{
if (!Testdateien.FfmpegVorhanden) Assert.Ignore("Ohne ffmpeg nicht prüfbar.");
var film = Path.Combine(_ordner, "film.mkv");
Testdateien.MitZweiTonspuren(film);
var ziel = Path.Combine(_ordner, "ablage", "spur1.vtt");
// Spur 1 ist Ton. ffmpeg bricht ab, und das Ergebnis ist kein Text.
var fertig = await Leser().ZiehenAsync(film, [new UntertitelLeser.Auftrag(1, ziel)]);
Assert.That(fertig, Is.Empty);
}
}