diff --git a/src/renderer/api/subsonic/subsonic-controller.ts b/src/renderer/api/subsonic/subsonic-controller.ts index 5a7d7e59c..62f86f5cc 100644 --- a/src/renderer/api/subsonic/subsonic-controller.ts +++ b/src/renderer/api/subsonic/subsonic-controller.ts @@ -1953,7 +1953,7 @@ export const SubsonicController: InternalControllerEndpoint = { }, getStreamUrl: async ({ apiClientProps, query }) => { const { server } = apiClientProps; - const { bitrate, format, id, mediaType = 'song', transcode } = query; + const { bitrate, format, id, mediaType = 'song', skipAutoTranscode, transcode } = query; const streamUrl = `${server?.url}/rest/stream.view?id=${id}&v=1.13.0&c=Feishin&${server?.credential}`; @@ -1962,6 +1962,11 @@ export const SubsonicController: InternalControllerEndpoint = { return appendTranscodeParams(streamUrl, format, bitrate); } + // Used in cases where MPV is the default player, since mpv handles basically every audio format + if (skipAutoTranscode) { + return streamUrl; + } + // If the server supports transcoding decision, always use it to determine if we need to transcode if (hasFeature(server, ServerFeature.OS_TRANSCODE_DECISION)) { const maxTranscodingAudioBitrate = 0; diff --git a/src/renderer/features/player/audio-player/engine/mpv-player-engine.tsx b/src/renderer/features/player/audio-player/engine/mpv-player-engine.tsx index bb329f223..db370c89c 100644 --- a/src/renderer/features/player/audio-player/engine/mpv-player-engine.tsx +++ b/src/renderer/features/player/audio-player/engine/mpv-player-engine.tsx @@ -124,10 +124,10 @@ export const MpvPlayerEngine = (props: MpvPlayerEngineProps) => { if (!radioState.currentStreamUrl) { const playerData = usePlayerStore.getState().getPlayerData(); const currentSongUrl = playerData.currentSong - ? await getSongUrl(playerData.currentSong, transcode) + ? await getSongUrl(playerData.currentSong, transcode, true) : undefined; const nextSongUrl = playerData.nextSong - ? await getSongUrl(playerData.nextSong, transcode) + ? await getSongUrl(playerData.nextSong, transcode, true) : undefined; if (currentSongUrl && nextSongUrl && !hasPopulatedQueueRef.current && mpvPlayer) { @@ -281,7 +281,7 @@ export const MpvPlayerEngine = (props: MpvPlayerEngineProps) => { return; } - const nextSongUrl = song ? await getSongUrl(song, transcode) : undefined; + const nextSongUrl = song ? await getSongUrl(song, transcode, true) : undefined; mpvPlayer?.setQueueNext(nextSongUrl); }, onPlayerPlay: () => { @@ -346,7 +346,7 @@ async function handleMpvAutoNext(transcode: { }) { const playerData = usePlayerStore.getState().getPlayerData(); const nextSongUrl = playerData.nextSong - ? await getSongUrl(playerData.nextSong, transcode) + ? await getSongUrl(playerData.nextSong, transcode, true) : undefined; mpvPlayer?.autoNext(nextSongUrl); } @@ -365,10 +365,10 @@ async function replaceMpvQueue(transcode: { const playerData = usePlayerStore.getState().getPlayerData(); const currentSongUrl = playerData.currentSong - ? await getSongUrl(playerData.currentSong, transcode) + ? await getSongUrl(playerData.currentSong, transcode, true) : undefined; const nextSongUrl = playerData.nextSong - ? await getSongUrl(playerData.nextSong, transcode) + ? await getSongUrl(playerData.nextSong, transcode, true) : undefined; mpvPlayer?.setQueue(currentSongUrl, nextSongUrl, false); } diff --git a/src/renderer/features/player/audio-player/hooks/use-stream-url.tsx b/src/renderer/features/player/audio-player/hooks/use-stream-url.tsx index c6c28d4b6..2291e16aa 100644 --- a/src/renderer/features/player/audio-player/hooks/use-stream-url.tsx +++ b/src/renderer/features/player/audio-player/hooks/use-stream-url.tsx @@ -61,13 +61,18 @@ export function useSongUrl( return shouldReusePrior ? prior.current[1] : queryStreamUrl; } -export const getSongUrl = async (song: QueueSong, transcode: TranscodingConfig) => { +export const getSongUrl = async ( + song: QueueSong, + transcode: TranscodingConfig, + skipAutoTranscode?: boolean, +) => { const url = await api.controller.getStreamUrl({ apiClientProps: { serverId: song._serverId }, query: { bitrate: transcode.bitrate, format: transcode.format, id: song.id, + skipAutoTranscode, transcode: transcode.enabled, }, }); diff --git a/src/shared/types/domain-types.ts b/src/shared/types/domain-types.ts index 1c53cf132..77459a7fc 100644 --- a/src/shared/types/domain-types.ts +++ b/src/shared/types/domain-types.ts @@ -1670,6 +1670,7 @@ export type StreamQuery = { id: string; mediaType?: 'podcast' | 'song'; offset?: number; + skipAutoTranscode?: boolean; transcode: boolean; };