Deutsch gewählt, Englisch gesehen
„Die erste ist die richtige" stand hier, und es stimmte — solange der Server genau eine Textspur auslieferte, nämlich die bestellte. Seit die Wiedergabe über einen Strom läuft, stehen alle Spuren in der Abspielliste, und dann ist die erste schlicht die erste. Gesucht wird jetzt die Spur, die zur Bestellung passt: erst über das Sprachkürzel — `ger`, `deu` und `de` meinen dasselbe, dafür gibt es `LanguageCode` längst —, bei gleicher Sprache über das Merkmal „erzwungen", und zuletzt über den Namen. Findet sich keine, bleibt es bei der ersten: bei einem umgerechneten Strom gibt es nur sie, und gar kein Untertitel wäre schlechter als der eine. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
5657cd9e4b
commit
fa31adf3d1
@@ -2062,14 +2062,52 @@ final class PlayerModel {
|
||||
/// Einstellungen eine Untertitelsprache steht. Wer keine eingestellt
|
||||
/// hatte, schaltete die Untertitel ein und sah nichts.
|
||||
///
|
||||
/// **Die erste ist die richtige.** Rechnet der Server um, liegt genau
|
||||
/// eine im Stream — nämlich die bestellte. Es gibt nichts zu verwechseln.
|
||||
/// **Die erste ist nicht mehr die richtige.**
|
||||
///
|
||||
/// Das galt, solange der Server genau eine Spur auslieferte — die
|
||||
/// bestellte. Flaro legt seit dem Strom **alle** Textspuren als eigene
|
||||
/// Spuren in die Abspielliste, und dann ist die erste schlicht die
|
||||
/// erste: wer Deutsch wählte, sah Englisch.
|
||||
///
|
||||
/// Gesucht wird deshalb die Spur, die zur Bestellung passt — erst über
|
||||
/// das Sprachkürzel, dann über den Namen. Findet sich keine, bleibt es
|
||||
/// bei der ersten: bei einem umgerechneten Strom gibt es nur sie, und
|
||||
/// gar keinen Untertitel zu zeigen wäre schlechter als den einen.
|
||||
private func showOrderedSubtitle() {
|
||||
guard selectedSubtitleStream != nil, selectedSubtitleTrack == nil else { return }
|
||||
guard let erste = subtitleTracks.first else { return }
|
||||
guard let bestellt = selectedSubtitleStream, selectedSubtitleTrack == nil else { return }
|
||||
guard let treffer = passendeSpur(zu: bestellt) ?? subtitleTracks.first else { return }
|
||||
|
||||
diagnostics.note("Untertitel eingeschaltet: \(erste.displayName)")
|
||||
selectSubtitleTrack(erste)
|
||||
diagnostics.note("Untertitel eingeschaltet: \(treffer.displayName)")
|
||||
selectSubtitleTrack(treffer)
|
||||
}
|
||||
|
||||
/// Die Spur im Strom, die zu der bestellten aus den Metadaten gehört.
|
||||
private func passendeSpur(zu bestellt: MediaStream) -> MediaTrack? {
|
||||
// **Die Sprache zuerst.** Sie steht in der Abspielliste als
|
||||
// `LANGUAGE` und ist das, was ein Spieler verlässlich durchreicht.
|
||||
if let code = bestellt.languageCode ?? bestellt.language,
|
||||
let treffer = subtitleTracks.first(where: {
|
||||
LanguageCode.matches(code, $0.languageCode)
|
||||
&& $0.isForced == bestellt.isForced
|
||||
})
|
||||
{
|
||||
return treffer
|
||||
}
|
||||
|
||||
// **Dann der Name.** Zwei Spuren in derselben Sprache — Dialoge und
|
||||
// Schilder etwa — unterscheiden sich nur darüber.
|
||||
if let name = bestellt.displayTitle,
|
||||
let treffer = subtitleTracks.first(where: { $0.displayName == name })
|
||||
{
|
||||
return treffer
|
||||
}
|
||||
|
||||
// Ohne Sprachkürzel bleibt die Sprache allein.
|
||||
if let code = bestellt.languageCode ?? bestellt.language {
|
||||
return subtitleTracks.first { LanguageCode.matches(code, $0.languageCode) }
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
/// Wählt die Untertitelspur, sofern eine gewünscht ist.
|
||||
|
||||
Reference in New Issue
Block a user