From ff5b494adb68c9a12383c8c8eafc87c312ce3ff0 Mon Sep 17 00:00:00 2001 From: Leo Denham Date: Tue, 21 May 2024 09:44:57 +1000 Subject: [PATCH] Add persistance of sub scraping --- src/components/player/hooks/useCaptions.ts | 38 +++++++++++++++++++--- src/stores/subtitles/index.ts | 15 ++++++++- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/components/player/hooks/useCaptions.ts b/src/components/player/hooks/useCaptions.ts index 4bbdae4fc..99a633082 100644 --- a/src/components/player/hooks/useCaptions.ts +++ b/src/components/player/hooks/useCaptions.ts @@ -1,6 +1,7 @@ import { useCallback, useMemo } from "react"; -import subsrt from "subsrt-ts"; +import subsrt, { convert } from "subsrt-ts"; +import { proxiedFetch } from "@/backend/helpers/fetch"; import { downloadCaption, downloadWebVTT } from "@/backend/helpers/subs"; import { Caption } from "@/stores/player/slices/source"; import { usePlayerStore } from "@/stores/player/store"; @@ -19,6 +20,12 @@ export function useCaptions() { ); const setCaption = usePlayerStore((s) => s.setCaption); const lastSelectedLanguage = useSubtitleStore((s) => s.lastSelectedLanguage); + const scrapedSubtitlesLast = useSubtitleStore((s) => s.scrapedSubtitlesLast); + const scrapedSubtitles = useSubtitleStore((s) => s.lastScraped); + const scrapedSubtitlesLang = useSubtitleStore((s) => s.lastScrapedLanguage); + + const setScrapeSubtitles = useSubtitleStore((s) => s.setScrapeSubtitles); + const setScrapedLanguage = useSubtitleStore((s) => s.setScrapeSubtitlesLang); const captionList = usePlayerStore((s) => s.captionList); const getHlsCaptionList = usePlayerStore((s) => s.display?.getCaptionList); @@ -106,10 +113,31 @@ export function useCaptions() { }, [setCaption, setLanguage]); const selectLastUsedLanguage = useCallback(async () => { - const language = lastSelectedLanguage ?? "en"; - await selectLanguage(language); - return true; - }, [lastSelectedLanguage, selectLanguage]); + if (scrapedSubtitles && scrapedSubtitlesLang && scrapedSubtitlesLast) { + setScrapeSubtitles(scrapedSubtitles); + setScrapedLanguage(scrapedSubtitlesLang); + const text = await (await proxiedFetch(scrapedSubtitles)).text(); + const converted = convert(text, "srt"); + setCaption({ + language: scrapedSubtitlesLang, + srtData: converted, + id: `scraped - ${scrapedSubtitlesLang}`, + }); + } else { + const language = lastSelectedLanguage ?? "en"; + await selectLanguage(language); + return true; + } + }, [ + lastSelectedLanguage, + selectLanguage, + scrapedSubtitlesLast, + scrapedSubtitles, + scrapedSubtitlesLang, + setScrapeSubtitles, + setScrapedLanguage, + setCaption, + ]); const toggleLastUsed = useCallback(async () => { if (enabled) disable(); diff --git a/src/stores/subtitles/index.ts b/src/stores/subtitles/index.ts index 7f2223d1a..2b8660920 100644 --- a/src/stores/subtitles/index.ts +++ b/src/stores/subtitles/index.ts @@ -36,6 +36,9 @@ export interface SubtitleStore { }; enabled: boolean; lastSelectedLanguage: string | null; + lastScrapedLanguage: string | null; + lastScraped: string | null; + scrapedSubtitlesLast: boolean; styling: SubtitleStyling; overrideCasing: boolean; delay: number; @@ -61,6 +64,9 @@ export const useSubtitleStore = create( lastSelectedLanguage: null, }, lastSelectedLanguage: null, + lastScrapedLanguage: null, + lastScraped: null, + scrapedSubtitlesLast: false, overrideCasing: false, delay: 0, scrapeSubtitles: null, @@ -100,7 +106,10 @@ export const useSubtitleStore = create( setLanguage(lang) { set((s) => { s.enabled = !!lang; - if (lang) s.lastSelectedLanguage = lang; + if (lang) { + s.lastSelectedLanguage = lang; + s.scrapedSubtitlesLast = false; + } }); }, setCustomSubs() { @@ -123,6 +132,7 @@ export const useSubtitleStore = create( set((s) => { s.lastSelectedLanguage = lang; s.lastSync.lastSelectedLanguage = lang; + s.scrapedSubtitlesLast = false; }); }, setScrapeSubtitles(id) { @@ -135,11 +145,14 @@ export const useSubtitleStore = create( if (lang) { s.scrapeSubtitlesLang = lang; s.enabled = true; + s.scrapedSubtitlesLast = true; } }); }, clearScrapeSubtitles() { set((s) => { + s.lastScraped = s.scrapeSubtitles; + s.lastScrapedLanguage = s.scrapeSubtitlesLang; s.scrapeSubtitles = null; s.scrapeSubtitlesLang = null; });