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();
}