Untertitel werden auch gezeigt, und die Stelle geht nicht mehr verloren

Zwei Fehler, die beide beim Umstellen im laufenden Film auftraten.

Der Server lieferte den gewaehlten Untertitel brav mit — nur sagte danach
niemand dem Player, dass er ihn **zeigen** soll. Gewaehlt wurde allein in
`applyPreferredLanguages()`, und das greift nur, wenn in den Einstellungen
eine Untertitelsprache steht. Wer keine eingestellt hatte, schaltete die
Untertitel ein und sah nichts. Jetzt wird die bestellte Spur nach dem
Neuaufbau angezeigt; bei einem umgerechneten Stream liegt genau eine drin,
naemlich die bestellte, also gibt es nichts zu verwechseln.

Und der Sprung an den Filmanfang, der „teilweise\" passierte: ein frisch
geoeffneter Stream meldet erst einmal null, eins, zwei — er springt erst
danach an die gemerkte Stelle. Wer in diesem Augenblick `currentTime`
liest, liest zwei Sekunden statt einundzwanzig Minuten. Genau das tut ein
zweiter Neuaufbau, wenn man zuegig noch etwas umstellt: er merkt sich die
falsche Stelle. Daher trat es nicht immer auf, sondern nur manchmal.

Waehrend auf die gemerkte Stelle gewartet wird, gelten die Meldungen des
anlaufenden Streams jetzt nicht mehr — dasselbe Prinzip wie beim Spulen,
wo die Nachzuegler der alten Stelle verworfen werden.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-28 21:30:26 +02:00
co-authored by Claude Opus 5
parent 0815432efd
commit 88ba1a540c
+31
View File
@@ -1594,6 +1594,16 @@ final class PlayerModel {
guard abs((time - ziel).seconds) < 1.5 else { break } guard abs((time - ziel).seconds) < 1.5 else { break }
seekTarget = nil seekTarget = nil
} }
// **Und dasselbe beim Neuaufbau.**
//
// Ein frisch geöffneter Stream meldet erst einmal null,
// eins, zwei — er springt erst danach an die gemerkte
// Stelle. Wer in diesem Augenblick `currentTime` liest,
// liest zwei Sekunden statt einundzwanzig Minuten. Und
// genau das tut ein **zweiter** Neuaufbau, wenn man zügig
// noch etwas umstellt: er merkt sich die falsche Stelle
// und landet am Filmanfang. Daher „teilweise".
if let ziel = resumeTarget, time + .seconds(2) < ziel { break }
currentTime = time currentTime = time
// Gedrosselt in `NowPlaying`: zwischen zwei Meldungen // Gedrosselt in `NowPlaying`: zwischen zwei Meldungen
// zählt das System selbst weiter, es kennt das Tempo. // zählt das System selbst weiter, es kennt das Tempo.
@@ -1620,12 +1630,33 @@ final class PlayerModel {
case .tracksResolved(let audio, let subtitle): case .tracksResolved(let audio, let subtitle):
audioTracks = audio audioTracks = audio
subtitleTracks = subtitle subtitleTracks = subtitle
showOrderedSubtitle()
applyPreferredLanguages() applyPreferredLanguages()
} }
} }
} }
} }
/// Zeigt den Untertitel, den wir beim Server bestellt haben.
///
/// **Der Fehler, den das behebt:** Wer im Player einen Untertitel wählt,
/// löst einen Neuaufbau aus — der Server bekommt die Spurnummer und
/// liefert sie brav mit. Nur sagte danach niemand dem Player, dass er sie
/// **zeigen** soll. Gewählt wurde bisher allein in
/// `applyPreferredLanguages()`, und das greift nur, wenn in den
/// 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.
private func showOrderedSubtitle() {
guard selectedSubtitleStream != nil,
selectedSubtitleTrack == nil,
let erste = subtitleTracks.first
else { return }
selectSubtitleTrack(erste)
}
/// Wählt die Untertitelspur, sofern eine gewünscht ist. /// Wählt die Untertitelspur, sofern eine gewünscht ist.
/// ///
/// **Nur noch Untertitel.** Die Tonspur wird nicht mehr hier gewählt, /// **Nur noch Untertitel.** Die Tonspur wird nicht mehr hier gewählt,