2023-10-05 22:12:25 +02:00
|
|
|
import { ProviderControls, ScrapeMedia } from "@movie-web/providers";
|
2023-10-06 00:20:19 +02:00
|
|
|
import classNames from "classnames";
|
|
|
|
import { useEffect, useRef } from "react";
|
2023-10-05 22:12:25 +02:00
|
|
|
import type { AsyncReturnType } from "type-fest";
|
2023-10-01 21:08:26 +02:00
|
|
|
|
2023-10-02 21:04:40 +02:00
|
|
|
import { usePlayer } from "@/components/player/hooks/usePlayer";
|
2023-10-06 00:01:35 +02:00
|
|
|
import {
|
|
|
|
ScrapeCard,
|
|
|
|
ScrapeItem,
|
|
|
|
} from "@/components/player/internals/ScrapeCard";
|
2023-10-06 00:20:19 +02:00
|
|
|
import { useListCenter, useScrape } from "@/hooks/useProviderScrape";
|
2023-10-01 21:08:26 +02:00
|
|
|
|
|
|
|
export interface ScrapingProps {
|
|
|
|
media: ScrapeMedia;
|
2023-10-05 22:12:25 +02:00
|
|
|
onGetStream?: (stream: AsyncReturnType<ProviderControls["runAll"]>) => void;
|
2023-10-01 21:08:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export function ScrapingPart(props: ScrapingProps) {
|
2023-10-02 21:04:40 +02:00
|
|
|
const { playMedia } = usePlayer();
|
2023-10-06 00:01:35 +02:00
|
|
|
const { startScraping, sourceOrder, sources, currentSource } = useScrape();
|
|
|
|
|
|
|
|
const containerRef = useRef<HTMLDivElement | null>(null);
|
|
|
|
const listRef = useRef<HTMLDivElement | null>(null);
|
2023-10-06 00:20:19 +02:00
|
|
|
const renderedOnce = useListCenter(
|
|
|
|
containerRef,
|
|
|
|
listRef,
|
|
|
|
sourceOrder,
|
|
|
|
currentSource
|
|
|
|
);
|
2023-10-01 21:08:26 +02:00
|
|
|
|
2023-10-02 21:04:40 +02:00
|
|
|
const started = useRef(false);
|
|
|
|
useEffect(() => {
|
|
|
|
if (started.current) return;
|
|
|
|
started.current = true;
|
|
|
|
(async () => {
|
|
|
|
const output = await startScraping(props.media);
|
2023-10-05 22:12:25 +02:00
|
|
|
props.onGetStream?.(output);
|
2023-10-02 21:04:40 +02:00
|
|
|
})();
|
|
|
|
}, [startScraping, props, playMedia]);
|
|
|
|
|
2023-10-01 21:08:26 +02:00
|
|
|
return (
|
2023-10-06 00:01:35 +02:00
|
|
|
<div className="h-full w-full relative" ref={containerRef}>
|
2023-10-06 00:20:19 +02:00
|
|
|
<div
|
|
|
|
className={classNames({
|
|
|
|
"absolute transition-[transform,opacity] opacity-0": true,
|
|
|
|
"!opacity-100": renderedOnce,
|
|
|
|
})}
|
|
|
|
ref={listRef}
|
|
|
|
>
|
2023-10-06 00:01:35 +02:00
|
|
|
{sourceOrder.map((order) => {
|
|
|
|
const source = sources[order.id];
|
|
|
|
return (
|
|
|
|
<ScrapeCard
|
|
|
|
id={order.id}
|
|
|
|
name={source.name}
|
|
|
|
status={source.status}
|
|
|
|
hasChildren={order.children.length > 0}
|
|
|
|
percentage={source.percentage}
|
|
|
|
key={order.id}
|
|
|
|
>
|
|
|
|
{order.children.map((embedId) => {
|
|
|
|
const embed = sources[embedId];
|
|
|
|
return (
|
|
|
|
<ScrapeItem
|
|
|
|
id={embedId}
|
|
|
|
name={embed.name}
|
|
|
|
status={source.status}
|
|
|
|
percentage={embed.percentage}
|
|
|
|
key={embedId}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
</ScrapeCard>
|
2023-10-03 20:24:09 +02:00
|
|
|
);
|
2023-10-06 00:01:35 +02:00
|
|
|
})}
|
|
|
|
</div>
|
2023-10-01 21:08:26 +02:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|