From 00491c83e559cc978b66ca1ee66dd1e8b1168528 Mon Sep 17 00:00:00 2001 From: tapframe Date: Fri, 20 Jun 2025 02:21:29 +0530 Subject: [PATCH] Enhance ContinueWatchingSection and MetadataScreen with improved logging and Trakt integration This update refines the ContinueWatchingSection by removing excessive console logging, enhancing error handling with a logger, and optimizing the loading process for continue watching items. Additionally, the MetadataScreen now fetches and logs Trakt progress data, providing detailed insights into playback progress for movies and series. This enhancement improves user experience by ensuring accurate tracking of watched content and streamlining the logging process. --- .../home/ContinueWatchingSection.tsx | 100 ++++-------------- src/screens/MetadataScreen.tsx | 100 ++++++++++++++++++ 2 files changed, 119 insertions(+), 81 deletions(-) diff --git a/src/components/home/ContinueWatchingSection.tsx b/src/components/home/ContinueWatchingSection.tsx index 2872d410..f8840ea3 100644 --- a/src/components/home/ContinueWatchingSection.tsx +++ b/src/components/home/ContinueWatchingSection.tsx @@ -80,13 +80,10 @@ const ContinueWatchingSection = React.forwardRef((props, re // Modified loadContinueWatching to be more efficient const loadContinueWatching = useCallback(async () => { try { - console.log('[ContinueWatching] Starting to load continue watching items...'); setLoading(true); const allProgress = await storageService.getAllWatchProgress(); - console.log(`[ContinueWatching] Found ${Object.keys(allProgress).length} progress items in storage`); if (Object.keys(allProgress).length === 0) { - console.log('[ContinueWatching] No progress items found, setting empty array'); setContinueWatchingItems([]); return; } @@ -97,24 +94,16 @@ const ContinueWatchingSection = React.forwardRef((props, re // Process each saved progress for (const key in allProgress) { - console.log(`[ContinueWatching] Raw key from storage: "${key}"`); - // Parse the key to get type and id const keyParts = key.split(':'); - console.log(`[ContinueWatching] Key parts:`, keyParts); - const [type, id, ...episodeIdParts] = keyParts; const episodeId = episodeIdParts.length > 0 ? episodeIdParts.join(':') : undefined; const progress = allProgress[key]; - console.log(`[ContinueWatching] Parsed - type: "${type}", id: "${id}", episodeId: "${episodeId}"`); - // Skip items that are more than 95% complete (effectively finished) const progressPercent = (progress.currentTime / progress.duration) * 100; - console.log(`[ContinueWatching] Progress for ${key}: ${progressPercent.toFixed(1)}%`); if (progressPercent >= 95) { - console.log(`[ContinueWatching] Skipping ${key} - too high progress (${progressPercent.toFixed(1)}%)`); continue; } @@ -122,34 +111,27 @@ const ContinueWatchingSection = React.forwardRef((props, re try { // Validate IMDB ID format before attempting to fetch if (!isValidImdbId(id)) { - console.log(`[ContinueWatching] Skipping ${type}:${id} - invalid IMDB ID format`); return; } - console.log(`[ContinueWatching] Fetching content details for ${type}:${id}`); let content: StreamingContent | null = null; // Get content details using catalogService content = await catalogService.getContentDetails(type, id); if (content) { - console.log(`[ContinueWatching] Successfully fetched content: ${content.name}`); - // Extract season and episode info from episodeId if available let season: number | undefined; let episode: number | undefined; let episodeTitle: string | undefined; if (episodeId && type === 'series') { - console.log(`[ContinueWatching] Parsing episode ID: ${episodeId}`); - // Try different episode ID formats let match = episodeId.match(/s(\d+)e(\d+)/i); // Format: s1e1 if (match) { season = parseInt(match[1], 10); episode = parseInt(match[2], 10); episodeTitle = `Episode ${episode}`; - console.log(`[ContinueWatching] Parsed s1e1 format: S${season}E${episode}`); } else { // Try format: seriesId:season:episode (e.g., tt0108778:4:6) const parts = episodeId.split(':'); @@ -164,14 +146,9 @@ const ContinueWatchingSection = React.forwardRef((props, re season = seasonNum; episode = episodeNum; episodeTitle = `Episode ${episode}`; - console.log(`[ContinueWatching] Parsed colon format: S${season}E${episode}`); } } } - - if (!season || !episode) { - console.log(`[ContinueWatching] Failed to parse episode details from: ${episodeId}`); - } } const continueWatchingItem: ContinueWatchingItem = { @@ -183,31 +160,18 @@ const ContinueWatchingSection = React.forwardRef((props, re episodeTitle }; - console.log(`[ContinueWatching] Created item for ${content.name}:`, { - type, - season, - episode, - episodeTitle, - episodeId, - originalKey: key - }); - if (type === 'series') { // For series, keep only the latest watched episode for each show if (!latestEpisodes[id] || latestEpisodes[id].lastUpdated < progress.lastUpdated) { latestEpisodes[id] = continueWatchingItem; - console.log(`[ContinueWatching] Updated latest episode for series ${id}`); } } else { // For movies, add to the list directly progressItems.push(continueWatchingItem); - console.log(`[ContinueWatching] Added movie to progress items`); } - } else { - console.log(`[ContinueWatching] Failed to fetch content details for ${type}:${id}`); } } catch (error) { - console.error(`[ContinueWatching] Failed to get content details for ${type}:${id}`, error); + logger.error(`Failed to get content details for ${type}:${id}`, error); } })(); @@ -215,35 +179,20 @@ const ContinueWatchingSection = React.forwardRef((props, re } // Wait for all content to be processed - console.log(`[ContinueWatching] Waiting for ${contentPromises.length} content promises...`); await Promise.all(contentPromises); // Add the latest episodes for each series to the items list progressItems.push(...Object.values(latestEpisodes)); - console.log(`[ContinueWatching] Total items after processing: ${progressItems.length}`); // Sort by last updated time (most recent first) progressItems.sort((a, b) => b.lastUpdated - a.lastUpdated); // Limit to 10 items const finalItems = progressItems.slice(0, 10); - console.log(`[ContinueWatching] Final continue watching items: ${finalItems.length}`); - - // Debug: Log the final items with their episode details - finalItems.forEach((item, index) => { - console.log(`[ContinueWatching] Item ${index}:`, { - name: item.name, - type: item.type, - season: item.season, - episode: item.episode, - episodeTitle: item.episodeTitle, - progress: item.progress - }); - }); setContinueWatchingItems(finalItems); } catch (error) { - console.error('[ContinueWatching] Failed to load continue watching items:', error); + logger.error('Failed to load continue watching items:', error); } finally { setLoading(false); } @@ -308,11 +257,9 @@ const ContinueWatchingSection = React.forwardRef((props, re // Properly expose the refresh method React.useImperativeHandle(ref, () => ({ refresh: async () => { - console.log('[ContinueWatching] Refresh method called'); await loadContinueWatching(); // Return whether there are items to help parent determine visibility const hasItems = continueWatchingItems.length > 0; - console.log(`[ContinueWatching] Refresh returning hasItems: ${hasItems}, items count: ${continueWatchingItems.length}`); return hasItems; } })); @@ -379,32 +326,23 @@ const ContinueWatchingSection = React.forwardRef((props, re {/* Episode Info or Year */} {(() => { - console.log(`[ContinueWatching] Rendering item:`, { - name: item.name, - type: item.type, - season: item.season, - episode: item.episode, - episodeTitle: item.episodeTitle, - hasSeasonAndEpisode: !!(item.season && item.episode) - }); - - if (item.type === 'series' && item.season && item.episode) { - return ( - - - Season {item.season} - - {item.episodeTitle && ( - - {item.episodeTitle} - - )} - - ); - } else { + if (item.type === 'series' && item.season && item.episode) { + return ( + + + Season {item.season} + + {item.episodeTitle && ( + + {item.episodeTitle} + + )} + + ); + } else { return ( {item.year} • {item.type === 'movie' ? 'Movie' : 'Series'} diff --git a/src/screens/MetadataScreen.tsx b/src/screens/MetadataScreen.tsx index d6caeb69..73b5d5b3 100644 --- a/src/screens/MetadataScreen.tsx +++ b/src/screens/MetadataScreen.tsx @@ -40,6 +40,7 @@ import MetadataDetails from '../components/metadata/MetadataDetails'; import { useMetadataAnimations } from '../hooks/useMetadataAnimations'; import { useMetadataAssets } from '../hooks/useMetadataAssets'; import { useWatchProgress } from '../hooks/useWatchProgress'; +import { TraktService, TraktPlaybackItem } from '../services/traktService'; const { height } = Dimensions.get('window'); @@ -84,6 +85,105 @@ const MetadataScreen: React.FC = () => { const assetData = useMetadataAssets(metadata, id, type, imdbId, settings, setMetadata); const animations = useMetadataAnimations(safeAreaTop, watchProgressData.watchProgress); + // Fetch and log Trakt progress data when entering the screen + useEffect(() => { + const fetchTraktProgress = async () => { + try { + const traktService = TraktService.getInstance(); + const isAuthenticated = await traktService.isAuthenticated(); + + console.log(`[MetadataScreen] === TRAKT PROGRESS DATA FOR ${type.toUpperCase()}: ${metadata?.name || id} ===`); + console.log(`[MetadataScreen] IMDB ID: ${id}`); + console.log(`[MetadataScreen] Trakt authenticated: ${isAuthenticated}`); + + if (!isAuthenticated) { + console.log(`[MetadataScreen] Not authenticated with Trakt, no progress data available`); + return; + } + + // Get all playback progress from Trakt + const allProgress = await traktService.getPlaybackProgress(); + console.log(`[MetadataScreen] Total Trakt progress items: ${allProgress.length}`); + + if (allProgress.length === 0) { + console.log(`[MetadataScreen] No Trakt progress data found`); + return; + } + + // Filter progress for current content + let relevantProgress: TraktPlaybackItem[] = []; + + if (type === 'movie') { + relevantProgress = allProgress.filter(item => + item.type === 'movie' && + item.movie?.ids.imdb === id.replace('tt', '') + ); + } else if (type === 'series') { + relevantProgress = allProgress.filter(item => + item.type === 'episode' && + item.show?.ids.imdb === id.replace('tt', '') + ); + } + + console.log(`[MetadataScreen] Relevant progress items for this ${type}: ${relevantProgress.length}`); + + if (relevantProgress.length === 0) { + console.log(`[MetadataScreen] No Trakt progress found for this ${type}`); + return; + } + + // Log detailed progress information + relevantProgress.forEach((item, index) => { + console.log(`[MetadataScreen] --- Progress Item ${index + 1} ---`); + console.log(`[MetadataScreen] Type: ${item.type}`); + console.log(`[MetadataScreen] Progress: ${item.progress.toFixed(2)}%`); + console.log(`[MetadataScreen] Paused at: ${item.paused_at}`); + console.log(`[MetadataScreen] Trakt ID: ${item.id}`); + + if (item.movie) { + console.log(`[MetadataScreen] Movie: ${item.movie.title} (${item.movie.year})`); + console.log(`[MetadataScreen] Movie IMDB: tt${item.movie.ids.imdb}`); + console.log(`[MetadataScreen] Movie TMDB: ${item.movie.ids.tmdb}`); + } + + if (item.episode && item.show) { + console.log(`[MetadataScreen] Show: ${item.show.title} (${item.show.year})`); + console.log(`[MetadataScreen] Show IMDB: tt${item.show.ids.imdb}`); + console.log(`[MetadataScreen] Episode: S${item.episode.season}E${item.episode.number} - ${item.episode.title}`); + console.log(`[MetadataScreen] Episode IMDB: ${item.episode.ids.imdb || 'N/A'}`); + console.log(`[MetadataScreen] Episode TMDB: ${item.episode.ids.tmdb || 'N/A'}`); + } + + console.log(`[MetadataScreen] Raw item:`, JSON.stringify(item, null, 2)); + }); + + // Find most recent progress if multiple episodes + if (type === 'series' && relevantProgress.length > 1) { + const mostRecent = relevantProgress.sort((a, b) => + new Date(b.paused_at).getTime() - new Date(a.paused_at).getTime() + )[0]; + + console.log(`[MetadataScreen] === MOST RECENT EPISODE PROGRESS ===`); + if (mostRecent.episode && mostRecent.show) { + console.log(`[MetadataScreen] Most recent: S${mostRecent.episode.season}E${mostRecent.episode.number} - ${mostRecent.episode.title}`); + console.log(`[MetadataScreen] Progress: ${mostRecent.progress.toFixed(2)}%`); + console.log(`[MetadataScreen] Watched on: ${new Date(mostRecent.paused_at).toLocaleString()}`); + } + } + + console.log(`[MetadataScreen] === END TRAKT PROGRESS DATA ===`); + + } catch (error) { + console.error(`[MetadataScreen] Failed to fetch Trakt progress:`, error); + } + }; + + // Only fetch when we have metadata loaded + if (metadata && id) { + fetchTraktProgress(); + } + }, [metadata, id, type]); + // Memoized derived values for performance const isReady = useMemo(() => !loading && metadata && !metadataError, [loading, metadata, metadataError]);