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