add toggle native subtitles keyboard command

This commit is contained in:
Pas 2025-12-31 12:06:10 -07:00
parent bcf081a493
commit 26c1043eb2
5 changed files with 56 additions and 2 deletions

View file

@ -285,6 +285,7 @@
"randomCaption": "Select random caption from last used language", "randomCaption": "Select random caption from last used language",
"syncSubtitlesEarlier": "Sync subtitles earlier (-0.5s)", "syncSubtitlesEarlier": "Sync subtitles earlier (-0.5s)",
"syncSubtitlesLater": "Sync subtitles later (+0.5s)", "syncSubtitlesLater": "Sync subtitles later (+0.5s)",
"toggleNativeSubtitles": "Toggle native subtitles",
"barrelRoll": "Do a barrel roll! 🌀", "barrelRoll": "Do a barrel roll! 🌀",
"closeOverlay": "Close overlay/modal", "closeOverlay": "Close overlay/modal",
"nextEpisode": "Next episode", "nextEpisode": "Next episode",

View file

@ -165,6 +165,13 @@ const getShortcutGroups = (
"global.keyboardShortcuts.shortcuts.syncSubtitlesLater", "global.keyboardShortcuts.shortcuts.syncSubtitlesLater",
), ),
}, },
{
id: ShortcutId.TOGGLE_NATIVE_SUBTITLES,
config: shortcuts[ShortcutId.TOGGLE_NATIVE_SUBTITLES],
description: t(
"global.keyboardShortcuts.shortcuts.toggleNativeSubtitles",
),
},
], ],
}, },
{ {

View file

@ -189,6 +189,13 @@ const getShortcutGroups = (
), ),
config: getConfig(ShortcutId.SYNC_SUBTITLES_LATER), config: getConfig(ShortcutId.SYNC_SUBTITLES_LATER),
}, },
{
key: getDisplayKey(ShortcutId.TOGGLE_NATIVE_SUBTITLES) || "S",
description: t(
"global.keyboardShortcuts.shortcuts.toggleNativeSubtitles",
),
config: getConfig(ShortcutId.TOGGLE_NATIVE_SUBTITLES),
},
], ],
}, },
{ {

View file

@ -1,4 +1,4 @@
import { useCallback, useEffect, useRef, useState } from "react"; import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { getMetaFromId } from "@/backend/metadata/getmeta"; import { getMetaFromId } from "@/backend/metadata/getmeta";
import { MWMediaType } from "@/backend/metadata/types/mw"; import { MWMediaType } from "@/backend/metadata/types/mw";
@ -14,6 +14,7 @@ import { useSubtitleStore } from "@/stores/subtitles";
import { useEmpheralVolumeStore } from "@/stores/volume"; import { useEmpheralVolumeStore } from "@/stores/volume";
import { useWatchPartyStore } from "@/stores/watchParty"; import { useWatchPartyStore } from "@/stores/watchParty";
import { import {
DEFAULT_KEYBOARD_SHORTCUTS,
LOCKED_SHORTCUTS, LOCKED_SHORTCUTS,
ShortcutId, ShortcutId,
matchesShortcut, matchesShortcut,
@ -49,7 +50,23 @@ export function KeyboardEvents() {
(s) => s.setShowDelayIndicator, (s) => s.setShowDelayIndicator,
); );
const enableHoldToBoost = usePreferencesStore((s) => s.enableHoldToBoost); const enableHoldToBoost = usePreferencesStore((s) => s.enableHoldToBoost);
const keyboardShortcuts = usePreferencesStore((s) => s.keyboardShortcuts); const storedKeyboardShortcuts = usePreferencesStore(
(s) => s.keyboardShortcuts,
);
// Merge defaults with stored shortcuts to ensure new shortcuts are available
const keyboardShortcuts = useMemo(
() => ({
...DEFAULT_KEYBOARD_SHORTCUTS,
...storedKeyboardShortcuts,
}),
[storedKeyboardShortcuts],
);
const enableNativeSubtitles = usePreferencesStore(
(s) => s.enableNativeSubtitles,
);
const setEnableNativeSubtitles = usePreferencesStore(
(s) => s.setEnableNativeSubtitles,
);
const [isRolling, setIsRolling] = useState(false); const [isRolling, setIsRolling] = useState(false);
const volumeDebounce = useRef<ReturnType<typeof setTimeout> | undefined>(); const volumeDebounce = useRef<ReturnType<typeof setTimeout> | undefined>();
@ -295,6 +312,8 @@ export function KeyboardEvents() {
navigateToNextEpisode, navigateToNextEpisode,
navigateToPreviousEpisode, navigateToPreviousEpisode,
keyboardShortcuts, keyboardShortcuts,
enableNativeSubtitles,
setEnableNativeSubtitles,
}); });
useEffect(() => { useEffect(() => {
@ -329,6 +348,8 @@ export function KeyboardEvents() {
navigateToNextEpisode, navigateToNextEpisode,
navigateToPreviousEpisode, navigateToPreviousEpisode,
keyboardShortcuts, keyboardShortcuts,
enableNativeSubtitles,
setEnableNativeSubtitles,
}; };
}, [ }, [
setShowVolume, setShowVolume,
@ -356,6 +377,8 @@ export function KeyboardEvents() {
navigateToNextEpisode, navigateToNextEpisode,
navigateToPreviousEpisode, navigateToPreviousEpisode,
keyboardShortcuts, keyboardShortcuts,
enableNativeSubtitles,
setEnableNativeSubtitles,
]); ]);
useEffect(() => { useEffect(() => {
@ -725,6 +748,20 @@ export function KeyboardEvents() {
dataRef.current.setCurrentOverlay(null); dataRef.current.setCurrentOverlay(null);
}, 3000); }, 3000);
} }
// Toggle native subtitles - customizable
const toggleNativeSubtitles =
dataRef.current.keyboardShortcuts[ShortcutId.TOGGLE_NATIVE_SUBTITLES];
if (
toggleNativeSubtitles?.key &&
matchesShortcut(evt, toggleNativeSubtitles)
) {
evt.preventDefault();
evt.stopPropagation();
dataRef.current.setEnableNativeSubtitles(
!dataRef.current.enableNativeSubtitles,
);
}
}; };
const keyupEventHandler = (evt: KeyboardEvent) => { const keyupEventHandler = (evt: KeyboardEvent) => {

View file

@ -40,6 +40,7 @@ export enum ShortcutId {
RANDOM_CAPTION = "randomCaption", RANDOM_CAPTION = "randomCaption",
SYNC_SUBTITLES_EARLIER = "syncSubtitlesEarlier", SYNC_SUBTITLES_EARLIER = "syncSubtitlesEarlier",
SYNC_SUBTITLES_LATER = "syncSubtitlesLater", SYNC_SUBTITLES_LATER = "syncSubtitlesLater",
TOGGLE_NATIVE_SUBTITLES = "toggleNativeSubtitles",
// Interface // Interface
BARREL_ROLL = "barrelRoll", BARREL_ROLL = "barrelRoll",
@ -67,6 +68,7 @@ export const DEFAULT_KEYBOARD_SHORTCUTS: KeyboardShortcuts = {
[ShortcutId.RANDOM_CAPTION]: { modifier: "Shift", key: "C" }, [ShortcutId.RANDOM_CAPTION]: { modifier: "Shift", key: "C" },
[ShortcutId.SYNC_SUBTITLES_EARLIER]: { key: "[" }, [ShortcutId.SYNC_SUBTITLES_EARLIER]: { key: "[" },
[ShortcutId.SYNC_SUBTITLES_LATER]: { key: "]" }, [ShortcutId.SYNC_SUBTITLES_LATER]: { key: "]" },
[ShortcutId.TOGGLE_NATIVE_SUBTITLES]: { key: "S" },
[ShortcutId.BARREL_ROLL]: { key: "R" }, [ShortcutId.BARREL_ROLL]: { key: "R" },
}; };