feat(api-server): Add queue api (#2767)

This commit is contained in:
Su-Yong
2024-12-25 18:55:24 +09:00
committed by GitHub
parent 3ea13a2a22
commit 1d6251baea
7 changed files with 407 additions and 26 deletions

View File

@ -1,5 +1,5 @@
// This is used for to control the songs
import { BrowserWindow } from 'electron';
import { BrowserWindow, ipcMain } from 'electron';
// see protocol-handler.ts
type ArgsType<T> = T | string[] | undefined;
@ -24,6 +24,16 @@ const parseBooleanFromArgsType = (args: ArgsType<boolean>) => {
}
};
const parseStringFromArgsType = (args: ArgsType<string>) => {
if (typeof args === 'string') {
return args;
} else if (Array.isArray(args)) {
return args[0];
} else {
return null;
}
};
export default (win: BrowserWindow) => {
return {
// Playback
@ -80,11 +90,49 @@ export default (win: BrowserWindow) => {
win.webContents.send('ytmd:get-queue');
},
muteUnmute: () => win.webContents.send('ytmd:toggle-mute'),
search: () => {
openSearchBox: () => {
win.webContents.sendInputEvent({
type: 'keyDown',
keyCode: '/',
});
},
// Queue
addSongToQueue: (videoId: string) => {
const videoIdValue = parseStringFromArgsType(videoId);
if (videoIdValue === null) return;
win.webContents.send('ytmd:add-to-queue', videoIdValue);
},
moveSongInQueue: (
fromIndex: ArgsType<number>,
toIndex: ArgsType<number>,
) => {
const fromIndexValue = parseNumberFromArgsType(fromIndex);
const toIndexValue = parseNumberFromArgsType(toIndex);
if (fromIndexValue === null || toIndexValue === null) return;
win.webContents.send('ytmd:move-in-queue', fromIndexValue, toIndexValue);
},
removeSongFromQueue: (index: ArgsType<number>) => {
const indexValue = parseNumberFromArgsType(index);
if (indexValue === null) return;
win.webContents.send('ytmd:remove-from-queue', indexValue);
},
setQueueIndex: (index: ArgsType<number>) => {
const indexValue = parseNumberFromArgsType(index);
if (indexValue === null) return;
win.webContents.send('ytmd:set-queue-index', indexValue);
},
clearQueue: () => win.webContents.send('ytmd:clear-queue'),
search: (query: string) =>
new Promise((resolve) => {
ipcMain.once('ytmd:search-results', (_, result) => {
resolve(result as string);
});
win.webContents.send('ytmd:search', query);
}),
};
};