From c05004f5860378791c3faa1ee53d2221324c950e Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Sun, 11 Oct 2026 13:58:44 +0200 Subject: [PATCH] =?UTF-8?q?Untertitel=20kamen=20an,=20der=20Ton=20nicht=20?= =?UTF-8?q?=E2=80=94=20sie=20sahen=20woanders=20nach?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Vorwahl auf der Filmseite legt beides unter der Kennung des Films ab. Beim Untertitel habe ich das beim Lesen berücksichtigt, beim Ton nicht: dort stand `item.seriesID`, und die ist bei einem Film nichts. Die Einstellung wurde gespeichert und nie wieder gelesen. Jetzt gibt es eine Stelle, die sagt, wo die Vorwahl eines Titels liegt: bei einer Folge die Serie, bei einem Film er selbst. Beides ist dieselbe Frage auf der Ebene, die der Benutzer vor sich hatte, als er sie beantwortet hat. Dasselbe betraf das Merken einer von Hand gewählten Spur und die Anzeige im Spurenblatt: bei einem Film merkte sich der Spieler nichts, weil die Kennung fehlte. Jetzt lesen alle vier Stellen dieselbe. Co-Authored-By: Claude Opus 5 --- Flaro/Views/Player/PlayerModel.swift | 36 ++++++++++++++++++---------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/Flaro/Views/Player/PlayerModel.swift b/Flaro/Views/Player/PlayerModel.swift index 7b3a4c2..d5a8bde 100644 --- a/Flaro/Views/Player/PlayerModel.swift +++ b/Flaro/Views/Player/PlayerModel.swift @@ -2127,7 +2127,7 @@ final class PlayerModel { // alles andere auch einzuschalten. Bei einer Folge gilt die Serie, // bei einem Film der Titel selbst. guard selectedSubtitleTrack == nil, - let wunsch = languages.subtitleWish(titleID: item?.seriesID ?? item?.id), + let wunsch = languages.subtitleWish(titleID: titelbereich), let treffer = subtitleTracks.first(where: { LanguageCode.matches(wunsch, $0.languageCode) }) @@ -2147,6 +2147,14 @@ final class PlayerModel { /// Netz und ohne Einstellungen, damit sich der ZDF-Fall wörtlich /// hinschreiben und durchspielen lässt. Hier steht nur, woher der Wunsch /// kommt. + /// Unter welcher Kennung die Vorwahl dieses Titels liegt. + /// + /// **Bei einer Folge die Serie, bei einem Film er selbst.** „Diese Serie + /// auf Japanisch" gilt für alle Folgen; „dieser Film auf Englisch" gilt + /// für ihn. Beides ist dieselbe Frage auf der Ebene, die der Benutzer + /// vor sich hatte, als er sie beantwortet hat. + private var titelbereich: String? { item?.seriesID ?? item?.id } + private func chooseAudioStream( in part: MediaFile, of item: MediaItem, @@ -2156,10 +2164,9 @@ final class PlayerModel { subtitleStreams = part.subtitleStreams // Untertitel sind eine Zutat, keine Voraussetzung: der Wunsch gilt, // wenn es einen passenden gibt, und sonst bleibt es ohne. - selectedSubtitleStream = languages.subtitleLanguage.isEmpty ? nil - : subtitleStreams.first { - LanguageCode.matches(languages.subtitleLanguage, $0.languageCode) - } + selectedSubtitleStream = languages.subtitleWish(titleID: titelbereich).flatMap { wunsch in + subtitleStreams.first { LanguageCode.matches(wunsch, $0.languageCode) } + } guard !audioStreams.isEmpty else { selectedAudioStream = nil @@ -2175,7 +2182,12 @@ final class PlayerModel { selectedAudioStream = AudioTrackChooser.choose( from: part.streams, - wish: languages.wish(seriesID: item.seriesID, libraryID: libraryID) + // **Bei einem Film seine eigene Kennung.** Hier stand nur + // `item.seriesID`, und die ist bei einem Film nichts: die + // Vorwahl auf der Filmseite wurde abgelegt und nie wieder + // gelesen. Untertitel gingen durch, Ton nicht — weil die beiden + // an verschiedenen Stellen nachsehen. + wish: languages.wish(seriesID: titelbereich, libraryID: libraryID) ) if let gewählt = selectedAudioStream { @@ -2195,8 +2207,8 @@ final class PlayerModel { guard stream != selectedAudioStream else { return } selectedAudioStream = stream - if let seriesID = item?.seriesID { - languages.remember(stream, forSeries: seriesID) + if let bereich = titelbereich { + languages.remember(stream, forSeries: bereich) } // **Der billige Weg, wenn er offensteht.** Wird die Datei unverändert @@ -2244,16 +2256,16 @@ final class PlayerModel { /// Was für diese Serie gemerkt ist — für die Anzeige im Spurenblatt. var rememberedTrackName: String? { - guard let seriesID = item?.seriesID, - let signatur = languages.rememberedTrack(forSeries: seriesID) + guard let bereich = titelbereich, + let signatur = languages.rememberedTrack(forSeries: bereich) else { return nil } return signatur.title ?? signatur.languageCode } /// Vergisst die gemerkte Spur dieser Serie. func forgetRememberedTrack() { - guard let seriesID = item?.seriesID else { return } - languages.forgetTrack(forSeries: seriesID) + guard let bereich = titelbereich else { return } + languages.forgetTrack(forSeries: bereich) } private func playerSubtitle(for item: MediaItem) -> String? {