From 0576c9fed0dbb6160365c3d5c74665d0fcbb8c66 Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Wed, 3 Dec 2025 18:20:04 -0700 Subject: [PATCH] Revert "feat: add skip source button during scraping" This reverts commit bf14a85f3433fc4bee90c205d900c6bb65b7f409. --- src/assets/locales/en.json | 1 - src/backend/helpers/report.ts | 1 - src/backend/providers/fetchers.ts | 14 +--- .../player/internals/ScrapeCard.tsx | 10 +-- src/hooks/useProviderScrape.tsx | 67 +--------------- src/pages/PlayerView.tsx | 32 +------- src/pages/parts/player/PlayerPart.tsx | 9 +-- src/pages/parts/player/ScrapingPart.tsx | 78 +++++-------------- src/stores/player/slices/source.ts | 1 - 9 files changed, 29 insertions(+), 184 deletions(-) diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index 6142b4cb..16aebae3 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -852,7 +852,6 @@ "title": "Failed to play video!" }, "scraping": { - "skip": "Skip source", "items": { "failure": "Error occurred", "notFound": "Doesn't have the video (╥﹏╥)", diff --git a/src/backend/helpers/report.ts b/src/backend/helpers/report.ts index 65cc88f8..b4bdb5bf 100644 --- a/src/backend/helpers/report.ts +++ b/src/backend/helpers/report.ts @@ -65,7 +65,6 @@ const segmentStatusMap: Record< failure: "failed", pending: null, waiting: null, - skipped: "notfound", }; export function scrapeSourceOutputToProviderMetric( diff --git a/src/backend/providers/fetchers.ts b/src/backend/providers/fetchers.ts index d9ac59dc..cd345577 100644 --- a/src/backend/providers/fetchers.ts +++ b/src/backend/providers/fetchers.ts @@ -1,7 +1,6 @@ import { Fetcher, makeSimpleProxyFetcher, - makeStandardFetcher, setM3U8ProxyUrl, } from "@p-stream/providers"; @@ -83,19 +82,8 @@ export function setupM3U8Proxy() { export function makeLoadBalancedSimpleProxyFetcher() { const fetcher: Fetcher = async (a, b) => { - const proxyUrl = getLoadbalancedProxyUrl(); - - // If no proxy URL is available, fall back to direct fetch - if (!proxyUrl) { - console.warn( - "[makeLoadBalancedSimpleProxyFetcher] No proxy URL available, using direct fetch", - ); - const directFetcher = makeStandardFetcher(fetchButWithApiTokens); - return directFetcher(a, b); - } - const currentFetcher = makeSimpleProxyFetcher( - proxyUrl, + getLoadbalancedProxyUrl(), fetchButWithApiTokens, ); return currentFetcher(a, b); diff --git a/src/components/player/internals/ScrapeCard.tsx b/src/components/player/internals/ScrapeCard.tsx index 55263a9f..dc057901 100644 --- a/src/components/player/internals/ScrapeCard.tsx +++ b/src/components/player/internals/ScrapeCard.tsx @@ -9,13 +9,7 @@ import { import { Transition } from "@/components/utils/Transition"; export interface ScrapeItemProps { - status: - | "failure" - | "pending" - | "notfound" - | "success" - | "waiting" - | "skipped"; + status: "failure" | "pending" | "notfound" | "success" | "waiting"; name: string; id?: string; percentage?: number; @@ -30,7 +24,6 @@ const statusTextMap: Partial> = { notfound: "player.scraping.items.notFound", failure: "player.scraping.items.failure", pending: "player.scraping.items.pending", - skipped: "player.scraping.items.notFound", }; const statusMap: Record = @@ -40,7 +33,6 @@ const statusMap: Record = pending: "loading", success: "success", waiting: "waiting", - skipped: "noresult", }; export function ScrapeItem(props: ScrapeItemProps) { diff --git a/src/hooks/useProviderScrape.tsx b/src/hooks/useProviderScrape.tsx index 5c3580de..2492f6b9 100644 --- a/src/hooks/useProviderScrape.tsx +++ b/src/hooks/useProviderScrape.tsx @@ -22,13 +22,7 @@ export interface ScrapingSegment { name: string; id: string; embedId?: string; - status: - | "failure" - | "pending" - | "notfound" - | "success" - | "waiting" - | "skipped"; + status: "failure" | "pending" | "notfound" | "success" | "waiting"; reason?: string; error?: any; percentage: number; @@ -42,7 +36,6 @@ function useBaseScrape() { const [sources, setSources] = useState>({}); const [sourceOrder, setSourceOrder] = useState([]); const [currentSource, setCurrentSource] = useState(); - const abortControllerRef = useRef(null); const lastId = useRef(null); const initEvent = useCallback((evt: ScraperEvent<"init">) => { @@ -71,16 +64,12 @@ function useBaseScrape() { const lastIdTmp = lastId.current; setSources((s) => { if (s[id]) s[id].status = "pending"; - // Only mark as success if it's pending - don't overwrite skipped status - if (lastIdTmp && s[lastIdTmp] && s[lastIdTmp].status === "pending") { + if (lastIdTmp && s[lastIdTmp] && s[lastIdTmp].status === "pending") s[lastIdTmp].status = "success"; - } return { ...s }; }); setCurrentSource(id); lastId.current = id; - // Create new AbortController for this source - abortControllerRef.current = new AbortController(); }, []); const updateEvent = useCallback((evt: ScraperEvent<"update">) => { @@ -139,35 +128,6 @@ function useBaseScrape() { return output; }, []); - const skipCurrentSource = useCallback(() => { - if (currentSource) { - // Get the parent source ID (remove embed suffix like "-0", "-1", etc.) - const parentSourceId = currentSource.split("-")[0]; - - // Abort the current operation FIRST - abort all pending requests immediately - if (abortControllerRef.current) { - abortControllerRef.current.abort(); - } - - // Mark the parent source and all its embeds as skipped AFTER aborting - // This ensures the abort happens immediately and can interrupt ongoing operations - setSources((s) => { - Object.keys(s).forEach((key) => { - // Check if this is the parent source or one of its embeds - if (key === parentSourceId || key.startsWith(`${parentSourceId}-`)) { - if (s[key]) { - // Mark as skipped regardless of current status (even if it succeeded) - s[key].status = "skipped"; - s[key].reason = "Skipped by user"; - s[key].percentage = 100; - } - } - }); - return { ...s }; - }); - } - }, [currentSource]); - return { initEvent, startEvent, @@ -178,8 +138,6 @@ function useBaseScrape() { sources, sourceOrder, currentSource, - skipCurrentSource, - abortControllerRef, }; } @@ -194,8 +152,6 @@ export function useScrape() { getResult, startEvent, startScrape, - skipCurrentSource, - abortControllerRef, } = useBaseScrape(); const preferredSourceOrder = usePreferencesStore((s) => s.sourceOrder); @@ -215,7 +171,6 @@ export function useScrape() { async (media: ScrapeMedia, startFromSourceId?: string) => { const providerInstance = getProviders(); const allSources = providerInstance.listSources(); - const playerState = usePlayerStore.getState(); const failedSources = playerState.failedSources; const failedEmbeds = playerState.failedEmbeds; @@ -279,7 +234,6 @@ export function useScrape() { : undefined; const providerApiUrl = getLoadbalancedProviderApiUrl(); - if (providerApiUrl && !isExtensionActiveCached()) { startScrape(); const baseUrlMaker = makeProviderUrl(providerApiUrl); @@ -304,25 +258,10 @@ export function useScrape() { startScrape(); const providers = getProviders(); - - // Create initial abort controller if it doesn't exist - if (!abortControllerRef.current) { - abortControllerRef.current = new AbortController(); - } - - // Create a wrapper that always gets the current abort controller - const getCurrentAbortController = () => abortControllerRef.current; - const output = await providers.runAll({ media, sourceOrder: filteredSourceOrder, embedOrder: filteredEmbedOrder, - abortController: { - get signal() { - const controller = getCurrentAbortController(); - return controller ? controller.signal : undefined; - }, - } as AbortController, events: { init: initEvent, start: startEvent, @@ -349,7 +288,6 @@ export function useScrape() { preferredEmbedOrder, enableEmbedOrder, disabledEmbeds, - abortControllerRef, ], ); @@ -366,7 +304,6 @@ export function useScrape() { sourceOrder, sources, currentSource, - skipCurrentSource, }; } diff --git a/src/pages/PlayerView.tsx b/src/pages/PlayerView.tsx index d28ad646..9ceabcc9 100644 --- a/src/pages/PlayerView.tsx +++ b/src/pages/PlayerView.tsx @@ -38,7 +38,6 @@ export function RealPlayerView() { episode?: string; season?: string; }>(); - const [skipSourceFn, setSkipSourceFn] = useState<(() => void) | null>(null); const [errorData, setErrorData] = useState<{ sources: Record; sourceOrder: ScrapingItems[]; @@ -205,11 +204,7 @@ export function RealPlayerView() { ); return ( - + {status === playerStatus.IDLE ? ( ) : null} @@ -228,7 +223,6 @@ export function RealPlayerView() { key={`scraping-${resumeFromSourceId || "default"}`} media={scrapeMedia} startFromSourceId={resumeFromSourceId || undefined} - onSkipSourceReady={(fn) => setSkipSourceFn(() => fn)} onResult={(sources, sourceOrder) => { setErrorData({ sourceOrder, @@ -238,29 +232,7 @@ export function RealPlayerView() { // Clear resume state after scraping setResumeFromSourceId(null); }} - onGetStream={(out, sources) => { - // Check if the source was skipped by user - if (out) { - const outSourceId = out.sourceId; - const parentSourceId = outSourceId.split("-")[0]; - - // Check both the parent and the specific embed - const parentData = sources[parentSourceId]; - const embedData = sources[outSourceId]; - - // If the source or embed was skipped by user, don't play it - // Just ignore the result and let scraping continue to next source - if ( - parentData?.status === "skipped" || - embedData?.status === "skipped" || - parentData?.reason === "Skipped by user" || - embedData?.reason === "Skipped by user" - ) { - return; - } - } - playAfterScrape(out); - }} + onGetStream={playAfterScrape} /> ) ) : null} diff --git a/src/pages/parts/player/PlayerPart.tsx b/src/pages/parts/player/PlayerPart.tsx index bb41f432..66c7234f 100644 --- a/src/pages/parts/player/PlayerPart.tsx +++ b/src/pages/parts/player/PlayerPart.tsx @@ -20,7 +20,6 @@ export interface PlayerPartProps { backUrl: string; onLoad?: () => void; onMetaChange?: (meta: PlayerMeta) => void; - skipSourceFn?: (() => void) | null; } export function PlayerPart(props: PlayerPartProps) { @@ -140,15 +139,11 @@ export function PlayerPart(props: PlayerPartProps) { - + {status !== playerStatus.PLAYING && !manualSourceSelection && }
{status === playerStatus.SCRAPING ? ( - + ) : null} {status === playerStatus.PLAYING ? ( <> diff --git a/src/pages/parts/player/ScrapingPart.tsx b/src/pages/parts/player/ScrapingPart.tsx index 6b8bc6df..68f572b5 100644 --- a/src/pages/parts/player/ScrapingPart.tsx +++ b/src/pages/parts/player/ScrapingPart.tsx @@ -26,28 +26,18 @@ import { WarningPart } from "../util/WarningPart"; export interface ScrapingProps { media: ScrapeMedia; - onGetStream?: ( - stream: AsyncReturnType, - sources: Record, - ) => void; + onGetStream?: (stream: AsyncReturnType) => void; onResult?: ( sources: Record, sourceOrder: ScrapingItems[], ) => void; startFromSourceId?: string; - onSkipSourceReady?: (skipFn: () => void) => void; } export function ScrapingPart(props: ScrapingProps) { const { report } = useReportProviders(); - const { - startScraping, - resumeScraping, - sourceOrder, - sources, - currentSource, - skipCurrentSource, - } = useScrape(); + const { startScraping, resumeScraping, sourceOrder, sources, currentSource } = + useScrape(); const isMounted = useMountedState(); const { t } = useTranslation(); @@ -73,44 +63,30 @@ export function ScrapingPart(props: ScrapingProps) { }, [sourceOrder, sources]); const started = useRef(null); - - // Pass skip function to parent - useEffect(() => { - props.onSkipSourceReady?.(skipCurrentSource); - }, [skipCurrentSource, props]); - useEffect(() => { // Only start scraping if we haven't started with this startFromSourceId before const currentKey = props.startFromSourceId || "default"; - if (started.current === currentKey) { - return; - } + if (started.current === currentKey) return; started.current = currentKey; (async () => { - try { - const output = props.startFromSourceId - ? await resumeScraping(props.media, props.startFromSourceId) - : await startScraping(props.media); - if (!isMounted()) { - return; - } - props.onResult?.( - resultRef.current.sources, + const output = props.startFromSourceId + ? await resumeScraping(props.media, props.startFromSourceId) + : await startScraping(props.media); + if (!isMounted()) return; + props.onResult?.( + resultRef.current.sources, + resultRef.current.sourceOrder, + ); + report( + scrapePartsToProviderMetric( + props.media, resultRef.current.sourceOrder, - ); - report( - scrapePartsToProviderMetric( - props.media, - resultRef.current.sourceOrder, - resultRef.current.sources, - ), - ); - props.onGetStream?.(output, resultRef.current.sources); - } catch (error) { - setFailedStartScrape(true); - } - })(); + resultRef.current.sources, + ), + ); + props.onGetStream?.(output); + })().catch(() => setFailedStartScrape(true)); }, [startScraping, resumeScraping, props, report, isMounted]); let currentProviderIndex = sourceOrder.findIndex( @@ -186,9 +162,7 @@ export function ScrapingPart(props: ScrapingProps) { ); } -export function ScrapingPartInterruptButton(props: { - skipCurrentSource?: () => void; -}) { +export function ScrapingPartInterruptButton() { const { t } = useTranslation(); return ( @@ -209,16 +183,6 @@ export function ScrapingPartInterruptButton(props: { > {t("notFound.reloadButton")} - {props.skipCurrentSource && ( - - )}
); } diff --git a/src/stores/player/slices/source.ts b/src/stores/player/slices/source.ts index 63270e24..41de37e6 100644 --- a/src/stores/player/slices/source.ts +++ b/src/stores/player/slices/source.ts @@ -1,5 +1,4 @@ /* eslint-disable no-console */ - import { ScrapeMedia } from "@p-stream/providers"; import { MakeSlice } from "@/stores/player/slices/types";