feat(player): add server-side autosave capability

This commit is contained in:
Kendall Garner
2026-03-06 20:01:35 -08:00
parent e603048a80
commit 7c4cbaad9a
6 changed files with 104 additions and 2 deletions
@@ -9,6 +9,7 @@ import { MpvPlayer } from '/@/renderer/features/player/audio-player/mpv-player';
import { WebPlayer } from '/@/renderer/features/player/audio-player/web-player';
import { SleepTimerHook } from '/@/renderer/features/player/components/sleep-timer-button';
import { AutoDJHook } from '/@/renderer/features/player/hooks/use-auto-dj';
import { AutosaveHook } from '/@/renderer/features/player/hooks/use-autosave';
import { MediaSessionHook } from '/@/renderer/features/player/hooks/use-media-session';
import { MPRISHook } from '/@/renderer/features/player/hooks/use-mpris';
import { PlaybackHotkeysHook } from '/@/renderer/features/player/hooks/use-playback-hotkeys';
@@ -64,6 +65,7 @@ export const AudioPlayers = () => {
<UpdateCurrentSongHook />
<RadioAudioInstanceHook />
<RadioMetadataHook />
<AutosaveHook />
<AudioPlayersContent
audioContext={audioContext}
audioDeviceId={audioDeviceId}
@@ -0,0 +1,34 @@
import { useEffect, useRef } from 'react';
import { useSaveQueue } from '/@/renderer/features/player/hooks/use-queue-restore';
import { useCurrentServer, usePlayerSong, useSettingsStore } from '/@/renderer/store';
import { ServerType } from '/@/shared/types/domain-types';
export const useAutosave = () => {
const server = useCurrentServer();
const currentSong = usePlayerSong();
const priorSongId = useRef<string | undefined>(undefined);
const songCount = useRef(0);
const { count, enabled } = useSettingsStore((state) => state.general.autoSave);
const { mutate: savePlayQueue } = useSaveQueue();
useEffect(() => {
if (enabled && server.type !== ServerType.JELLYFIN) {
if (currentSong?._uniqueId !== priorSongId.current) {
if (songCount.current === count) {
savePlayQueue();
songCount.current = 1;
} else {
songCount.current += 1;
}
priorSongId.current = currentSong?._uniqueId;
}
}
}, [enabled, count, currentSong?._uniqueId, savePlayQueue, server.type]);
};
export const AutosaveHook = () => {
useAutosave();
return null;
};
@@ -89,8 +89,7 @@ export const useSaveQueue = () => {
});
toast.success({
message: '',
title: t('form.saveQueue.success', { postProcess: 'sentenceCase' }),
message: t('form.saveQueue.success', { postProcess: 'sentenceCase' }),
});
} catch (error) {
toast.error({