mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 10:31:47 +00:00
feat(api-server): send shuffle state over websocket (#3837)
This commit is contained in:
@ -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(
|
||||
|
||||
@ -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,
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
||||
@ -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,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user