From 0d03b66fe56977d76191f0e2ac9bc3ce5e6c5b34 Mon Sep 17 00:00:00 2001 From: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Date: Sat, 20 Apr 2024 22:01:29 -0700 Subject: [PATCH] prevent change of media state with empty queue --- src/main/features/core/player/index.ts | 10 +++++----- src/main/features/linux/mpris.ts | 14 +++++++++++++- src/remote/components/remote-container.tsx | 7 +++++-- .../components/play-queue-list-controls.tsx | 4 ++-- .../features/player/hooks/use-center-controls.ts | 2 +- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main/features/core/player/index.ts b/src/main/features/core/player/index.ts index 40d28a93..47065792 100644 --- a/src/main/features/core/player/index.ts +++ b/src/main/features/core/player/index.ts @@ -306,7 +306,7 @@ ipcMain.on('player-seek-to', async (_event, time: number) => { // Sets the queue in position 0 and 1 to the given data. Used when manually starting a song or using the next/prev buttons ipcMain.on('player-set-queue', async (_event, data: PlayerData, pause?: boolean) => { - if (!data.queue.current && !data.queue.next) { + if (!data.queue.current?.id && !data.queue.next?.id) { try { await getMpvInstance()?.clearPlaylist(); await getMpvInstance()?.pause(); @@ -317,14 +317,14 @@ ipcMain.on('player-set-queue', async (_event, data: PlayerData, pause?: boolean) } try { - if (data.queue.current) { + if (data.queue.current?.streamUrl) { await getMpvInstance() ?.load(data.queue.current.streamUrl, 'replace') .catch(() => { getMpvInstance()?.play(); }); - if (data.queue.next) { + if (data.queue.next?.streamUrl) { await getMpvInstance()?.load(data.queue.next.streamUrl, 'append'); } } @@ -353,7 +353,7 @@ ipcMain.on('player-set-queue-next', async (_event, data: PlayerData) => { await getMpvInstance()?.playlistRemove(1); } - if (data.queue.next) { + if (data.queue.next?.streamUrl) { await getMpvInstance()?.load(data.queue.next.streamUrl, 'append'); } } catch (err: NodeMpvError | any) { @@ -373,7 +373,7 @@ ipcMain.on('player-auto-next', async (_event, data: PlayerData) => { getMpvInstance()?.pause(); }); - if (data.queue.next) { + if (data.queue.next?.streamUrl) { await getMpvInstance()?.load(data.queue.next.streamUrl, 'append'); } } catch (err: NodeMpvError | any) { diff --git a/src/main/features/linux/mpris.ts b/src/main/features/linux/mpris.ts index 4fe285d0..fcdf4ac0 100644 --- a/src/main/features/linux/mpris.ts +++ b/src/main/features/linux/mpris.ts @@ -18,22 +18,29 @@ mprisPlayer.on('quit', () => { process.exit(); }); +const hasData = (): boolean => { + return mprisPlayer.metadata && !!mprisPlayer.metadata['mpris:length']; +}; + mprisPlayer.on('stop', () => { getMainWindow()?.webContents.send('renderer-player-stop'); mprisPlayer.playbackStatus = 'Paused'; }); mprisPlayer.on('pause', () => { + if (!hasData()) return; getMainWindow()?.webContents.send('renderer-player-pause'); mprisPlayer.playbackStatus = 'Paused'; }); mprisPlayer.on('play', () => { + if (!hasData()) return; getMainWindow()?.webContents.send('renderer-player-play'); mprisPlayer.playbackStatus = 'Playing'; }); mprisPlayer.on('playpause', () => { + if (!hasData()) return; getMainWindow()?.webContents.send('renderer-player-play-pause'); if (mprisPlayer.playbackStatus !== 'Playing') { mprisPlayer.playbackStatus = 'Playing'; @@ -43,6 +50,7 @@ mprisPlayer.on('playpause', () => { }); mprisPlayer.on('next', () => { + if (!hasData()) return; getMainWindow()?.webContents.send('renderer-player-next'); if (mprisPlayer.playbackStatus !== 'Playing') { @@ -51,6 +59,7 @@ mprisPlayer.on('next', () => { }); mprisPlayer.on('previous', () => { + if (!hasData()) return; getMainWindow()?.webContents.send('renderer-player-previous'); if (mprisPlayer.playbackStatus !== 'Playing') { @@ -136,7 +145,10 @@ ipcMain.on('update-song', (_event, args: SongUpdate) => { mprisPlayer.shuffle = shuffle; } - if (!song) return; + if (!song) { + mprisPlayer.metadata = {}; + return; + } const upsizedImageUrl = song.imageUrl ? song.imageUrl diff --git a/src/remote/components/remote-container.tsx b/src/remote/components/remote-container.tsx index 2213fcbb..496bb610 100644 --- a/src/remote/components/remote-container.tsx +++ b/src/remote/components/remote-container.tsx @@ -61,6 +61,7 @@ export const RemoteContainer = () => { spacing={0} > send({ event: 'previous' })} @@ -68,7 +69,8 @@ export const RemoteContainer = () => { { if (status === PlayerStatus.PLAYING) { @@ -78,13 +80,14 @@ export const RemoteContainer = () => { } }} > - {status === PlayerStatus.PLAYING ? ( + {song && status === PlayerStatus.PLAYING ? ( ) : ( )} send({ event: 'next' })} diff --git a/src/renderer/features/now-playing/components/play-queue-list-controls.tsx b/src/renderer/features/now-playing/components/play-queue-list-controls.tsx index ea13d0b5..99c14bf0 100644 --- a/src/renderer/features/now-playing/components/play-queue-list-controls.tsx +++ b/src/renderer/features/now-playing/components/play-queue-list-controls.tsx @@ -14,7 +14,7 @@ import { } from 'react-icons/ri'; import { Song } from '/@/renderer/api/types'; import { usePlayerControls, useQueueControls } from '/@/renderer/store'; -import { PlaybackType, TableType } from '/@/renderer/types'; +import { PlaybackType, PlayerStatus, TableType } from '/@/renderer/types'; import { usePlaybackType } from '/@/renderer/store/settings.store'; import { usePlayerStore, useSetCurrentTime } from '../../../store/player.store'; import { TableConfigDropdown } from '/@/renderer/components/virtual-table'; @@ -91,7 +91,7 @@ export const PlayQueueListControls = ({ type, tableRef }: PlayQueueListOptionsPr mpvPlayer!.pause(); } - remote?.updateSong({ song: undefined }); + remote?.updateSong({ song: undefined, status: PlayerStatus.PAUSED }); setCurrentTime(0); pause(); diff --git a/src/renderer/features/player/hooks/use-center-controls.ts b/src/renderer/features/player/hooks/use-center-controls.ts index 3c1a96e7..5f2557b3 100644 --- a/src/renderer/features/player/hooks/use-center-controls.ts +++ b/src/renderer/features/player/hooks/use-center-controls.ts @@ -508,7 +508,7 @@ export const useCenterControls = (args: { playersRef: any }) => { ]); const handlePlayPause = useCallback(() => { - if (queue) { + if (queue.length > 0) { if (playerStatus === PlayerStatus.PAUSED) { return handlePlay(); }