// This is used for to control the songs import { BrowserWindow, ipcMain } from 'electron'; // see protocol-handler.ts type ArgsType = T | string[] | undefined; const parseNumberFromArgsType = (args: ArgsType) => { if (typeof args === 'number') { return args; } else if (Array.isArray(args)) { return Number(args[0]); } else { return null; } }; const parseBooleanFromArgsType = (args: ArgsType) => { if (typeof args === 'boolean') { return args; } else if (Array.isArray(args)) { return args[0] === 'true'; } else { return null; } }; const parseStringFromArgsType = (args: ArgsType) => { if (typeof args === 'string') { return args; } else if (Array.isArray(args)) { return args[0]; } else { return null; } }; export default (win: BrowserWindow) => { return { // Playback previous: () => win.webContents.send('ytmd:previous-video'), next: () => win.webContents.send('ytmd:next-video'), play: () => win.webContents.send('ytmd:play'), pause: () => win.webContents.send('ytmd:pause'), playPause: () => win.webContents.send('ytmd:toggle-play'), like: () => win.webContents.send('ytmd:update-like', 'LIKE'), dislike: () => win.webContents.send('ytmd:update-like', 'DISLIKE'), seekTo: (seconds: ArgsType) => { const secondsNumber = parseNumberFromArgsType(seconds); if (secondsNumber !== null) { win.webContents.send('ytmd:seek-to', seconds); } }, goBack: (seconds: ArgsType) => { const secondsNumber = parseNumberFromArgsType(seconds); if (secondsNumber !== null) { win.webContents.send('ytmd:seek-by', -secondsNumber); } }, goForward: (seconds: ArgsType) => { const secondsNumber = parseNumberFromArgsType(seconds); if (secondsNumber !== null) { win.webContents.send('ytmd:seek-by', seconds); } }, requestShuffleInformation: () => { win.webContents.send('ytmd:get-shuffle'); }, shuffle: () => win.webContents.send('ytmd:shuffle'), switchRepeat: (n: ArgsType = 1) => { const repeat = parseNumberFromArgsType(n); if (repeat !== null) { win.webContents.send('ytmd:switch-repeat', n); } }, // General setVolume: (volume: ArgsType) => { const volumeNumber = parseNumberFromArgsType(volume); if (volumeNumber !== null) { win.webContents.send('ytmd:update-volume', volume); } }, setFullscreen: (isFullscreen: ArgsType) => { const isFullscreenValue = parseBooleanFromArgsType(isFullscreen); if (isFullscreenValue !== null) { win.setFullScreen(isFullscreenValue); win.webContents.send('ytmd:click-fullscreen-button', isFullscreenValue); } }, requestFullscreenInformation: () => { win.webContents.send('ytmd:get-fullscreen'); }, requestQueueInformation: () => { win.webContents.send('ytmd:get-queue'); }, muteUnmute: () => win.webContents.send('ytmd:toggle-mute'), openSearchBox: () => { win.webContents.sendInputEvent({ type: 'keyDown', keyCode: '/', }); }, // Queue addSongToQueue: (videoId: string, queueInsertPosition: string) => { const videoIdValue = parseStringFromArgsType(videoId); if (videoIdValue === null) return; win.webContents.send( 'ytmd:add-to-queue', videoIdValue, queueInsertPosition, ); }, moveSongInQueue: ( fromIndex: ArgsType, toIndex: ArgsType, ) => { 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) => { const indexValue = parseNumberFromArgsType(index); if (indexValue === null) return; win.webContents.send('ytmd:remove-from-queue', indexValue); }, setQueueIndex: (index: ArgsType) => { 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); }), }; };