Untertitel lassen sich jetzt einstellen
Groesse in vier Stufen, Schrift und Hintergrund als fuenf feste Paare — Weiss, Weiss auf Schwarz, Schwarz auf Weiss, Gelb, Gelb auf Schwarz. Feste Paare statt zweier Regler, weil unabhaengige Achsen unlesbare Mischungen zulassen: Schwarz auf durchsichtig ueber einer Nachtszene ist eine gueltige Einstellung und eine wertlose. Die Uebersetzung nach AVFoundation ist eine Tabelle aus Schluesseln, bei der jeder Fehler lautlos ist — ein falscher Schluessel laesst den Initialisierer `nil` zurueckgeben, und dann gibt es gar keine Regel. Auf dem Bildschirm sieht „keine Regel\" genauso aus wie „Regel ohne Wirkung\". Zehn Tests decken das ab, darunter die drei Fallen: Alpha zuerst in der Farbe, Prozentwert statt Punktgroesse, und der Hintergrund auch fuer „durchsichtig\" ausdruecklich gesetzt statt weggelassen — weggelassen gilt sonst, was Jellyfins WebVTT selbst mitbringt, und das ist oft ein schwarzer Kasten. Als Protokollmethode, nicht als Feld an `PlaybackSource`: die wird einmal beim Oeffnen gelesen, und eine Einstellung, die erst beim naechsten Film wirkt, haelt jeder fuer kaputt. Angewandt wird an zwei Stellen — am laufenden Gegenstand und am frisch angelegten. Nur das erste zu tun hiesse, dass die naechste Folge wieder in der Vorgabe erscheint. VLC erbt die leere Vorgabe. Die Einstellungsseite sagt beides: dass es fuer den Standardplayer gilt, und dass eingebrannte Bilduntertitel von Blu-rays sich nicht gestalten lassen, weil es dort keinen Text gibt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
a1ff5cb7bb
commit
0815432efd
@@ -178,6 +178,7 @@ final class PlayerModel {
|
||||
private let policy: PlaybackPolicy
|
||||
private let settings: PlaybackSettings
|
||||
private let languages: LanguagePreferences
|
||||
private let subtitles: SubtitleAppearance
|
||||
private let isLocalConnection: Bool
|
||||
/// Wie die Verbindung in der Diagnose heißt.
|
||||
///
|
||||
@@ -410,6 +411,7 @@ final class PlayerModel {
|
||||
policy: PlaybackPolicy,
|
||||
settings: PlaybackSettings,
|
||||
languages: LanguagePreferences,
|
||||
subtitles: SubtitleAppearance,
|
||||
isLocalConnection: Bool,
|
||||
connectionDescription: String?,
|
||||
unavailableMessage: String
|
||||
@@ -422,6 +424,7 @@ final class PlayerModel {
|
||||
self.policy = policy
|
||||
self.settings = settings
|
||||
self.languages = languages
|
||||
self.subtitles = subtitles
|
||||
self.isLocalConnection = isLocalConnection
|
||||
self.connectionDescription = connectionDescription
|
||||
self.unavailableMessage = unavailableMessage
|
||||
@@ -665,6 +668,9 @@ final class PlayerModel {
|
||||
self.engine = engine
|
||||
attachSurface(to: engine)
|
||||
observe(engine)
|
||||
// **Vor dem Öffnen.** Ein frisch angelegter Gegenstand ist
|
||||
// ungestaltet, und der erste Untertitel käme sonst in der Vorgabe.
|
||||
engine.applySubtitleStyle(subtitles.style)
|
||||
|
||||
do {
|
||||
diagnostics.note("Engine öffnet Quelle")
|
||||
|
||||
@@ -17,6 +17,7 @@ struct PlayerView: View {
|
||||
@Environment(FlixySession.self) private var session
|
||||
@Environment(PlaybackCoordinator.self) private var playback
|
||||
@Environment(PlaybackSettings.self) private var settings
|
||||
@Environment(SubtitleAppearance.self) private var subtitleAppearance
|
||||
@Environment(NetworkConditions.self) private var network
|
||||
@Environment(DownloadCoordinator.self) private var downloads
|
||||
@Environment(PlaybackDiagnostics.self) private var diagnostics
|
||||
@@ -273,6 +274,13 @@ struct PlayerView: View {
|
||||
showsControls = true
|
||||
scheduleControlsHide()
|
||||
}
|
||||
// **Mitten im Film.** Eine Einstellung, die erst beim nächsten
|
||||
// Titel wirkt, hält jeder für kaputt — man stellt um und sieht
|
||||
// nichts. `SubtitleStyle` ist vergleichbar, das feuert nur bei einer
|
||||
// echten Änderung.
|
||||
.onChange(of: subtitleAppearance.style) { _, neu in
|
||||
model.engine?.applySubtitleStyle(neu)
|
||||
}
|
||||
.task { scheduleControlsHide() }
|
||||
.onDisappear { hideTask?.cancel() }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user