import { useParams } from "react-router-dom"; import { useEffect, useState } from "react"; import { DecoratedVideoPlayer } from "@/components/video/DecoratedVideoPlayer"; import { MWStream } from "@/backend/helpers/streams"; import { SelectedMediaData, useScrape } from "@/hooks/useScrape"; import { VideoPlayerHeader } from "@/components/video/parts/VideoPlayerHeader"; import { DetailedMeta, getMetaFromId } from "@/backend/metadata/getmeta"; import { JWMediaToMediaType } from "@/backend/metadata/justwatch"; import { SourceControl } from "@/components/video/controls/SourceControl"; import { Loading } from "@/components/layout/Loading"; import { useLoading } from "@/hooks/useLoading"; import { MWMediaType } from "@/backend/metadata/types"; import { useGoBack } from "@/hooks/useGoBack"; import { IconPatch } from "@/components/buttons/IconPatch"; import { Icons } from "@/components/Icon"; import { MediaFetchErrorView } from "./MediaErrorView"; import { MediaScrapeLog } from "./MediaScrapeLog"; import { NotFoundMedia, NotFoundWrapper } from "../notfound/NotFoundView"; function MediaViewLoading(props: { onGoBack(): void }) { return (

Finding the best video for you

); } interface MediaViewScrapingProps { onStream(stream: MWStream): void; onGoBack(): void; meta: DetailedMeta; selected: SelectedMediaData; } function MediaViewScraping(props: MediaViewScrapingProps) { const { eventLog, stream, pending } = useScrape(props.meta, props.selected); useEffect(() => { if (stream) { props.onStream(stream); } }, [stream, props]); return (
{pending ? ( <>

Finding the best video for you

) : ( <>

Whoops, could't find any videos for you

)}
); } export function MediaView() { const params = useParams<{ media: string }>(); const goBack = useGoBack(); const [meta, setMeta] = useState(null); const [selected, setSelected] = useState(null); const [exec, loading, error] = useLoading(async (mediaParams: string) => { let type: MWMediaType; let id = ""; try { const [t, i] = mediaParams.split("-", 2); type = JWMediaToMediaType(t); id = i; } catch (err) { return null; } return getMetaFromId(type, id); }); const [stream, setStream] = useState(null); useEffect(() => { exec(params.media).then((v) => { setMeta(v ?? null); if (v) setSelected({ type: v.meta.type, episode: 0 as any, season: 0 as any, }); else setSelected(null); }); }, [exec, params.media]); // TODO watched store if (loading) return ; if (error) return ; if (!meta || !selected) return ( ); // scraping view will start scraping and return with onStream if (!stream) return ( ); // show stream once we have a stream return (
); }