import { ProviderControls, ScrapeMedia } from "@movie-web/providers"; import classNames from "classnames"; import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { useMountedState } from "react-use"; import type { AsyncReturnType } from "type-fest"; import { scrapePartsToProviderMetric, useReportProviders, } from "@/backend/helpers/report"; import { Icon, Icons } from "@/components/Icon"; import { Loading } from "@/components/layout/Loading"; import { ScrapeCard, ScrapeItem, } from "@/components/player/internals/ScrapeCard"; import { ScrapingItems, ScrapingSegment, useListCenter, useScrape, } from "@/hooks/useProviderScrape"; import { LargeTextPart } from "@/pages/parts/util/LargeTextPart"; export interface ScrapingProps { media: ScrapeMedia; onGetStream?: (stream: AsyncReturnType) => void; onResult?: ( sources: Record, sourceOrder: ScrapingItems[], ) => void; } export function ScrapingPart(props: ScrapingProps) { const { report } = useReportProviders(); const { startScraping, sourceOrder, sources, currentSource } = useScrape(); const isMounted = useMountedState(); const { t } = useTranslation(); const containerRef = useRef(null); const listRef = useRef(null); const [failedStartScrape, setFailedStartScrape] = useState(false); const renderedOnce = useListCenter( containerRef, listRef, sourceOrder, currentSource, ); const resultRef = useRef({ sourceOrder, sources, }); useEffect(() => { resultRef.current = { sourceOrder, sources, }; }, [sourceOrder, sources]); const started = useRef(false); useEffect(() => { if (started.current) return; started.current = true; (async () => { const output = await startScraping(props.media); if (!isMounted()) return; props.onResult?.( resultRef.current.sources, resultRef.current.sourceOrder, ); report( scrapePartsToProviderMetric( props.media, resultRef.current.sourceOrder, resultRef.current.sources, ), ); props.onGetStream?.(output); })().catch(() => setFailedStartScrape(true)); }, [startScraping, props, report, isMounted]); let currentProviderIndex = sourceOrder.findIndex( (s) => s.id === currentSource || s.children.includes(currentSource ?? ""), ); if (currentProviderIndex === -1) currentProviderIndex = sourceOrder.length - 1; if (failedStartScrape) return ( } > {t("player.turnstile.error")} ); return (
{!sourceOrder || sourceOrder.length === 0 ? (

{t("player.turnstile.verifyingHumanity")}

) : null}
{sourceOrder.map((order) => { const source = sources[order.id]; const distance = Math.abs( sourceOrder.findIndex((o) => o.id === order.id) - currentProviderIndex, ); return (
0} percentage={source.percentage} >
0, })} > {order.children.map((embedId) => { const embed = sources[embedId]; return ( ); })}
); })}
); }