diff --git a/Model/Player/Backends/MPVBackend.swift b/Model/Player/Backends/MPVBackend.swift index 70220e5f..d2aae712 100644 --- a/Model/Player/Backends/MPVBackend.swift +++ b/Model/Player/Backends/MPVBackend.swift @@ -326,13 +326,28 @@ final class MPVBackend: PlayerBackend { startPlaying() } - stream.audioAsset = AVURLAsset(url: stream.audioTracks[stream.selectedAudioTrackIndex].url) - let fileToLoad = self.model.musicMode ? stream.audioAsset.url : stream.videoAsset.url - let audioTrack = self.model.musicMode ? nil : stream.audioAsset.url + // Handle streams with multiple audio tracks + if !stream.audioTracks.isEmpty { + if stream.selectedAudioTrackIndex >= stream.audioTracks.count { + stream.selectedAudioTrackIndex = 0 + } + + stream.audioAsset = AVURLAsset(url: stream.audioTracks[stream.selectedAudioTrackIndex].url) + let fileToLoad = self.model.musicMode ? stream.audioAsset.url : stream.videoAsset.url + let audioTrack = self.model.musicMode ? nil : stream.audioAsset.url - client.loadFile(fileToLoad, audio: audioTrack, bitrate: stream.bitrate, kind: stream.kind, sub: captions?.url, time: time, forceSeekable: stream.kind == .hls) { [weak self] _ in - self?.isLoadingVideo = true - self?.pause() + client.loadFile(fileToLoad, audio: audioTrack, bitrate: stream.bitrate, kind: stream.kind, sub: captions?.url, time: time, forceSeekable: stream.kind == .hls) { [weak self] _ in + self?.isLoadingVideo = true + self?.pause() + } + } else { + // Fallback for streams without separate audio tracks (e.g., single asset streams) + let fileToLoad = stream.videoAsset.url + + client.loadFile(fileToLoad, bitrate: stream.bitrate, kind: stream.kind, sub: captions?.url, time: time, forceSeekable: stream.kind == .hls) { [weak self] _ in + self?.isLoadingVideo = true + self?.pause() + } } } } @@ -739,6 +754,12 @@ final class MPVBackend: PlayerBackend { func switchAudioTrack(to index: Int) { guard let stream, let video else { return } + + // Validate the index is within bounds + guard index >= 0 && index < stream.audioTracks.count else { + logger.error("Invalid audio track index: \(index), available tracks: \(stream.audioTracks.count)") + return + } stream.selectedAudioTrackIndex = index model.saveTime { [weak self] in