diff --git a/Flixy/Views/Player/PlayerModel.swift b/Flixy/Views/Player/PlayerModel.swift index c67de49..ba90926 100644 --- a/Flixy/Views/Player/PlayerModel.swift +++ b/Flixy/Views/Player/PlayerModel.swift @@ -1529,6 +1529,26 @@ final class PlayerModel { seek(to: .milliseconds(marker.endMilliseconds)) } + /// Ob es bei der Tonspur überhaupt etwas zu wählen gibt. + /// + /// **Eine Spur ist keine Wahl.** Der Knopf stand auch dort, wo die Liste + /// genau einen Eintrag hatte — ein Angebot, das nach dem Antippen nichts + /// anbietet. + /// + /// Woher gezählt wird, hängt daran, wo die Datei liegt: online stehen die + /// Spuren des Servers zur Wahl (umstellen heisst dort: neu bestellen), + /// offline die der Datei. Siehe `TrackPickerSheet`. + var hasAudioChoice: Bool { + (isOffline ? audioTracks.count : audioStreams.count) > 1 + } + + /// Ob es Untertitel gibt. + /// + /// Hier genügt **einer**: „an oder aus" ist auch eine Wahl. + var hasSubtitleChoice: Bool { + isOffline ? !subtitleTracks.isEmpty : !subtitleStreams.isEmpty + } + func selectAudioTrack(_ track: MediaTrack) { engine?.selectAudioTrack(track) selectedAudioTrack = track diff --git a/Flixy/Views/Player/PlayerView.swift b/Flixy/Views/Player/PlayerView.swift index 029d390..5ec78f3 100644 --- a/Flixy/Views/Player/PlayerView.swift +++ b/Flixy/Views/Player/PlayerView.swift @@ -498,7 +498,7 @@ struct PlayerView: View { // Tonspur stellt man einmal am Anfang um, die Untertitel mitten im // Film. Ein gemeinsames Sheet bedeutete jedes Mal Scrollen an der // anderen Liste vorbei. - if !model.audioTracks.isEmpty { + if model.hasAudioChoice { trackButton( symbol: "waveform", label: "player.audioTracks", @@ -506,7 +506,7 @@ struct PlayerView: View { ) } - if !model.subtitleTracks.isEmpty { + if model.hasSubtitleChoice { trackButton( symbol: model.selectedSubtitleTrack == nil ? "captions.bubble" diff --git a/Flixy/Views/Player/TrackPickerSheet.swift b/Flixy/Views/Player/TrackPickerSheet.swift index b4efcdc..046dc0d 100644 --- a/Flixy/Views/Player/TrackPickerSheet.swift +++ b/Flixy/Views/Player/TrackPickerSheet.swift @@ -33,6 +33,19 @@ struct TrackPickerSheet: View { NavigationStack { List { switch kind { + case .audio where model.isOffline: + // **Offline zählt, was in der Datei liegt.** Die Liste des + // Servers gibt es hier nicht: `chooseAudioStream` läuft nur + // auf dem Online-Weg. Solange sie trotzdem gefragt wurde, + // blieb die Auswahl für heruntergeladene Titel leer — der + // Knopf war da, das Sheet zeigte nichts. + ForEach(model.audioTracks) { track in + row(title: track.displayName, isSelected: model.selectedAudioTrack == track) { + model.selectAudioTrack(track) + dismiss() + } + } + case .audio: // **Die Spuren der Datei, nicht die des Players.** Rechnet // der Server um, kennt der Player genau eine — die, für @@ -66,6 +79,22 @@ struct TrackPickerSheet: View { } } + case .subtitles where model.isOffline: + row( + title: String(localized: "player.subtitlesOff"), + isSelected: model.selectedSubtitleTrack == nil + ) { + model.selectSubtitleTrack(nil) + dismiss() + } + + ForEach(model.subtitleTracks) { track in + row(title: track.displayName, isSelected: model.selectedSubtitleTrack == track) { + model.selectSubtitleTrack(track) + dismiss() + } + } + case .subtitles: // „Aus" gehört in dieselbe Liste wie die Spuren, nicht als // eigener Schalter daneben: es ist eine Auswahl unter