Feature/arte film language - #1176
Open
CuriousApe2020 wants to merge 3 commits into
Open
CuriousApe2020 wants to merge 3 commits into
CuriousApe2020 wants to merge 3 commits into
Conversation
added 2 commits
September 17, 2026 16:39
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.
Baut auf dem ARD-Teil auf und fuellt dasselbe Feld Film.audioLanguage
fuer das ZDF.
Das ZDF fuehrt die Downloads ohnehin je Sprache (DownloadDto haelt sie
als Map Sprache auf Aufloesung auf URL) und erzeugt daraus je Sprache
einen eigenen Film. Den Code kennt es dabei bereits in der Form, die das
Feld zusichert - ZdfConstants fuehrt LANGUAGE_ENGLISH als "eng" und
LANGUAGE_FRENCH als "fra". Verwendet wurde er bisher aber nur, um einen
deutschen Titelzusatz zu bilden:
case ZdfConstants.LANGUAGE_ENGLISH: title += " (Englisch)";
Danach war der Code nicht mehr vorhanden. Er wird jetzt an derselben
Stelle zusaetzlich als Feld gesetzt - in ZdfFilmDetailTask und
ZdfFilmTask, die beide dieselbe clone/updateTitle-Paarung haben.
Passend zum ARD-Teil bleibt die deutsche Fassung leer: sie ist die
uebliche Fassung des Senders, und ein Wert auf jedem Datensatz wuerde die
Filmliste unnoetig aufblaehen. Das entspricht dem Titel, der fuer sie
ebenfalls unveraendert bleibt.
Die Suffixe "-ad" und "-dgs", die das ZDF an den Sprachcode haengt, um
Audiodeskription und Gebaerdensprache zu unterscheiden, werden
abgeschnitten: sie benennen die Art der Tonspur, nicht ihre Sprache.
Damit sind auch 3sat und phoenix abgedeckt, die dieselbe Infrastruktur
nutzen.
Test: englische Fassung behaelt "eng", die deutsche bleibt leer - am
vorhandenen Fixture fuer mehrsprachige Beitraege.
CuriousApe2020
force-pushed
the
feature/arte-film-language
branch
from
September 17, 2026 22:27
e32e2d3 to
49bb9f9
Compare
Baut auf dem ARD-Teil auf und fuellt dasselbe Feld Film.audioLanguage
fuer arte.
arte liefert die Sprache je Tonspur im Listing unter
videos[].versions[].audioLanguage. Ausgewertet wurde davon bisher nur der
danebenstehende audioCode, um den Videotyp zu bestimmen; die Sprache
blieb ungenutzt und war im Filmliste-Eintrag nur noch als Titelzusatz
"(Originalversion)" sichtbar, der sie nicht benennt.
ArteVideoInfoDeserializer liest den versions-Block jetzt als Zuordnung
Versionscode auf Sprachcode, ArteVideoInfoDto haelt sie, und
ArteDtoVideo2FilmTask setzt sie auf den Originalversions-Film - passend
zum ARD-Teil traegt nur die Originalfassung die Sprache. Belegt an den
vorhandenen Fixtures: VOA auf "de", VF-STF auf "fr", VE[ESP] auf "es".
Fuer die reine Originalfassung (Code "VO") reicht dieser Block nicht:
arte zeichnet sie dort mit "und" aus, eine mehrsprachige Fassung ("VOEU")
mit "mul". Dafuer wird zusaetzlich videos[].originalLanguage gelesen, das
MServer bisher gar nicht ausgewertet hat - bei einer Originalfassung ist
die Sprache des Originals genau die der Tonspur. Fuer die
synchronisierte Fassung waere derselbe Wert falsch: in arte_videos_1.json
steht dort "fr" bei mainAudioVersion "VA", also bei der deutschen Fassung
eines franzoesischen Films. Deshalb wird resolveAudioLanguage nur fuer
die Originalversionen aufgerufen.
Das erklaert auch den Befund zu "VO": in allen Fixtures, deren
mainAudioVersion "VO" ist, fuehrt originalLanguage entweder den arte-Code
MUS ("musikalisch", leerer ISO-Code) oder null. "VO" ist dort der Marker
fuer Beitraege ohne Dialog, "und" also richtig und nicht lueckenhaft;
fremdsprachige Originale laufen ueber VOF-STA, VOA-STF und VO-STE[...]
und tragen einen echten Code. Wo arte selbst nichts benennt, bleibt das
Feld leer - zu raten waere schlechter, als nichts zu sagen.
Nicht am Streams-Endpunkt angesetzt: dessen Antwort (videoStreams, siehe
ArteVideoLinkDeserializer) fuehrt zwar audioCode und audioLabel, aber
kein audioLanguage. Das Label hilft dort ebenfalls nicht weiter - bei
"VO-STE[ANG]" lautet es "Originalfassung - UT Englisch", die genannte
Sprache ist also die der Untertitel, nicht die der Tonspur.
Ausserdem neu: LanguageCodeUtils als gemeinsame Stelle fuer die
Normalisierung. Die Sender sind darin uneinheitlich - die ARD schreibt
dreistellig ("deu"), arte zweistellig ("de") -, und beide verwenden
Platzhalter, die keine Sprache benennen ("ov" bei der ARD, "und" und
"mul" bei arte). Die zuvor im ArdFilmDeserializer private Normalisierung
ist dorthin gewandert; die Zuordnung zweistellig auf dreistellig steht
als Tabelle da und nicht ueber Locale, weil dessen Sprachdaten unter
Linux an ICU haengen und nicht auf jedem Host vollstaendig vorliegen.
Tests: Auslesen des versions-Blocks am echten Fixture inklusive der
Platzhalter, der Rueckgriff auf originalLanguage ("fr" auf "fra") samt
Gegenprobe mit dem leeren ISO-Code von MUS, sowie die Normalisierung
ueber beide Schreibweisen, Grossschreibung, Regionsangaben und
unbrauchbare Werte.
CuriousApe2020
force-pushed
the
feature/arte-film-language
branch
from
September 17, 2026 22:54
49bb9f9 to
b020e08
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Baut auf #1174 und dem ZDF-Teil (#1175) auf und füllt dasselbe Feld Film.audioLanguage für arte. Solange die beiden nicht gemergt sind, zeigt der Diff gegen develop deren Commits mit; der eigentliche Inhalt hier sind 7 Dateien.
arte liefert die Sprache je Tonspur im Listing unter videos[].versions[].audioLanguage. Ausgewertet wurde davon bisher nur der danebenstehende audioCode, um den Videotyp zu bestimmen; die Sprache blieb ungenutzt und war im Filmliste-Eintrag nur noch als Titelzusatz "(Originalversion)" sichtbar, der sie nicht benennt.
ArteVideoInfoDeserializer liest den versions-Block jetzt als Zuordnung Versionscode auf Sprachcode, ArteVideoInfoDto hält sie, und ArteDtoVideo2FilmTask setzt sie auf den Originalversions-Film - passend zum ARD- und ZDF-Teil trägt nur die Originalfassung die Sprache.
Belegt an den vorhandenen Fixtures:
Der Fall "VO"
Für die reine Originalfassung reicht der versions-Block nicht: arte zeichnet sie dort mit "und" aus, eine mehrsprachige Fassung mit "mul". Dafür wird zusätzlich
videos[].originalLanguagegelesen - ein Block, den MServer bisher an keiner Stelle auswertet:Bei einer Originalfassung ist die Sprache des Originals genau die der Tonspur. Für die synchronisierte Fassung wäre derselbe Wert falsch -
arte_videos_1.jsonführt dort "fr" bei mainAudioVersion "VA", also bei der deutschen Fassung eines französischen Films. Deshalb wird die Auflösung nur für die Originalversionen aufgerufen, nie für den Standardfilm.Was dabei herauskommt, korrigiert eine Annahme, die ich in #1172 noch hatte. In allen Fixtures, deren mainAudioVersion "VO" ist, führt originalLanguage entweder den arte-Code MUS mit leerem iso6391Code oder gar nichts:
"VO" ist bei ARTE.DE also der Marker für Beiträge ohne Dialog - Konzerte, Musik. Damit ist "und" dort richtig und kein Datenverlust. Fremdsprachige Originale laufen nicht über VO, sondern über VOF-STA, VOA-STF und VO-STE[...], und die tragen im versions-Block einen echten Code.
Der Rückgriff bleibt trotzdem drin: er ist die semantisch richtige Quelle für diesen Fall, und wo arte das Original benennt, greift er. Wo arte selbst nichts sagt, bleibt das Feld leer - zu raten wäre schlechter, als nichts zu sagen.
Nicht am Streams-Endpunkt angesetzt
Dessen Antwort (videoStreams, siehe ArteVideoLinkDeserializer) führt zwar audioCode und audioLabel, aber kein audioLanguage. Das Label hilft dort ebenfalls nicht weiter - bei "VO-STE[ANG]" lautet es "Originalfassung - UT Englisch", die genannte Sprache ist also die der Untertitel, nicht die der Tonspur.
LanguageCodeUtils
Außerdem neu als gemeinsame Stelle für die Normalisierung. Die Sender sind darin uneinheitlich - die ARD schreibt dreistellig ("deu"), arte zweistellig ("de") -, und beide verwenden Platzhalter, die keine Sprache benennen ("ov" bei der ARD, "und" und "mul" bei arte). Die zuvor im ArdFilmDeserializer private Normalisierung ist dorthin gewandert. Die Zuordnung zweistellig auf dreistellig steht als Tabelle da und nicht über Locale, weil dessen Sprachdaten unter Linux an ICU hängen und nicht auf jedem Host vollständig vorliegen.
Tests