prevent change of media state with empty queue
This commit is contained in:
parent
ba531505af
commit
0d03b66fe5
5 changed files with 26 additions and 11 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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' })}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue