import { ProviderControls, ScrapeMedia } from "@movie-web/providers"; import classNames from "classnames"; import { useEffect, useRef } from "react"; import type { AsyncReturnType } from "type-fest"; import { scrapePartsToProviderMetric, useReportProviders, } from "@/backend/helpers/report"; import { ScrapeCard, ScrapeItem, } from "@/components/player/internals/ScrapeCard"; import { ScrapingItems, ScrapingSegment, useListCenter, useScrape, } from "@/hooks/useProviderScrape"; 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 containerRef = useRef(null); const listRef = useRef(null); 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); props.onResult?.( resultRef.current.sources, resultRef.current.sourceOrder ); report( scrapePartsToProviderMetric( props.media, resultRef.current.sourceOrder, resultRef.current.sources ) ); props.onGetStream?.(output); })(); }, [startScraping, props, report]); const currentProvider = sourceOrder.find( (s) => sources[s.id].status === "pending" ); let currentProviderIndex = sourceOrder.findIndex( (provider) => currentProvider?.id === provider.id ); if (currentProviderIndex === -1) currentProviderIndex = sourceOrder.length - 1; return (
{sourceOrder.map((order) => { const source = sources[order.id]; const distance = Math.abs( sourceOrder.findIndex((t) => t.id === order.id) - currentProviderIndex ); return (
0} percentage={source.percentage} >
0, })} > {order.children.map((embedId) => { const embed = sources[embedId]; return ( ); })}
); })}
); }