diff --git a/src/components/home/CatalogSection.tsx b/src/components/home/CatalogSection.tsx index 1a2987d..78b25f8 100644 --- a/src/components/home/CatalogSection.tsx +++ b/src/components/home/CatalogSection.tsx @@ -36,11 +36,8 @@ const calculatePosterLayout = (screenWidth: number) => { const usableWidth = availableWidth - 8; const posterWidth = (usableWidth - (n - 1) * SPACING) / (n + 0.25); - console.log(`[CatalogSection] Testing ${n} posters: width=${posterWidth.toFixed(1)}px, screen=${screenWidth}px`); - if (posterWidth >= MIN_POSTER_WIDTH && posterWidth <= MAX_POSTER_WIDTH) { bestLayout = { numFullPosters: n, posterWidth }; - console.log(`[CatalogSection] Selected layout: ${n} full posters at ${posterWidth.toFixed(1)}px each`); } } diff --git a/src/components/home/ContentItem.tsx b/src/components/home/ContentItem.tsx index 0483bc2..b8d6bc6 100644 --- a/src/components/home/ContentItem.tsx +++ b/src/components/home/ContentItem.tsx @@ -34,11 +34,8 @@ const calculatePosterLayout = (screenWidth: number) => { const usableWidth = availableWidth - 8; const posterWidth = (usableWidth - (n - 1) * SPACING) / (n + 0.25); - console.log(`[ContentItem] Testing ${n} posters: width=${posterWidth.toFixed(1)}px, screen=${screenWidth}px`); - if (posterWidth >= MIN_POSTER_WIDTH && posterWidth <= MAX_POSTER_WIDTH) { bestLayout = { numFullPosters: n, posterWidth }; - console.log(`[ContentItem] Selected layout: ${n} full posters at ${posterWidth.toFixed(1)}px each`); } } diff --git a/src/components/home/FeaturedContent.tsx b/src/components/home/FeaturedContent.tsx index 89389d8..f35fd66 100644 --- a/src/components/home/FeaturedContent.tsx +++ b/src/components/home/FeaturedContent.tsx @@ -355,7 +355,6 @@ const FeaturedContent = ({ featuredContent, isSaved, handleSaveToLibrary }: Feat })); } else { setLogoLoadError(true); - console.warn(`[FeaturedContent] Logo prefetch failed, falling back to text: ${logoUrl}`); } } }; @@ -363,6 +362,20 @@ const FeaturedContent = ({ featuredContent, isSaved, handleSaveToLibrary }: Feat loadImages(); }, [featuredContent?.id, logoUrl]); + const onLogoLoadError = () => { + setLogoLoaded(true); // Treat error as "loaded" to stop spinner + setLogoError(true); + }; + + const handleInfoPress = () => { + if (featuredContent) { + navigation.navigate('Metadata', { + id: featuredContent.id, + type: featuredContent.type + }); + } + }; + if (!featuredContent) { return ; } @@ -412,10 +425,7 @@ const FeaturedContent = ({ featuredContent, isSaved, handleSaveToLibrary }: Feat contentFit="contain" cachePolicy="memory-disk" transition={400} - onError={() => { - console.warn(`[FeaturedContent] Logo failed to load: ${logoUrl}`); - setLogoLoadError(true); - }} + onError={onLogoLoadError} /> ) : ( @@ -473,14 +483,7 @@ const FeaturedContent = ({ featuredContent, isSaved, handleSaveToLibrary }: Feat { - if (featuredContent) { - navigation.navigate('Metadata', { - id: featuredContent.id, - type: featuredContent.type - }); - } - }} + onPress={handleInfoPress} activeOpacity={0.7} > diff --git a/src/hooks/useTraktAutosync.ts b/src/hooks/useTraktAutosync.ts index 299efd4..8955525 100644 --- a/src/hooks/useTraktAutosync.ts +++ b/src/hooks/useTraktAutosync.ts @@ -215,6 +215,7 @@ export function useTraktAutosync(options: TraktAutosyncOptions) { // ENHANCED DEDUPLICATION: Check if we've already stopped this session // However, allow updates if the new progress is significantly higher (>5% improvement) + let isSignificantUpdate = false; if (hasStopped.current) { const currentProgressPercent = duration > 0 ? (currentTime / duration) * 100 : 0; const progressImprovement = currentProgressPercent - lastSyncProgress.current; @@ -223,6 +224,7 @@ export function useTraktAutosync(options: TraktAutosyncOptions) { logger.log(`[TraktAutosync] Session already stopped, but progress improved significantly by ${progressImprovement.toFixed(1)}% (${lastSyncProgress.current.toFixed(1)}% → ${currentProgressPercent.toFixed(1)}%), allowing update`); // Reset stopped flag to allow this significant update hasStopped.current = false; + isSignificantUpdate = true; } else { logger.log(`[TraktAutosync] Already stopped this session, skipping duplicate call (reason: ${reason})`); return; @@ -230,7 +232,8 @@ export function useTraktAutosync(options: TraktAutosyncOptions) { } // ENHANCED DEDUPLICATION: Prevent rapid successive calls (within 5 seconds) - if (now - lastStopCall.current < 5000) { + // Bypass for significant updates + if (!isSignificantUpdate && now - lastStopCall.current < 5000) { logger.log(`[TraktAutosync] Ignoring rapid successive stop call within 5 seconds (reason: ${reason})`); return; } diff --git a/src/screens/HomeScreen.tsx b/src/screens/HomeScreen.tsx index 1601483..75ed40a 100644 --- a/src/screens/HomeScreen.tsx +++ b/src/screens/HomeScreen.tsx @@ -202,8 +202,6 @@ const HomeScreen = () => { items }; - console.log(`[HomeScreen] Loaded catalog: ${displayName} at position ${currentIndex} (${items.length} items)`); - // Update the catalog at its specific position setCatalogs(prevCatalogs => { const newCatalogs = [...prevCatalogs]; @@ -226,7 +224,6 @@ const HomeScreen = () => { } totalCatalogsRef.current = catalogIndex; - console.log(`[HomeScreen] Starting to load ${catalogIndex} enabled catalogs progressively...`); // Initialize catalogs array with proper length setCatalogs(new Array(catalogIndex).fill(null)); @@ -234,10 +231,8 @@ const HomeScreen = () => { // Start all catalog loading promises but don't wait for them // They will update the state progressively as they complete Promise.allSettled(catalogPromises).then(() => { - console.log('[HomeScreen] All catalogs processed'); - // Final cleanup: Filter out null values to get only successfully loaded catalogs - setCatalogs(prevCatalogs => prevCatalogs.filter(catalog => catalog !== null)); + setCatalogs(prevCatalogs => prevCatalogs.filter(catalog => catalog !== null)); }); } catch (error) { @@ -388,37 +383,15 @@ const HomeScreen = () => { }, [featuredContent, navigation]); const refreshContinueWatching = useCallback(async () => { - console.log('[HomeScreen] Refreshing continue watching...'); if (continueWatchingRef.current) { try { const hasContent = await continueWatchingRef.current.refresh(); - console.log(`[HomeScreen] Continue watching has content: ${hasContent}`); setHasContinueWatching(hasContent); - // Debug: Let's check what's in storage - const allProgress = await storageService.getAllWatchProgress(); - console.log('[HomeScreen] All watch progress in storage:', Object.keys(allProgress).length, 'items'); - console.log('[HomeScreen] Watch progress items:', allProgress); - - // Check if any items are being filtered out due to >85% progress - let filteredCount = 0; - for (const [key, progress] of Object.entries(allProgress)) { - const progressPercent = (progress.currentTime / progress.duration) * 100; - if (progressPercent >= 85) { - filteredCount++; - console.log(`[HomeScreen] Filtered out ${key}: ${progressPercent.toFixed(1)}% complete`); - } else { - console.log(`[HomeScreen] Valid progress ${key}: ${progressPercent.toFixed(1)}% complete`); - } - } - console.log(`[HomeScreen] Filtered out ${filteredCount} completed items`); - } catch (error) { console.error('[HomeScreen] Error refreshing continue watching:', error); setHasContinueWatching(false); } - } else { - console.log('[HomeScreen] Continue watching ref is null'); } }, []); @@ -617,11 +590,8 @@ const calculatePosterLayout = (screenWidth: number) => { const usableWidth = availableWidth - 8; const posterWidth = (usableWidth - (n - 1) * SPACING) / (n + 0.25); - console.log(`[HomeScreen] Testing ${n} posters: width=${posterWidth.toFixed(1)}px, screen=${screenWidth}px`); - if (posterWidth >= MIN_POSTER_WIDTH && posterWidth <= MAX_POSTER_WIDTH) { bestLayout = { numFullPosters: n, posterWidth }; - console.log(`[HomeScreen] Selected layout: ${n} full posters at ${posterWidth.toFixed(1)}px each`); } } diff --git a/src/services/stremioService.ts b/src/services/stremioService.ts index 6415c14..bec8078 100644 --- a/src/services/stremioService.ts +++ b/src/services/stremioService.ts @@ -535,13 +535,12 @@ class StremioService { if (hasMetaSupport) { try { - logger.log(`HTTP GET: ${wouldBeUrl} (preferred addon: ${preferredAddon.name})`); + const response = await this.retryRequest(async () => { return await axios.get(wouldBeUrl, { timeout: 10000 }); }); if (response.data && response.data.meta) { - logger.log(`✅ Metadata fetched successfully from preferred addon: ${wouldBeUrl}`); return response.data.meta; } } catch (error) { @@ -564,13 +563,12 @@ class StremioService { for (const baseUrl of cinemetaUrls) { try { const url = `${baseUrl}/meta/${type}/${id}.json`; - logger.log(`HTTP GET: ${url}`); + const response = await this.retryRequest(async () => { return await axios.get(url, { timeout: 10000 }); }); if (response.data && response.data.meta) { - logger.log(`✅ Metadata fetched successfully from: ${url}`); return response.data.meta; } } catch (error) { @@ -619,7 +617,6 @@ class StremioService { }); if (response.data && response.data.meta) { - logger.log(`✅ Metadata fetched successfully from: ${url}`); return response.data.meta; } } catch (error) {