61 lines
1.9 KiB
TypeScript
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,
|
|
};
|
|
}
|