movie-web/src/components/player/hooks/useCaptions.ts

61 lines
1.9 KiB
TypeScript

import { useCallback } from "react";
import { downloadCaption } from "@/backend/helpers/subs";
import { usePlayerStore } from "@/stores/player/store";
import { useSubtitleStore } from "@/stores/subtitles";
export function useCaptions() {
const setLanguage = useSubtitleStore((s) => s.setLanguage);
const enabled = useSubtitleStore((s) => s.enabled);
const resetSubtitleSpecificSettings = useSubtitleStore(
(s) => s.resetSubtitleSpecificSettings
);
const setCaption = usePlayerStore((s) => s.setCaption);
const lastSelectedLanguage = useSubtitleStore((s) => s.lastSelectedLanguage);
const captionList = usePlayerStore((s) => s.captionList);
const selectLanguage = useCallback(
async (language: string) => {
const caption = captionList.find((v) => v.language === language);
if (!caption) return;
const srtData = await downloadCaption(caption);
setCaption({
language: caption.language,
srtData,
url: caption.url,
});
resetSubtitleSpecificSettings();
setLanguage(language);
},
[setLanguage, captionList, setCaption, resetSubtitleSpecificSettings]
);
const disable = useCallback(async () => {
setCaption(null);
setLanguage(null);
}, [setCaption, setLanguage]);
const selectLastUsedLanguage = useCallback(async () => {
const language = lastSelectedLanguage ?? "en";
await selectLanguage(language);
return true;
}, [lastSelectedLanguage, selectLanguage]);
const toggleLastUsed = useCallback(async () => {
if (enabled) disable();
else await selectLastUsedLanguage();
}, [selectLastUsedLanguage, disable, enabled]);
const selectLastUsedLanguageIfEnabled = useCallback(async () => {
if (enabled) await selectLastUsedLanguage();
}, [selectLastUsedLanguage, enabled]);
return {
selectLanguage,
disable,
selectLastUsedLanguage,
toggleLastUsed,
selectLastUsedLanguageIfEnabled,
};
}