From aab19b289bca3210c65d93db7024dd34141b4a9e Mon Sep 17 00:00:00 2001 From: jeffvli Date: Sat, 29 Nov 2025 22:04:10 -0800 Subject: [PATCH] reimplement playback hotkeys --- .../player/components/audio-players.tsx | 2 + .../player/hooks/use-playback-hotkeys.ts | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/renderer/features/player/hooks/use-playback-hotkeys.ts diff --git a/src/renderer/features/player/components/audio-players.tsx b/src/renderer/features/player/components/audio-players.tsx index 2a1f7a080..84be0a095 100644 --- a/src/renderer/features/player/components/audio-players.tsx +++ b/src/renderer/features/player/components/audio-players.tsx @@ -8,6 +8,7 @@ import { MpvPlayer } from '/@/renderer/features/player/audio-player/mpv-player'; import { WebPlayer } from '/@/renderer/features/player/audio-player/web-player'; import { useMediaSession } from '/@/renderer/features/player/hooks/use-media-session'; import { useMPRIS } from '/@/renderer/features/player/hooks/use-mpris'; +import { usePlaybackHotkeys } from '/@/renderer/features/player/hooks/use-playback-hotkeys'; import { usePowerSaveBlocker } from '/@/renderer/features/player/hooks/use-power-save-blocker'; import { useScrobble } from '/@/renderer/features/player/hooks/use-scrobble'; import { @@ -29,6 +30,7 @@ export const AudioPlayers = () => { useMPRIS(); useMainPlayerListener(); useMediaSession(); + usePlaybackHotkeys(); // Listen to favorite and rating events to update queue songs useEffect(() => { diff --git a/src/renderer/features/player/hooks/use-playback-hotkeys.ts b/src/renderer/features/player/hooks/use-playback-hotkeys.ts new file mode 100644 index 000000000..a50b8c8d8 --- /dev/null +++ b/src/renderer/features/player/hooks/use-playback-hotkeys.ts @@ -0,0 +1,40 @@ +import { useMemo } from 'react'; + +import { useHotkeySettings, usePlayerStore } from '/@/renderer/store'; +import { HotkeyItem, useHotkeys } from '/@/shared/hooks/use-hotkeys'; + +export const usePlaybackHotkeys = () => { + const { bindings } = useHotkeySettings(); + const player = usePlayerStore(); + + const playbackHotkeysItems = useMemo(() => { + const hotkeyItems: HotkeyItem[] = []; + + const bindingHandlers: Array<{ + binding: (typeof bindings)[keyof typeof bindings]; + handler: () => void; + }> = [ + { binding: bindings.next, handler: () => player.mediaNext() }, + { binding: bindings.pause, handler: () => player.mediaPause() }, + { binding: bindings.play, handler: () => player.mediaPlay() }, + { binding: bindings.playPause, handler: () => player.mediaTogglePlayPause() }, + { binding: bindings.previous, handler: () => player.mediaPrevious() }, + { binding: bindings.skipBackward, handler: () => player.mediaSkipBackward() }, + { binding: bindings.skipForward, handler: () => player.mediaSkipForward() }, + { binding: bindings.stop, handler: () => player.mediaStop() }, + { binding: bindings.toggleRepeat, handler: () => player.toggleRepeat() }, + { binding: bindings.toggleShuffle, handler: () => player.toggleShuffle() }, + ]; + + // Filter and map to hotkey items + bindingHandlers.forEach(({ binding, handler }) => { + if (!binding.isGlobal && binding.hotkey && binding.hotkey !== '') { + hotkeyItems.push([binding.hotkey, handler]); + } + }); + + return hotkeyItems; + }, [bindings, player]); + + useHotkeys(playbackHotkeysItems); +};