feat(api-server): send shuffle state over websocket (#3837)

This commit is contained in:
cxntered
2025-09-07 05:29:38 +10:00
committed by GitHub
parent eb50596961
commit 5ecd39f324
3 changed files with 15 additions and 0 deletions

View File

@ -35,6 +35,7 @@ export const backend = createBackend<BackendType, APIServerConfig>({
ctx.ipc.send('ytmd:setup-repeat-changed-listener');
ctx.ipc.send('ytmd:setup-like-changed-listener');
ctx.ipc.send('ytmd:setup-volume-changed-listener');
ctx.ipc.send('ytmd:setup-shuffle-changed-listener');
});
ctx.ipc.on(

View File

@ -23,6 +23,7 @@ enum DataTypes {
PositionChanged = 'POSITION_CHANGED',
VolumeChanged = 'VOLUME_CHANGED',
RepeatChanged = 'REPEAT_CHANGED',
ShuffleChanged = 'SHUFFLE_CHANGED',
}
type PlayerState = {
@ -32,11 +33,13 @@ type PlayerState = {
position: number;
volume: number;
repeat: RepeatMode;
shuffle: boolean;
};
export const register = (app: HonoApp, nodeWebSocket: NodeWebSocket) => {
let volumeState: VolumeState | undefined = undefined;
let repeat: RepeatMode = 'NONE';
let shuffle = false;
let lastSongInfo: SongInfo | undefined = undefined;
const sockets = new Set<WSContext<WebSocket>>();
@ -51,10 +54,12 @@ export const register = (app: HonoApp, nodeWebSocket: NodeWebSocket) => {
songInfo,
volumeState,
repeat,
shuffle,
}: {
songInfo?: SongInfo;
volumeState?: VolumeState;
repeat: RepeatMode;
shuffle: boolean;
}): PlayerState => ({
song: songInfo,
isPlaying: songInfo ? !songInfo.isPaused : false,
@ -62,6 +67,7 @@ export const register = (app: HonoApp, nodeWebSocket: NodeWebSocket) => {
position: songInfo?.elapsedSeconds ?? 0,
volume: volumeState?.state ?? 100,
repeat,
shuffle,
});
registerCallback((songInfo, event) => {
@ -100,6 +106,11 @@ export const register = (app: HonoApp, nodeWebSocket: NodeWebSocket) => {
send(DataTypes.PositionChanged, { position: t });
});
ipcMain.on('ytmd:shuffle-changed', (_, newShuffle: boolean) => {
shuffle = newShuffle;
send(DataTypes.ShuffleChanged, { shuffle });
});
app.openapi(
createRoute({
method: 'get',
@ -124,6 +135,7 @@ export const register = (app: HonoApp, nodeWebSocket: NodeWebSocket) => {
songInfo: lastSongInfo,
volumeState,
repeat,
shuffle,
}),
}),
);

View File

@ -145,6 +145,7 @@ export const setupShuffleChangedListener = singleton(() => {
observer.observe(playerBar, {
attributes: true,
attributeFilter: ['shuffle-on'],
childList: false,
subtree: false,
});
@ -168,6 +169,7 @@ export const setupFullScreenChangedListener = singleton(() => {
observer.observe(playerBar, {
attributes: true,
attributeFilter: ['player-fullscreened'],
childList: false,
subtree: false,
});