Aus "DEU EAC3 6.0" wird "Deutsch · Dolby Digital Plus · 5.1"

Die Werte gingen roh von ffprobe in die Anzeige. Jedes Stück war richtig
und keines verständlich: EAC3 heisst Dolby Digital Plus, MOV_TEXT heisst
schlicht Text, und sechs Kanäle sind 5.1 — "6.0" ist eine Schreibweise,
die es nicht gibt. Die Auflösung stand als gemessene Höhe da, also "1040p"
für ein beschnittenes Breitbild, was aussieht wie ein Fehler.

Benennung macht daraus Sätze, und zwar im Kern: die Apps brauchen
dieselben, und zweimal formuliert heisst dieselbe Tonspur am Fernseher
anders als im Browser.

CultureInfo taugte dafür nicht, zweimal gemessen: sein NativeName liefert
den Namen in der Sprache selbst — "English", "français" —, und für ein
erfundenes Kürzel wie "xyz" erfindet es stillschweigend eine Kultur, statt
zu scheitern. Also eine eigene Liste, über das zwei- und das
dreibuchstabige Kürzel, weil beide in Mediendateien vorkommen und ISO
639-2 für manche Sprachen zwei kennt.

Unbekanntes bleibt stehen statt zu "Unbekannt" zu werden — die rohe
Angabe ist immer noch eine Auskunft. Und "und" verschwindet ganz: ffmpeg
schreibt das für unbekannt, und als Sprache angezeigt sieht es aus wie
eine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-04 12:28:17 +02:00
co-authored by Claude Opus 5
parent 921533050b
commit 0cd88acf70
6 changed files with 331 additions and 6 deletions
@@ -0,0 +1,85 @@
using Flaro.Core.Media;
namespace Flaro.Core.Tests;
/// <summary>Aus ffprobe-Rohwerten wird etwas, das man vorlesen kann.</summary>
public class BenennungTests
{
[TestCase("deu", "Deutsch")]
[TestCase("ger", "Deutsch")]
[TestCase("de", "Deutsch")]
[TestCase("eng", "Englisch")]
[TestCase("fr", "Französisch")]
public void Sprachkuerzel_werden_Klarnamen(string kuerzel, string erwartet) =>
Assert.That(Benennung.Sprache(kuerzel), Is.EqualTo(erwartet));
/// <summary>„und" heisst unbekannt und darf nicht wie eine Angabe aussehen.</summary>
[TestCase("und")]
[TestCase("unk")]
[TestCase("")]
[TestCase(null)]
public void Unbekanntes_bleibt_leer(string? kuerzel) =>
Assert.That(Benennung.Sprache(kuerzel), Is.Null);
/// <summary>Ein unbekanntes Kürzel bleibt stehen — es ist immer noch eine Auskunft.</summary>
[Test]
public void Fremdes_bleibt_stehen() =>
Assert.That(Benennung.Sprache("xyz"), Is.EqualTo("XYZ"));
/// <summary>Sechs Kanäle sind 5.1 — „6.0" gibt es nicht.</summary>
[TestCase(1, "Mono")]
[TestCase(2, "Stereo")]
[TestCase(6, "5.1")]
[TestCase(8, "7.1")]
[TestCase(null, null)]
public void Kanalzahlen_bekommen_die_uebliche_Schreibweise(int? kanaele, string? erwartet) =>
Assert.That(Benennung.Kanaele(kanaele), Is.EqualTo(erwartet));
[TestCase("eac3", "Dolby Digital Plus")]
[TestCase("h264", "H.264")]
[TestCase("hevc", "H.265")]
[TestCase("mov_text", "Text")]
[TestCase("exotisch", "EXOTISCH")]
public void Codecs_bekommen_ihren_geläufigen_Namen(string kuerzel, string erwartet) =>
Assert.That(Benennung.Codec(kuerzel), Is.EqualTo(erwartet));
/// <summary>Ein beschnittenes Breitbild misst 1040 Zeilen und ist trotzdem 1080p.</summary>
[TestCase(2160, "2160p")]
[TestCase(1080, "1080p")]
[TestCase(1040, "1080p")]
[TestCase(720, "720p")]
public void Bildhoehen_werden_zu_Stufen(int hoehe, string erwartet) =>
Assert.That(Benennung.Aufloesung(hoehe), Is.EqualTo(erwartet));
/// <summary>Der Fall aus der Oberfläche, Wort für Wort.</summary>
[Test]
public void Die_ganze_Tonspur()
{
Assert.That(Benennung.Tonspur("deu", "eac3", 6, null),
Is.EqualTo("Deutsch · Dolby Digital Plus · 5.1"));
Assert.That(Benennung.Tonspur("eng", "aac", 2, null),
Is.EqualTo("Englisch · AAC · Stereo"));
}
/// <summary>„SoundHandler" ist kein Name, sondern ein Rest aus dem Umpacken.</summary>
[Test]
public void Nichtssagende_Titel_fallen_weg() =>
Assert.That(Benennung.Tonspur("deu", "aac", 2, "SoundHandler"),
Is.EqualTo("Deutsch · AAC · Stereo"));
[Test]
public void Ein_echter_Spurtitel_bleibt() =>
Assert.That(Benennung.Tonspur("deu", "aac", 2, "Audiodeskription"),
Does.Contain("Audiodeskription"));
[Test]
public void Untertitel_zeigen_ihre_Besonderheit()
{
Assert.That(Benennung.Untertitelspur("deu", false, false), Is.EqualTo("Deutsch"));
Assert.That(Benennung.Untertitelspur("deu", true, false), Is.EqualTo("Deutsch (erzwungen)"));
}
[Test]
public void Die_ganze_Bildspur() =>
Assert.That(Benennung.Bildspur("h264", 1040), Is.EqualTo("1080p · H.264"));
}