Das Qualitätsblatt hat die App angehalten

Kein Hänger, sondern ein Absturz, der nicht durchkam. Der Stapel des
eingefrorenen Prozesses endet in `_assertionFailure` beim Lesen eines
`@Environment`-Werts — mitten in `SheetBridge.present`, also während das
Blatt aufgebaut wird. Weil der Player in diesem Moment in einem
Layoutdurchlauf steckt, erschien nie eine Meldung: das Fenster stand
still.

`@Environment(PlaybackSettings.self)` ohne Fragezeichen ist keine Bitte,
sondern eine Behauptung — fehlt der Gegenstand, hält Swift die Anwendung
an. Und ein Blatt hängt an einem eigenen Darstellungsbaum. Auf dem iPad
kam die Umgebung des Players dort bisher an, auf dem Mac nicht.

Zwei Änderungen, beide nötig:

- Der Player reicht `PlaybackSettings` und den Akzent ausdrücklich in
  seine Blätter hinein, statt sich auf Vererbung zu verlassen.
- `QualitySheet` liest die Einstellungen als Optional. Ein Vergessen
  kostet künftig eine fehlende Zeile im Blatt statt der ganzen App.

Dazu ein Test, der genau diesen Weg geht: abspielen, Qualitätsknopf,
Blatt da? Er lief schon vor der Korrektur durch — der Unterschied
zwischen iPad und Mac ist mit einem Simulator nicht zu fassen. Er hält
trotzdem fest, dass der Weg überhaupt gegangen werden kann.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-15 21:45:09 +02:00
co-authored by Claude Opus 5
parent 5dd2daf3ed
commit 8a63f815cd
4 changed files with 139 additions and 62 deletions
+70 -60
View File
@@ -5,10 +5,6 @@
"comment" : "A separator between different parts of the episode metadata.",
"isCommentAutoGenerated" : true
},
"%@ GB" : {
"comment" : "A picker option in the settings view that lets the user select the maximum amount of storage space that can be used for downloaded content. The value is given in gigabytes.",
"isCommentAutoGenerated" : true
},
"%@ → %@" : {
"comment" : "A line in a diagnostic trace that shows a network request path and its result. The first argument is the network request path. The second argument is the network response result.",
"isCommentAutoGenerated" : true,
@@ -21,8 +17,8 @@
}
}
},
"1080p" : {
"comment" : "A label for a 1080p video.",
"%@ GB" : {
"comment" : "A picker option in the settings view that lets the user select the maximum amount of storage space that can be used for downloaded content. The value is given in gigabytes.",
"isCommentAutoGenerated" : true
},
"4K" : {
@@ -33,8 +29,8 @@
"comment" : "A label for a 720p video.",
"isCommentAutoGenerated" : true
},
"SD" : {
"comment" : "A label for a 720p movie.",
"1080p" : {
"comment" : "A label for a 1080p video.",
"isCommentAutoGenerated" : true
},
"account.hint" : {
@@ -1564,7 +1560,9 @@
}
}
},
"episode.number %@" : {},
"episode.number %@" : {
},
"episode.short %lld %lld" : {
"comment" : "Staffel- und Folgennummer",
"extractionState" : "stale",
@@ -2201,6 +2199,7 @@
}
},
"languages.headerExplanation" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
@@ -2854,23 +2853,6 @@
}
}
},
"liveTV.recordSeries" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Serie aufnehmen"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Record series"
}
}
}
},
"liveTV.recording.inProgress" : {
"extractionState" : "manual",
"localizations" : {
@@ -2939,6 +2921,23 @@
}
}
},
"liveTV.recordSeries" : {
"extractionState" : "manual",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Serie aufnehmen"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Record series"
}
}
}
},
"liveTV.runningNow" : {
"extractionState" : "stale",
"localizations" : {
@@ -3107,6 +3106,7 @@
}
},
"miniPlayer.expand" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
@@ -3207,6 +3207,7 @@
},
"player.buffering" : {
"comment" : "Sprachausgabe für den Abspielknopf, solange auf Daten gewartet wird",
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
@@ -3524,23 +3525,6 @@
}
}
},
"player.subtitleTracks" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Untertitel"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subtitles"
}
}
}
},
"player.subtitlesOff" : {
"comment" : "Eintrag, der die Untertitel abschaltet",
"extractionState" : "stale",
@@ -3559,6 +3543,23 @@
}
}
},
"player.subtitleTracks" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Untertitel"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Subtitles"
}
}
}
},
"player.tracks" : {
"extractionState" : "stale",
"localizations" : {
@@ -3627,6 +3628,7 @@
}
},
"quality.audioShort" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
@@ -3642,22 +3644,6 @@
}
}
},
"quality.autoShort" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Auto"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Auto"
}
}
}
},
"quality.automatic" : {
"extractionState" : "stale",
"localizations" : {
@@ -3675,6 +3661,23 @@
}
}
},
"quality.autoShort" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Auto"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Auto"
}
}
}
},
"quality.current" : {
"localizations" : {
"de" : {
@@ -3947,6 +3950,7 @@
}
},
"quality.originalShort" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
@@ -3998,6 +4002,10 @@
}
}
},
"SD" : {
"comment" : "A label for a 720p movie.",
"isCommentAutoGenerated" : true
},
"search.hint" : {
"localizations" : {
"de" : {
@@ -4515,6 +4523,7 @@
}
},
"settings.downloadsHeaderExplanation" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
@@ -4683,6 +4692,7 @@
}
},
"settings.playbackExplanation" : {
"extractionState" : "stale",
"localizations" : {
"de" : {
"stringUnit" : {
@@ -6231,4 +6241,4 @@
}
},
"version" : "1.1"
}
}