Skip to content

Sprache der Tonspur als eigenes Feld in der Filmliste - #1174

Open
CuriousApe2020 wants to merge 1 commit into
mediathekview:developfrom
CuriousApe2020:feature/film-language
Open

CuriousApe2020 wants to merge 1 commit into
mediathekview:developfrom
CuriousApe2020:feature/film-language

Conversation

@CuriousApe2020

@CuriousApe2020 CuriousApe2020 commented Sep 17, 2026 •

Copy link
Copy Markdown

Die Sprache einer Tonspur liegt beim Crawlen teilweise vor, geht beim Erzeugen des Filmliste-Eintrags aber verloren: kodiert wird nur der deutsche Titelzusatz "(Originalversion)", der die Sprache nicht nennt. Clients können sie danach nicht mehr rekonstruieren.

Neu ist Film.audioLanguage (ISO 639-2/T, null wenn unbekannt).

Woher die Sprache kommt:

  • Die ARD liefert je Tonspur einen Sprachcode in audio[0].languageCode. Die Streamauswahl probiert davon allerdings nur die fest verdrahteten Codes "deu", "eng" und "fra" durch; alles andere fällt in den Platzhalter "*".
  • Für "eng" und "fra" steht der Code damit ohnehin fest.
  • Für den Platzhalterzweig wird er mit parseAudioLanguageCode aus den Daten gelesen statt aus dem zutreffenden Filter abgeleitet. Damit behält auch eine Originalversion in einer anderen Sprache - spanisch, polnisch, türkisch - ihre Sprache, ohne dass dafür je Sprache eine weitere Konstante nötig wäre.
  • normalizeLanguageCode sichert die zugesagte Form: eine etwaige Regionsangabe wird abgeschnitten ("spa-ES" wird zu "spa"), alles was danach kein dreistelliger Buchstabencode ist - ARDs Platzhalter "ov", Leerwerte - ergibt nichts. Lieber kein Wert als einer, auf den sich Clients nicht verlassen können.
  • Nur die Originalfassung trägt die Sprache. Die Hauptfassung bleibt leer: sie ist die übliche Fassung des Senders, und ein Wert auf jedem Datensatz würde die Filmliste unnötig aufblähen.

Film.merge übernimmt eine bekannte Sprache, wenn der eigene Stand keine hat. Sonst ginge sie verloren, sobald eine ältere importierte Filmliste ohne das Feld mit einem frischen Crawl zusammengeführt wird.

Serialisierung:

  • Neues Format: Gson serialisiert den Objektgraphen per Reflection, das Feld erscheint automatisch als benannter Schlüssel; FilmlistReader liest es symmetrisch wieder ein.
  • Altes Format: hinten angefügte Spalte "Sprache" als einfacher String. Bewusst kein Array - der Desktop-Client prüft beim Weiterlesen mit isExpectedStartArrayToken(), ob der nächste Token ein Datensatz ist; ein angehängtes Array würde dort als Filmdatensatz interpretiert.

Rückwärtskompatibilität:

  • MediathekView Desktop 14.0.0 bis 14.5.0 liest je Datensatz genau 20 Felder und sucht danach den nächsten START_ARRAY. Ein angehängtes Feld fällt durch diese Prüfung und wird übersprungen - keine Exception, kein Versatz. Die Spaltenkopfzeile wertet der Client gar nicht aus (skipFieldDescriptions).
  • MediathekViewWeb destrukturiert positionsbasiert bis Index 16 und ignoriert weitere Felder.
  • FilmlistOldFormatReader liest die neue Spalte optional: Filmlisten älterer Stände ohne die Spalte werden weiterhin gelesen.

Außerdem: FilmlistOldFormatWriterTest las die vom Writer als UTF-8 geschriebene Datei mit StandardCharsets.UTF_16 ein. Das lief nur durch, solange die Dateilänge zufällig gerade war; durch die zusätzliche Spalte wurde sie ungerade und readString warf eine MalformedInputException. Korrigiert auf UTF-8, passend zum Writer.

Tests: Round-Trip durch beide Formate, eine Filmliste ohne die neue Spalte, eine spanische Originalversion, ein Code mit Regionsangabe, die Gegenprobe mit ARDs Platzhalter "ov", das Verhalten von merge, sowie ein Beitrag mit deutscher und englischer Tonspur - dort darf die Hauptfassung die Sprache der Originalversion nicht erben.

Die Sprache einer Tonspur liegt beim Crawlen teilweise vor, geht beim
Erzeugen des Filmliste-Eintrags aber verloren: kodiert wird nur der
deutsche Titelzusatz "(Originalversion)", der die Sprache nicht nennt.
Clients koennen sie danach nicht mehr rekonstruieren.

Neu ist Film.audioLanguage (ISO 639-2/T, null wenn unbekannt).

Woher die Sprache kommt:

* Die ARD liefert je Tonspur einen Sprachcode in audio[0].languageCode.
  Die Streamauswahl probiert davon allerdings nur die fest verdrahteten
  Codes "deu", "eng" und "fra" durch; alles andere faellt in den
  Platzhalter "*".
* Fuer "eng" und "fra" steht der Code damit ohnehin fest.
* Fuer den Platzhalterzweig wird er mit parseAudioLanguageCode aus den
  Daten gelesen statt aus dem zutreffenden Filter abgeleitet. Damit
  behaelt auch eine Originalversion in einer anderen Sprache - spanisch,
  polnisch, tuerkisch - ihre Sprache, ohne dass dafuer je Sprache eine
  weitere Konstante noetig waere.
* normalizeLanguageCode sichert die zugesagte Form: eine etwaige
  Regionsangabe wird abgeschnitten ("spa-ES" wird zu "spa"), alles was
  danach kein dreistelliger Buchstabencode ist - ARDs Platzhalter "ov",
  Leerwerte - ergibt nichts. Lieber kein Wert als einer, auf den sich
  Clients nicht verlassen koennen.
* Nur die Originalfassung traegt die Sprache. Die Hauptfassung bleibt
  leer: sie ist die uebliche Fassung des Senders, und ein Wert auf jedem
  Datensatz wuerde die Filmliste unnoetig aufblaehen.

Film.merge uebernimmt eine bekannte Sprache, wenn der eigene Stand keine
hat. Sonst ginge sie verloren, sobald eine aeltere importierte Filmliste
ohne das Feld mit einem frischen Crawl zusammengefuehrt wird.

Serialisierung:

* Neues Format: Gson serialisiert den Objektgraphen per Reflection, das
  Feld erscheint automatisch als benannter Schluessel; FilmlistReader
  liest es symmetrisch wieder ein.
* Altes Format: hinten angefuegte Spalte "Sprache" als einfacher String.
  Bewusst kein Array - der Desktop-Client prueft beim Weiterlesen mit
  isExpectedStartArrayToken(), ob der naechste Token ein Datensatz ist;
  ein angehaengtes Array wuerde dort als Filmdatensatz interpretiert.

Rueckwaertskompatibilitaet:

* MediathekView Desktop 14.0.0 bis 14.5.0 liest je Datensatz genau 20
  Felder und sucht danach den naechsten START_ARRAY. Ein angehaengtes
  Feld faellt durch diese Pruefung und wird uebersprungen - keine
  Exception, kein Versatz. Die Spaltenkopfzeile wertet der Client gar
  nicht aus (skipFieldDescriptions).
* MediathekViewWeb destrukturiert positionsbasiert bis Index 16 und
  ignoriert weitere Felder.
* FilmlistOldFormatReader liest die neue Spalte optional: Filmlisten
  aelterer Staende ohne die Spalte werden weiterhin gelesen.

Ausserdem: FilmlistOldFormatWriterTest las die vom Writer als UTF-8
geschriebene Datei mit StandardCharsets.UTF_16 ein. Das lief nur durch,
solange die Dateilaenge zufaellig gerade war; durch die zusaetzliche
Spalte wurde sie ungerade und readString warf eine
MalformedInputException. Korrigiert auf UTF-8, passend zum Writer.

Tests: Round-Trip durch beide Formate, eine Filmliste ohne die neue
Spalte, eine spanische Originalversion, ein Code mit Regionsangabe, die
Gegenprobe mit ARDs Platzhalter "ov", das Verhalten von merge, sowie ein
Beitrag mit deutscher und englischer Tonspur - dort darf die Hauptfassung
die Sprache der Originalversion nicht erben.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant