mirror of
https://github.com/jeffvli/feishin.git
synced 2026-06-18 09:24:19 +02:00
handle radio metadata for mpris / mediasession (#1586)
This commit is contained in:
@@ -4,6 +4,10 @@ import React, { useCallback, useEffect, useMemo } from 'react';
|
||||
import { getItemImageUrl } from '/@/renderer/components/item-image/item-image';
|
||||
import { usePlayerEvents } from '/@/renderer/features/player/audio-player/hooks/use-player-events';
|
||||
import { usePlayer } from '/@/renderer/features/player/context/player-context';
|
||||
import {
|
||||
useIsRadioActive,
|
||||
useRadioPlayer,
|
||||
} from '/@/renderer/features/radio/hooks/use-radio-player';
|
||||
import {
|
||||
usePlaybackSettings,
|
||||
usePlaybackType,
|
||||
@@ -22,6 +26,8 @@ export const useMediaSession = () => {
|
||||
const player = usePlayer();
|
||||
const skip = useSkipButtons();
|
||||
const playbackType = useSettingsStore((state) => state.playback.type);
|
||||
const isRadioActive = useIsRadioActive();
|
||||
const { isPlaying: isRadioPlaying, metadata: radioMetadata, stationName } = useRadioPlayer();
|
||||
|
||||
const isMediaSessionEnabled = useMemo(() => {
|
||||
// Always enable media session on web
|
||||
@@ -38,6 +44,10 @@ export const useMediaSession = () => {
|
||||
}
|
||||
|
||||
mediaSession.setActionHandler('nexttrack', () => {
|
||||
if (isRadioActive && isRadioPlaying) {
|
||||
return;
|
||||
}
|
||||
|
||||
player.mediaNext();
|
||||
});
|
||||
|
||||
@@ -50,10 +60,18 @@ export const useMediaSession = () => {
|
||||
});
|
||||
|
||||
mediaSession.setActionHandler('previoustrack', () => {
|
||||
if (isRadioActive && isRadioPlaying) {
|
||||
return;
|
||||
}
|
||||
|
||||
player.mediaPrevious();
|
||||
});
|
||||
|
||||
mediaSession.setActionHandler('seekto', (e) => {
|
||||
if (isRadioActive && isRadioPlaying) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (e.seekTime) {
|
||||
player.mediaSeekToTimestamp(e.seekTime);
|
||||
} else if (e.seekOffset) {
|
||||
@@ -67,6 +85,10 @@ export const useMediaSession = () => {
|
||||
});
|
||||
|
||||
mediaSession.setActionHandler('seekbackward', (e) => {
|
||||
if (isRadioActive && isRadioPlaying) {
|
||||
return;
|
||||
}
|
||||
|
||||
const currentTimestamp = useTimestampStoreBase.getState().timestamp;
|
||||
player.mediaSeekToTimestamp(
|
||||
currentTimestamp - (e.seekOffset || skip?.skipBackwardSeconds || 5),
|
||||
@@ -74,6 +96,10 @@ export const useMediaSession = () => {
|
||||
});
|
||||
|
||||
mediaSession.setActionHandler('seekforward', (e) => {
|
||||
if (isRadioActive && isRadioPlaying) {
|
||||
return;
|
||||
}
|
||||
|
||||
const currentTimestamp = useTimestampStoreBase.getState().timestamp;
|
||||
player.mediaSeekToTimestamp(
|
||||
currentTimestamp + (e.seekOffset || skip?.skipForwardSeconds || 5),
|
||||
@@ -90,11 +116,37 @@ export const useMediaSession = () => {
|
||||
mediaSession.setActionHandler('seekbackward', null);
|
||||
mediaSession.setActionHandler('seekforward', null);
|
||||
};
|
||||
}, [player, skip?.skipBackwardSeconds, skip?.skipForwardSeconds, isMediaSessionEnabled]);
|
||||
}, [
|
||||
player,
|
||||
skip?.skipBackwardSeconds,
|
||||
skip?.skipForwardSeconds,
|
||||
isMediaSessionEnabled,
|
||||
isRadioActive,
|
||||
isRadioPlaying,
|
||||
]);
|
||||
|
||||
const updateMediaSessionMetadata = useCallback(
|
||||
(song: QueueSong | undefined) => {
|
||||
if (!isMediaSessionEnabled || !song) {
|
||||
if (!isMediaSessionEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle radio metadata when radio is active and playing
|
||||
if (isRadioActive && isRadioPlaying) {
|
||||
const title = radioMetadata?.title || stationName || 'Radio';
|
||||
const artist = radioMetadata?.artist || stationName || '';
|
||||
|
||||
mediaSession.metadata = new MediaMetadata({
|
||||
album: stationName || '',
|
||||
artist: artist,
|
||||
artwork: [],
|
||||
title: title,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle regular song metadata
|
||||
if (!song) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -112,9 +164,27 @@ export const useMediaSession = () => {
|
||||
title: song?.name ?? '',
|
||||
});
|
||||
},
|
||||
[isMediaSessionEnabled],
|
||||
[isMediaSessionEnabled, isRadioActive, isRadioPlaying, radioMetadata, stationName],
|
||||
);
|
||||
|
||||
// Update metadata when radio metadata changes
|
||||
useEffect(() => {
|
||||
if (!isMediaSessionEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isRadioActive && isRadioPlaying) {
|
||||
updateMediaSessionMetadata(undefined);
|
||||
}
|
||||
}, [
|
||||
isMediaSessionEnabled,
|
||||
isRadioActive,
|
||||
isRadioPlaying,
|
||||
radioMetadata,
|
||||
stationName,
|
||||
updateMediaSessionMetadata,
|
||||
]);
|
||||
|
||||
usePlayerEvents(
|
||||
{
|
||||
onCurrentSongChange: (properties) => {
|
||||
@@ -122,6 +192,10 @@ export const useMediaSession = () => {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isRadioActive && isRadioPlaying) {
|
||||
return;
|
||||
}
|
||||
|
||||
updateMediaSessionMetadata(properties.song);
|
||||
},
|
||||
onPlayerRepeated: () => {
|
||||
@@ -129,6 +203,10 @@ export const useMediaSession = () => {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isRadioActive && isRadioPlaying) {
|
||||
return;
|
||||
}
|
||||
|
||||
const currentSong = usePlayerStore.getState().getCurrentSong();
|
||||
updateMediaSessionMetadata(currentSong);
|
||||
},
|
||||
@@ -141,7 +219,7 @@ export const useMediaSession = () => {
|
||||
mediaSession.playbackState = status === PlayerStatus.PLAYING ? 'playing' : 'paused';
|
||||
},
|
||||
},
|
||||
[isMediaSessionEnabled, mediaSession],
|
||||
[isMediaSessionEnabled, isRadioActive, isRadioPlaying, updateMediaSessionMetadata],
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user