From bd40ad0582d00b7089f8deff7ec5802ad781932e Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Sun, 21 Dec 2025 22:57:23 -0700 Subject: [PATCH] add random subtitle key --- src/assets/locales/en.json | 1 + .../overlays/KeyboardCommandsModal.tsx | 4 +++ src/components/player/hooks/useCaptions.ts | 29 +++++++++++++++++++ .../player/internals/KeyboardEvents.tsx | 15 ++++++++-- 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index de8218c5..1353e26a 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -265,6 +265,7 @@ "changeSpeed": "Increase/decrease playback speed", "toggleFullscreen": "Toggle fullscreen", "toggleCaptions": "Toggle captions", + "randomCaption": "Select random caption from last used language", "syncSubtitlesEarlier": "Sync subtitles earlier (-0.5s)", "syncSubtitlesLater": "Sync subtitles later (+0.5s)", "barrelRoll": "Do a barrel roll! 🌀", diff --git a/src/components/overlays/KeyboardCommandsModal.tsx b/src/components/overlays/KeyboardCommandsModal.tsx index ace8428c..0e096328 100644 --- a/src/components/overlays/KeyboardCommandsModal.tsx +++ b/src/components/overlays/KeyboardCommandsModal.tsx @@ -108,6 +108,10 @@ const getShortcutGroups = (t: (key: string) => string): ShortcutGroup[] => [ key: "C", description: t("global.keyboardShortcuts.shortcuts.toggleCaptions"), }, + { + key: "Shift+C", + description: t("global.keyboardShortcuts.shortcuts.randomCaption"), + }, { key: "[", description: t( diff --git a/src/components/player/hooks/useCaptions.ts b/src/components/player/hooks/useCaptions.ts index e262d77d..aade9215 100644 --- a/src/components/player/hooks/useCaptions.ts +++ b/src/components/player/hooks/useCaptions.ts @@ -148,6 +148,34 @@ export function useCaptions() { if (enabled) await selectLastUsedLanguage(); }, [selectLastUsedLanguage, enabled]); + const selectRandomCaptionFromLastUsedLanguage = useCallback(async () => { + const language = lastSelectedLanguage ?? "en"; + + // Filter captions by language + const languageCaptions = captions.filter( + (caption) => caption.language === language, + ); + + // If no captions exist for that language, return early + if (languageCaptions.length === 0) return; + + // Filter out the currently selected caption if possible + const availableCaptions = languageCaptions.filter( + (caption) => caption.id !== selectedCaption?.id, + ); + + // If we filtered out all captions (only one caption available), use all captions + const captionsToChooseFrom = + availableCaptions.length > 0 ? availableCaptions : languageCaptions; + + // Pick a random caption + const randomIndex = Math.floor(Math.random() * captionsToChooseFrom.length); + const randomCaption = captionsToChooseFrom[randomIndex]; + + // Select the random caption + await selectCaptionById(randomCaption.id); + }, [lastSelectedLanguage, captions, selectedCaption, selectCaptionById]); + return { selectLanguage, disable, @@ -155,5 +183,6 @@ export function useCaptions() { toggleLastUsed, selectLastUsedLanguageIfEnabled, selectCaptionById, + selectRandomCaptionFromLastUsedLanguage, }; } diff --git a/src/components/player/internals/KeyboardEvents.tsx b/src/components/player/internals/KeyboardEvents.tsx index a394d7b8..372d183e 100644 --- a/src/components/player/internals/KeyboardEvents.tsx +++ b/src/components/player/internals/KeyboardEvents.tsx @@ -35,7 +35,8 @@ export function KeyboardEvents() { (s) => s.setLastSuccessfulSource, ); - const { toggleLastUsed } = useCaptions(); + const { toggleLastUsed, selectRandomCaptionFromLastUsedLanguage } = + useCaptions(); const setShowVolume = useEmpheralVolumeStore((s) => s.setShowVolume); const setDelay = useSubtitleStore((s) => s.setDelay); const delay = useSubtitleStore((s) => s.delay); @@ -263,6 +264,7 @@ export function KeyboardEvents() { toggleMute, setIsRolling, toggleLastUsed, + selectRandomCaptionFromLastUsedLanguage, display, mediaPlaying, mediaProgress, @@ -295,6 +297,7 @@ export function KeyboardEvents() { toggleMute, setIsRolling, toggleLastUsed, + selectRandomCaptionFromLastUsedLanguage, display, mediaPlaying, mediaProgress, @@ -325,6 +328,7 @@ export function KeyboardEvents() { toggleMute, setIsRolling, toggleLastUsed, + selectRandomCaptionFromLastUsedLanguage, display, mediaPlaying, mediaProgress, @@ -525,7 +529,14 @@ export function KeyboardEvents() { if (keyL === "o") dataRef.current.navigateToPreviousEpisode(); // captions - if (keyL === "c") dataRef.current.toggleLastUsed().catch(() => {}); // ignore errors + if (keyL === "c" && !evt.shiftKey) + dataRef.current.toggleLastUsed().catch(() => {}); // ignore errors + // Random caption selection (Shift+C) + if (k === "C" && evt.shiftKey) { + dataRef.current + .selectRandomCaptionFromLastUsedLanguage() + .catch(() => {}); // ignore errors + } // Do a barrell roll! if (keyL === "r") {