add random subtitle key

This commit is contained in:
Pas 2025-12-21 22:57:23 -07:00
parent 5da9183260
commit bd40ad0582
4 changed files with 47 additions and 2 deletions

View file

@ -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! 🌀",

View file

@ -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(

View file

@ -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,
};
}

View file

@ -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") {