prevent change of media state with empty queue

This commit is contained in:
Kendall Garner 2024-04-20 22:01:29 -07:00
parent ba531505af
commit 0d03b66fe5
No known key found for this signature in database
GPG key ID: 18D2767419676C87
5 changed files with 26 additions and 11 deletions

View file

@ -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 // 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) => { 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 { try {
await getMpvInstance()?.clearPlaylist(); await getMpvInstance()?.clearPlaylist();
await getMpvInstance()?.pause(); await getMpvInstance()?.pause();
@ -317,14 +317,14 @@ ipcMain.on('player-set-queue', async (_event, data: PlayerData, pause?: boolean)
} }
try { try {
if (data.queue.current) { if (data.queue.current?.streamUrl) {
await getMpvInstance() await getMpvInstance()
?.load(data.queue.current.streamUrl, 'replace') ?.load(data.queue.current.streamUrl, 'replace')
.catch(() => { .catch(() => {
getMpvInstance()?.play(); getMpvInstance()?.play();
}); });
if (data.queue.next) { if (data.queue.next?.streamUrl) {
await getMpvInstance()?.load(data.queue.next.streamUrl, 'append'); 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); await getMpvInstance()?.playlistRemove(1);
} }
if (data.queue.next) { if (data.queue.next?.streamUrl) {
await getMpvInstance()?.load(data.queue.next.streamUrl, 'append'); await getMpvInstance()?.load(data.queue.next.streamUrl, 'append');
} }
} catch (err: NodeMpvError | any) { } catch (err: NodeMpvError | any) {
@ -373,7 +373,7 @@ ipcMain.on('player-auto-next', async (_event, data: PlayerData) => {
getMpvInstance()?.pause(); getMpvInstance()?.pause();
}); });
if (data.queue.next) { if (data.queue.next?.streamUrl) {
await getMpvInstance()?.load(data.queue.next.streamUrl, 'append'); await getMpvInstance()?.load(data.queue.next.streamUrl, 'append');
} }
} catch (err: NodeMpvError | any) { } catch (err: NodeMpvError | any) {

View file

@ -18,22 +18,29 @@ mprisPlayer.on('quit', () => {
process.exit(); process.exit();
}); });
const hasData = (): boolean => {
return mprisPlayer.metadata && !!mprisPlayer.metadata['mpris:length'];
};
mprisPlayer.on('stop', () => { mprisPlayer.on('stop', () => {
getMainWindow()?.webContents.send('renderer-player-stop'); getMainWindow()?.webContents.send('renderer-player-stop');
mprisPlayer.playbackStatus = 'Paused'; mprisPlayer.playbackStatus = 'Paused';
}); });
mprisPlayer.on('pause', () => { mprisPlayer.on('pause', () => {
if (!hasData()) return;
getMainWindow()?.webContents.send('renderer-player-pause'); getMainWindow()?.webContents.send('renderer-player-pause');
mprisPlayer.playbackStatus = 'Paused'; mprisPlayer.playbackStatus = 'Paused';
}); });
mprisPlayer.on('play', () => { mprisPlayer.on('play', () => {
if (!hasData()) return;
getMainWindow()?.webContents.send('renderer-player-play'); getMainWindow()?.webContents.send('renderer-player-play');
mprisPlayer.playbackStatus = 'Playing'; mprisPlayer.playbackStatus = 'Playing';
}); });
mprisPlayer.on('playpause', () => { mprisPlayer.on('playpause', () => {
if (!hasData()) return;
getMainWindow()?.webContents.send('renderer-player-play-pause'); getMainWindow()?.webContents.send('renderer-player-play-pause');
if (mprisPlayer.playbackStatus !== 'Playing') { if (mprisPlayer.playbackStatus !== 'Playing') {
mprisPlayer.playbackStatus = 'Playing'; mprisPlayer.playbackStatus = 'Playing';
@ -43,6 +50,7 @@ mprisPlayer.on('playpause', () => {
}); });
mprisPlayer.on('next', () => { mprisPlayer.on('next', () => {
if (!hasData()) return;
getMainWindow()?.webContents.send('renderer-player-next'); getMainWindow()?.webContents.send('renderer-player-next');
if (mprisPlayer.playbackStatus !== 'Playing') { if (mprisPlayer.playbackStatus !== 'Playing') {
@ -51,6 +59,7 @@ mprisPlayer.on('next', () => {
}); });
mprisPlayer.on('previous', () => { mprisPlayer.on('previous', () => {
if (!hasData()) return;
getMainWindow()?.webContents.send('renderer-player-previous'); getMainWindow()?.webContents.send('renderer-player-previous');
if (mprisPlayer.playbackStatus !== 'Playing') { if (mprisPlayer.playbackStatus !== 'Playing') {
@ -136,7 +145,10 @@ ipcMain.on('update-song', (_event, args: SongUpdate) => {
mprisPlayer.shuffle = shuffle; mprisPlayer.shuffle = shuffle;
} }
if (!song) return; if (!song) {
mprisPlayer.metadata = {};
return;
}
const upsizedImageUrl = song.imageUrl const upsizedImageUrl = song.imageUrl
? song.imageUrl ? song.imageUrl

View file

@ -61,6 +61,7 @@ export const RemoteContainer = () => {
spacing={0} spacing={0}
> >
<RemoteButton <RemoteButton
disabled={!song}
tooltip="Previous track" tooltip="Previous track"
variant="default" variant="default"
onClick={() => send({ event: 'previous' })} onClick={() => send({ event: 'previous' })}
@ -68,7 +69,8 @@ export const RemoteContainer = () => {
<RiSkipBackFill size={25} /> <RiSkipBackFill size={25} />
</RemoteButton> </RemoteButton>
<RemoteButton <RemoteButton
tooltip={status === PlayerStatus.PLAYING ? 'Pause' : 'Play'} disabled={!song}
tooltip={song && status === PlayerStatus.PLAYING ? 'Pause' : 'Play'}
variant="default" variant="default"
onClick={() => { onClick={() => {
if (status === PlayerStatus.PLAYING) { if (status === PlayerStatus.PLAYING) {
@ -78,13 +80,14 @@ export const RemoteContainer = () => {
} }
}} }}
> >
{status === PlayerStatus.PLAYING ? ( {song && status === PlayerStatus.PLAYING ? (
<RiPauseFill size={25} /> <RiPauseFill size={25} />
) : ( ) : (
<RiPlayFill size={25} /> <RiPlayFill size={25} />
)} )}
</RemoteButton> </RemoteButton>
<RemoteButton <RemoteButton
disabled={!song}
tooltip="Next track" tooltip="Next track"
variant="default" variant="default"
onClick={() => send({ event: 'next' })} onClick={() => send({ event: 'next' })}

View file

@ -14,7 +14,7 @@ import {
} from 'react-icons/ri'; } from 'react-icons/ri';
import { Song } from '/@/renderer/api/types'; import { Song } from '/@/renderer/api/types';
import { usePlayerControls, useQueueControls } from '/@/renderer/store'; 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 { usePlaybackType } from '/@/renderer/store/settings.store';
import { usePlayerStore, useSetCurrentTime } from '../../../store/player.store'; import { usePlayerStore, useSetCurrentTime } from '../../../store/player.store';
import { TableConfigDropdown } from '/@/renderer/components/virtual-table'; import { TableConfigDropdown } from '/@/renderer/components/virtual-table';
@ -91,7 +91,7 @@ export const PlayQueueListControls = ({ type, tableRef }: PlayQueueListOptionsPr
mpvPlayer!.pause(); mpvPlayer!.pause();
} }
remote?.updateSong({ song: undefined }); remote?.updateSong({ song: undefined, status: PlayerStatus.PAUSED });
setCurrentTime(0); setCurrentTime(0);
pause(); pause();

View file

@ -508,7 +508,7 @@ export const useCenterControls = (args: { playersRef: any }) => {
]); ]);
const handlePlayPause = useCallback(() => { const handlePlayPause = useCallback(() => {
if (queue) { if (queue.length > 0) {
if (playerStatus === PlayerStatus.PAUSED) { if (playerStatus === PlayerStatus.PAUSED) {
return handlePlay(); return handlePlay();
} }