diff --git a/Flaro/Views/Player/PlayerModel.swift b/Flaro/Views/Player/PlayerModel.swift index b46327b..19e6302 100644 --- a/Flaro/Views/Player/PlayerModel.swift +++ b/Flaro/Views/Player/PlayerModel.swift @@ -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.