From 7bae3be97516d29dc43aad643cdd4a1f71a22bb3 Mon Sep 17 00:00:00 2001 From: tapframe Date: Wed, 30 Jul 2025 01:13:20 +0530 Subject: [PATCH] better error handling --- src/hooks/useMetadata.ts | 46 +++++++++++++++++++++++++---- src/services/localScraperService.ts | 8 ++--- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/hooks/useMetadata.ts b/src/hooks/useMetadata.ts index 1696b4dd..9ba604f1 100644 --- a/src/hooks/useMetadata.ts +++ b/src/hooks/useMetadata.ts @@ -858,10 +858,27 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat console.log('🎬 [loadStreams] Using ID for Stremio addons:', stremioId); processStremioSource(type, stremioId, false); - // Add a delay before marking loading as complete to give Stremio addons more time - setTimeout(() => { + // Monitor scraper completion status instead of using fixed timeout + const checkScrapersCompletion = () => { + setScraperStatuses(currentStatuses => { + const allCompleted = currentStatuses.every(status => status.hasCompleted || status.error !== null); + if (allCompleted && currentStatuses.length > 0) { + setLoadingStreams(false); + setActiveFetchingScrapers([]); + } + return currentStatuses; + }); + }; + + // Check completion periodically + const completionInterval = setInterval(checkScrapersCompletion, 1000); + + // Fallback timeout after 30 seconds + const fallbackTimeout = setTimeout(() => { + clearInterval(completionInterval); setLoadingStreams(false); - }, 10000); // 10 second delay to allow streams to load + setActiveFetchingScrapers([]); + }, 30000); } catch (error) { console.error('❌ [loadStreams] Failed to load streams:', error); @@ -1010,10 +1027,27 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat console.log('🎬 [loadEpisodeStreams] Using episode ID for Stremio addons:', stremioEpisodeId); processStremioSource('series', stremioEpisodeId, true); - // Add a delay before marking loading as complete to give Stremio addons more time - setTimeout(() => { + // Monitor scraper completion status instead of using fixed timeout + const checkEpisodeScrapersCompletion = () => { + setScraperStatuses(currentStatuses => { + const allCompleted = currentStatuses.every(status => status.hasCompleted || status.error !== null); + if (allCompleted && currentStatuses.length > 0) { + setLoadingEpisodeStreams(false); + setActiveFetchingScrapers([]); + } + return currentStatuses; + }); + }; + + // Check completion periodically + const episodeCompletionInterval = setInterval(checkEpisodeScrapersCompletion, 1000); + + // Fallback timeout after 30 seconds + const episodeFallbackTimeout = setTimeout(() => { + clearInterval(episodeCompletionInterval); setLoadingEpisodeStreams(false); - }, 10000); // 10 second delay to allow streams to load + setActiveFetchingScrapers([]); + }, 30000); } catch (error) { console.error('❌ [loadEpisodeStreams] Failed to load episode streams:', error); diff --git a/src/services/localScraperService.ts b/src/services/localScraperService.ts index 96d2cd50..ea8b24c4 100644 --- a/src/services/localScraperService.ts +++ b/src/services/localScraperService.ts @@ -577,11 +577,7 @@ class LocalScraperService { URL_VALIDATION_ENABLED: urlValidationEnabled }; - // Execute the scraper code with timeout - const timeoutPromise = new Promise((_, reject) => { - setTimeout(() => reject(new Error('Scraper execution timeout')), 60000); // 60 second timeout - }); - + // Execute the scraper code without timeout const executionPromise = new Promise((resolve, reject) => { try { // Create function from code @@ -614,7 +610,7 @@ class LocalScraperService { } }); - return await Promise.race([executionPromise, timeoutPromise]) as LocalScraperResult[]; + return await executionPromise; } catch (error) { logger.error('[LocalScraperService] Sandbox execution failed:', error);