diff --git a/server/src/Flaro.Core/Media/Benennung.cs b/server/src/Flaro.Core/Media/Benennung.cs
index ce3f8ba..fa0f8a0 100644
--- a/server/src/Flaro.Core/Media/Benennung.cs
+++ b/server/src/Flaro.Core/Media/Benennung.cs
@@ -108,10 +108,17 @@ public static class Benennung
if (Codec(codec) is { } c) teile.Add(c);
if (Kanaele(kanaele) is { } k) teile.Add(k);
- // Der Titel aus der Datei nur, wenn er etwas hinzufügt — „SoundHandler"
- // ist kein Name, sondern ein Rest aus dem Umpacken.
- if (titel is { Length: > 0 } && !Nichtssagend.Contains(titel.Trim()))
- teile.Add($"„{titel.Trim()}“");
+ // **Der Titel nur, wenn er etwas hinzufügt.** „SoundHandler" ist kein
+ // Name, sondern ein Rest aus dem Umpacken. Und ein Titel, der bloss
+ // die Sprache wiederholt, ergibt „Deutsch · AAC · Mono · ‚Deutsch'".
+ var blank = titel?.Trim();
+ if (blank is { Length: > 0 }
+ && !Nichtssagend.Contains(blank)
+ && !string.Equals(blank, Sprache(sprache), StringComparison.OrdinalIgnoreCase)
+ && !string.Equals(blank, sprache?.Trim(), StringComparison.OrdinalIgnoreCase))
+ {
+ teile.Add($"„{blank}“");
+ }
return teile.Count > 0 ? string.Join(" · ", teile) : "Tonspur";
}
diff --git a/server/tests/Flaro.Core.Tests/BenennungTests.cs b/server/tests/Flaro.Core.Tests/BenennungTests.cs
index c336ad6..a18c44e 100644
--- a/server/tests/Flaro.Core.Tests/BenennungTests.cs
+++ b/server/tests/Flaro.Core.Tests/BenennungTests.cs
@@ -83,3 +83,22 @@ public class BenennungTests
public void Die_ganze_Bildspur() =>
Assert.That(Benennung.Bildspur("h264", 1040), Is.EqualTo("1080p · H.264"));
}
+
+/// Nachtrag: Titel, die nichts hinzufügen.
+public class SpurtitelTests
+{
+ /// „Deutsch · AAC · Mono · ‚Deutsch'" sagt dasselbe zweimal.
+ [Test]
+ public void Ein_Titel_der_nur_die_Sprache_wiederholt_faellt_weg()
+ {
+ Assert.That(Benennung.Tonspur("deu", "aac", 1, "Deutsch"),
+ Is.EqualTo("Deutsch · AAC · Mono"));
+ Assert.That(Benennung.Tonspur("deu", "aac", 1, "deu"),
+ Is.EqualTo("Deutsch · AAC · Mono"));
+ }
+
+ [Test]
+ public void Ein_Titel_der_etwas_sagt_bleibt() =>
+ Assert.That(Benennung.Tonspur("deu", "aac", 1, "Audiodeskription"),
+ Is.EqualTo("Deutsch · AAC · Mono · „Audiodeskription“"));
+}
diff --git a/web/app/src/views/detail.ts b/web/app/src/views/detail.ts
index e2a7bf4..2042960 100644
--- a/web/app/src/views/detail.ts
+++ b/web/app/src/views/detail.ts
@@ -260,16 +260,25 @@ export function detailseite(art: Art, id: string, zurueck: () => void): HTMLElem
zeile('Datei', [datei.container?.toUpperCase(), groesse(datei.sizeBytes),
dauer(datei.durationSeconds)].filter(Boolean).join(' · '));
- if (bild) zeile('Video', `${bild.height ? `${bild.height}p` : '—'} (${(bild.codec ?? '?').toUpperCase()})`);
+ // **Auch hier die Formulierung vom Server.** Vorher baute diese Zeile
+ // ihren Text selbst — „240p (H264)" statt „240p · H.264" —, und damit
+ // stand in derselben Tabelle zweierlei Schreibweise untereinander.
+ if (bild) {
+ const v = zeile('Video', spurname(bild));
+ // Die gemessene Höhe gehört in den Tooltip: 1040 ist keine Stufe,
+ // sondern ein beschnittenes Bild.
+ if (bild.width && bild.height) v.title = `${bild.width} × ${bild.height}`;
+ }
if (ton.length) zeile('Ton', ton.map(spurname).join(' · '));
if (text.length) zeile('Untertitel', text.map(spurname).join(' · '));
- function zeile(name: string, wert: string): void {
+ function zeile(name: string, wert: string): HTMLElement {
const dt = document.createElement('dt');
dt.textContent = name;
const dd = document.createElement('dd');
dd.textContent = wert;
liste.append(dt, dd);
+ return dd;
}
return liste;