diff --git a/apps/expo/src/app/videoPlayer/loading.tsx b/apps/expo/src/app/videoPlayer/loading.tsx index 92d14d1..9f80504 100644 --- a/apps/expo/src/app/videoPlayer/loading.tsx +++ b/apps/expo/src/app/videoPlayer/loading.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from "react"; import { Text } from "react-native"; import { useLocalSearchParams, useRouter } from "expo-router"; +import type { RunnerEvent } from "@movie-web/provider-utils"; import { getVideoStream, transformSearchResultToScrapeMedia, @@ -24,7 +25,7 @@ function LoadingScreen({ data }: { data: ItemData | null }) { const router = useRouter(); const [eventLog, setEventLog] = useState([]); - const handleEvent = (event: unknown) => { + const handleEvent = (event: RunnerEvent) => { const formattedEvent = formatEvent(event); setEventLog((prevLog) => [...prevLog, formattedEvent]); }; @@ -96,17 +97,32 @@ function LoadingScreen({ data }: { data: ItemData | null }) { ); } -function formatEvent(event: unknown): string { +function formatEvent(event: RunnerEvent): string { if (typeof event === "string") { return `Start: ID - ${event}`; } else if (typeof event === "object" && event !== null) { - const evt = event as Record; - if ("percentage" in evt) { - return `Update: ${String(evt.percentage)}% - Status: ${String(evt.status)}`; - } else if ("sourceIds" in evt) { - return `Initialization: Source IDs - ${String(evt.sourceIds)}`; - } else if ("sourceId" in evt) { - return `Discovered Embeds: Source ID - ${String(evt.sourceId)}`; + if ("percentage" in event) { + const evt = event; + const statusMessage = + evt.status === "success" + ? "Completed" + : evt.status === "failure" + ? "Failed - " + (evt.reason ?? "Unknown Error") + : evt.status === "notfound" + ? "Not Found" + : evt.status === "pending" + ? "In Progress" + : "Unknown Status"; + return `Update: ${evt.percentage}% - Status: ${statusMessage}`; + } else if ("sourceIds" in event) { + const evt = event; + return `Initialization: Source IDs - ${evt.sourceIds.join(" ")}`; + } else if ("sourceId" in event) { + const evt = event; + const embedsInfo = evt.embeds + .map((embed) => `ID: ${embed.id}, Scraper: ${embed.embedScraperId}`) + .join("; "); + return `Discovered Embeds: Source ID - ${evt.sourceId} [${embedsInfo}]`; } } return JSON.stringify(event); diff --git a/packages/provider-utils/src/video.ts b/packages/provider-utils/src/video.ts index 135edd3..8fe74e3 100644 --- a/packages/provider-utils/src/video.ts +++ b/packages/provider-utils/src/video.ts @@ -13,6 +13,34 @@ import { targets, } from "@movie-web/providers"; +export interface InitEvent { + sourceIds: string[]; +} + +export interface UpdateEvent { + id: string; + percentage: number; + status: UpdateEventStatus; + error?: unknown; + reason?: string; +} + +export type UpdateEventStatus = "success" | "failure" | "notfound" | "pending"; + +export interface DiscoverEmbedsEvent { + sourceId: string; + embeds: { + id: string; + embedScraperId: string; + }[]; +} + +export type RunnerEvent = + | string + | InitEvent + | UpdateEvent + | DiscoverEmbedsEvent; + export async function getVideoStream({ media, forceVTT, @@ -20,7 +48,7 @@ export async function getVideoStream({ }: { media: ScrapeMedia; forceVTT?: boolean; - onEvent?: (event: unknown) => void; + onEvent?: (event: RunnerEvent) => void; }): Promise { const providers = makeProviders({ fetcher: makeStandardFetcher(fetch),