Kratzplatz, Markenerkennung, Tonabdruck — erfundene Wörter für Fachbegriffe
„Scratch disk" wörtlich zu übersetzen ist derselbe Fehler wie „Wachhund"
für Watchdog und „Keks" für Cookie. Und „Marke" ist kein Fachbegriff für
das, was gemeint ist: Jellyfin nennt diese Abschnitte Media Segments, und
das ist auch das Wort, in dem sich darüber reden lässt.
Kratzplatz* → Transcode* (was es ist, steht in FLARO_TRANSCODE)
Marke, Marken → Segment, Segmente
Markenerkennung → Segmenterkennung
Markenart/-suche → Segmentart/-suche
Tonabdruck → Fingerprint (Chromaprint nennt es so)
Tonabgleich → Fingerprintabgleich
Schlüsselbild → Keyframe
Bildabtaster → Frameabtaster
Gewöhnliches Deutsch bleibt gewöhnliches Deutsch: Wartung, Freigabe,
Meldung, Abspann, Vorspann. Das war nie das Problem.
**Was sich nicht ändert, und zwar mit Absicht.** Die drei
Einstellungsschlüssel `wartung.kratzplatz.paket.*` bleiben, wie sie sind —
sie stehen in der Datenbank, und ein neuer Name hiesse, dass die Werte
des Nutzers stillschweigend auf die Vorgabe zurückfallen. Dasselbe für
die Endpunktpfade `/marken`: sie sind nicht sichtbar, und ein Umbenennen
wäre Diff ohne Gewinn.
**Die Migration ist von Hand geschrieben.** `dotnet ef` hat ein Gerüst
erzeugt, das beide Tabellen löscht und neu anlegt — es sieht eine
verschwundene und eine neue Tabelle, nicht eine umbenannte. Damit wäre
jedes erkannte Segment und jeder Vermerk „hier wurde schon gesucht" weg
gewesen. `RenameTable` und `RenameIndex` tun dasselbe, ohne eine Zeile
anzufassen; nachgemessen an einer echten SQLite-Datei: Zeilen vorher 1
und 1, nachher 1 und 1, Inhalt unverändert.
Nachgezogen: in `bilder.ts` und `main.ts` heisst „marke" ein Häkchen und
das Logo — die blieben unberührt. Und „Segment" ist sächlich, was eine
Blindersetzung nicht weiss: „eine Segment" stand danach an vierzehn
Stellen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
32f592b83e
commit
ed13d5fa43
@@ -28,11 +28,11 @@ public class AbspannkanteTests
|
||||
/// <summary>Eine Reihe von Messpunkten im Abstand von zehn Sekunden.</summary>
|
||||
///
|
||||
/// <param name="abspannAb">Ab wann dunkel. <c>null</c> heisst: nie.</param>
|
||||
private static List<Bildprobe> Reihe(double von, double bis, double? abspannAb)
|
||||
private static List<Frameprobe> Reihe(double von, double bis, double? abspannAb)
|
||||
{
|
||||
var proben = new List<Bildprobe>();
|
||||
var proben = new List<Frameprobe>();
|
||||
for (var t = von; t <= bis; t += 10)
|
||||
proben.Add(new Bildprobe(t, abspannAb is { } ab && t >= ab ? 85 : 0));
|
||||
proben.Add(new Frameprobe(t, abspannAb is { } ab && t >= ab ? 85 : 0));
|
||||
return proben;
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ public class AbspannkanteTests
|
||||
/// <summary>Eine Szene nach dem Abspann nimmt den Fund weg.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// Lieber keine Marke als eine, die über die Szene hinwegspringt.
|
||||
/// Lieber kein Segment als eine, die über die Szene hinwegspringt.
|
||||
/// </remarks>
|
||||
[Test]
|
||||
public void Eine_Szene_nach_dem_Abspann_nimmt_den_Fund_weg()
|
||||
@@ -223,14 +223,14 @@ public class AbspannAnteilTests
|
||||
///
|
||||
/// <remarks>
|
||||
/// Zwanzig Minuten vor dem Ende einer Folge von fünfundvierzig, an den
|
||||
/// Schlüsselbildern abgetastet — also alle fünf Sekunden eine Probe.
|
||||
/// Keyframesn abgetastet — also alle fünf Sekunden eine Probe.
|
||||
/// </remarks>
|
||||
private static List<Bildprobe> Fenster(
|
||||
private static List<Frameprobe> Fenster(
|
||||
double abspannAb, double imAbspann, double imInhalt = 0)
|
||||
{
|
||||
var proben = new List<Bildprobe>();
|
||||
var proben = new List<Frameprobe>();
|
||||
for (var t = 1500.0; t <= 2700; t += 5)
|
||||
proben.Add(new Bildprobe(t, t < abspannAb ? imInhalt : imAbspann));
|
||||
proben.Add(new Frameprobe(t, t < abspannAb ? imInhalt : imAbspann));
|
||||
return proben;
|
||||
}
|
||||
|
||||
@@ -300,13 +300,13 @@ public class AbspannSchlusstafelTests
|
||||
private static double? Anfang(IReadOnlyList<Abspannstück> stücke) =>
|
||||
stücke.Count == 0 ? null : stücke[0].Von;
|
||||
|
||||
private static List<Bildprobe> Fenster(double abspannAb, double tafelAb = double.MaxValue)
|
||||
private static List<Frameprobe> Fenster(double abspannAb, double tafelAb = double.MaxValue)
|
||||
{
|
||||
var proben = new List<Bildprobe>();
|
||||
var proben = new List<Frameprobe>();
|
||||
for (var t = 1500.0; t <= 2700; t += 5)
|
||||
{
|
||||
var dunkel = t >= tafelAb ? 0 : t < abspannAb ? 0 : 85;
|
||||
proben.Add(new Bildprobe(t, dunkel));
|
||||
proben.Add(new Frameprobe(t, dunkel));
|
||||
}
|
||||
return proben;
|
||||
}
|
||||
@@ -336,20 +336,20 @@ public class AbspannSchlusstafelTests
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Dieselbe Szene, zweierlei Schlüsselbilddichte.</summary>
|
||||
/// <summary>Dieselbe Szene, zweierlei Keyframedichte.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// <b>Der Fehler, für den diese Prüfungen stehen.</b> Die Nachsicht
|
||||
/// gegenüber hellen Stellen mitten im Abspann war in <i>Proben</i>
|
||||
/// angegeben, nicht in Sekunden. Was das bedeutet, hängt allein daran,
|
||||
/// wie dicht eine Datei ihre Schlüsselbilder setzt — und das schwankt um
|
||||
/// wie dicht eine Datei ihre Keyframes setzt — und das schwankt um
|
||||
/// eine Zehnerpotenz.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// Gemessen am Bestand: „(T)Raumschiff Surprise" liefert 1318 Proben auf
|
||||
/// zwanzig Minuten, also eine alle 0,9 Sekunden. Zwei Proben Nachsicht
|
||||
/// waren dort 1,8 Sekunden; bei einer Datei mit einem Schlüsselbild alle
|
||||
/// waren dort 1,8 Sekunden; bei einer Datei mit einem Keyframe alle
|
||||
/// zehn Sekunden waren dieselben zwei Proben zwanzig Sekunden. Ein
|
||||
/// fünfsekündiges Logo mitten im Abspann zerriss die Strecke deshalb nur
|
||||
/// bei der dicht abgetasteten Datei — und genau die fiel durch.
|
||||
@@ -370,13 +370,13 @@ public class AbspannNachsichtTests
|
||||
stücke.Count == 0 ? null : stücke[0].Von;
|
||||
|
||||
/// <summary>Abspann ab 2340 s, darin fünf Sekunden helles Logo.</summary>
|
||||
private static List<Bildprobe> Fenster(double takt)
|
||||
private static List<Frameprobe> Fenster(double takt)
|
||||
{
|
||||
var proben = new List<Bildprobe>();
|
||||
var proben = new List<Frameprobe>();
|
||||
for (var t = 1500.0; t <= 2700; t += takt)
|
||||
{
|
||||
var imLogo = t >= 2500 && t < 2505;
|
||||
proben.Add(new Bildprobe(t, t < 2340 ? 0 : imLogo ? 5 : 85));
|
||||
proben.Add(new Frameprobe(t, t < 2340 ? 0 : imLogo ? 5 : 85));
|
||||
}
|
||||
return proben;
|
||||
}
|
||||
@@ -408,12 +408,12 @@ public class AbspannNachsichtTests
|
||||
[Test]
|
||||
public void Eine_Minute_hell_mittendrin_teilt_den_Abspann_in_zwei_Stuecke()
|
||||
{
|
||||
var proben = new List<Bildprobe>();
|
||||
var proben = new List<Frameprobe>();
|
||||
for (var t = 1500.0; t <= 2700; t += 1)
|
||||
{
|
||||
// Dunkel ab 2340, aber von 2400 bis 2460 eine Minute hell.
|
||||
var hell = t < 2340 || (t >= 2400 && t < 2460);
|
||||
proben.Add(new Bildprobe(t, hell ? 0 : 85));
|
||||
proben.Add(new Frameprobe(t, hell ? 0 : 85));
|
||||
}
|
||||
|
||||
var stücke = Abspannkante.Suchen(proben, Regeln);
|
||||
@@ -433,15 +433,15 @@ public class AbspannNachsichtTests
|
||||
[Test]
|
||||
public void Der_Grund_wird_benannt()
|
||||
{
|
||||
var hell = new List<Bildprobe>();
|
||||
for (var t = 1500.0; t <= 2700; t += 5) hell.Add(new Bildprobe(t, 0));
|
||||
var hell = new List<Frameprobe>();
|
||||
for (var t = 1500.0; t <= 2700; t += 5) hell.Add(new Frameprobe(t, 0));
|
||||
|
||||
Abspannkante.Suchen(hell, Regeln, out var grund);
|
||||
Assert.That(grund, Does.Contain("keine dunkle Strecke"));
|
||||
|
||||
var kurz = new List<Bildprobe>();
|
||||
var kurz = new List<Frameprobe>();
|
||||
for (var t = 1500.0; t <= 2700; t += 5)
|
||||
kurz.Add(new Bildprobe(t, t < 2680 ? 0 : 85));
|
||||
kurz.Add(new Frameprobe(t, t < 2680 ? 0 : 85));
|
||||
|
||||
Abspannkante.Suchen(kurz, Regeln, out var zuKurz);
|
||||
Assert.That(zuKurz, Does.Contain("zusammen nur"));
|
||||
@@ -469,13 +469,13 @@ public class AbspannstueckeTests
|
||||
private static readonly Abspannregeln Regeln = Abspannregeln.Vorgabe;
|
||||
|
||||
/// <summary>Eine Reihe im Sekundentakt, dunkel in den angegebenen Spannen.</summary>
|
||||
private static List<Bildprobe> Reihe(double bis, params (double Von, double Bis)[] dunkel)
|
||||
private static List<Frameprobe> Reihe(double bis, params (double Von, double Bis)[] dunkel)
|
||||
{
|
||||
var proben = new List<Bildprobe>();
|
||||
var proben = new List<Frameprobe>();
|
||||
for (var t = 0.0; t <= bis; t += 1)
|
||||
{
|
||||
var istDunkel = Array.Exists(dunkel, d => t >= d.Von && t < d.Bis);
|
||||
proben.Add(new Bildprobe(t, istDunkel ? 85 : 0));
|
||||
proben.Add(new Frameprobe(t, istDunkel ? 85 : 0));
|
||||
}
|
||||
return proben;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user