From 775fc0459ad719a1ce2965defff37fe3c5c0dbed Mon Sep 17 00:00:00 2001 From: Nayif Noushad Date: Tue, 22 Apr 2025 16:24:06 +0530 Subject: [PATCH] Refactor logo fetching logic in useMetadata and MetadataScreen; remove direct TMDB logo fetching from useMetadata, and implement a fallback mechanism in MetadataScreen to first attempt fetching logos from Metahub before falling back to TMDB. Enhance logging for better debugging and maintainability. --- src/hooks/useMetadata.ts | 50 ++--------------------- src/screens/MetadataScreen.tsx | 75 ++++++++++++++++++++++++++++------ 2 files changed, 66 insertions(+), 59 deletions(-) diff --git a/src/hooks/useMetadata.ts b/src/hooks/useMetadata.ts index cef08d86a..6bc3db7bf 100644 --- a/src/hooks/useMetadata.ts +++ b/src/hooks/useMetadata.ts @@ -368,18 +368,6 @@ export const useMetadata = ({ id, type }: UseMetadataProps): UseMetadataReturn = logger.error('Failed to fetch credits for movie:', error); } - // Fetch movie logo from TMDB - try { - const logoUrl = await tmdbService.getMovieImages(tmdbId); - if (logoUrl) { - formattedMovie.logo = logoUrl; - logger.log(`Successfully fetched logo for movie ${tmdbId} from TMDB`); - } - } catch (error) { - logger.error('Failed to fetch logo from TMDB:', error); - // Continue with execution, logo is optional - } - setMetadata(formattedMovie); cacheService.setMetadata(id, type, formattedMovie); const isInLib = catalogService.getLibraryItems().some(item => item.id === id); @@ -496,40 +484,10 @@ export const useMetadata = ({ id, type }: UseMetadataProps): UseMetadataReturn = setInLibrary(isInLib); cacheService.setMetadata(id, type, content.value); - // Fetch and add logo from TMDB - let finalMetadata = { ...content.value }; - try { - // Get TMDB ID if not already set - const contentTmdbId = await tmdbService.extractTMDBIdFromStremioId(id); - if (contentTmdbId) { - // Determine content type for TMDB API (movie or tv) - const tmdbType = type === 'series' ? 'tv' : 'movie'; - // Fetch logo from TMDB - const logoUrl = await tmdbService.getContentLogo(tmdbType, contentTmdbId); - if (logoUrl) { - // Update metadata with logo - finalMetadata.logo = logoUrl; - logger.log(`[useMetadata] Successfully fetched and set logo from TMDB for ${id}`); - } else { - // If TMDB has no logo, ensure logo property is null/undefined - finalMetadata.logo = undefined; - logger.log(`[useMetadata] No logo found on TMDB for ${id}. Setting logo to undefined.`); - } - } else { - // If we couldn't get a TMDB ID, ensure logo is null/undefined - finalMetadata.logo = undefined; - logger.log(`[useMetadata] Could not determine TMDB ID for ${id}. Setting logo to undefined.`); - } - } catch (error) { - logger.error(`[useMetadata] Error fetching logo from TMDB for ${id}:`, error); - // Ensure logo is null/undefined on error - finalMetadata.logo = undefined; - } - - // Set the final metadata state - setMetadata(finalMetadata); - // Update cache with final metadata (including potentially nulled logo) - cacheService.setMetadata(id, type, finalMetadata); + // Set the final metadata state without fetching logo (this will be handled by MetadataScreen) + setMetadata(content.value); + // Update cache + cacheService.setMetadata(id, type, content.value); if (type === 'series') { // Load series data in parallel with other data diff --git a/src/screens/MetadataScreen.tsx b/src/screens/MetadataScreen.tsx index 66326644b..82d8ce92d 100644 --- a/src/screens/MetadataScreen.tsx +++ b/src/screens/MetadataScreen.tsx @@ -259,29 +259,78 @@ const MetadataScreen = () => { // Fetch logo immediately for TMDB content useEffect(() => { - if (metadata && id.startsWith('tmdb:') && !metadata.logo) { + if (metadata && !metadata.logo) { const fetchLogo = async () => { try { - const tmdbId = id.split(':')[1]; - const tmdbType = type === 'series' ? 'tv' : 'movie'; - const logoUrl = await TMDBService.getInstance().getContentLogo(tmdbType, tmdbId); + // First try to get logo from Metahub + const metahubUrl = `https://images.metahub.space/logo/medium/${imdbId}/img`; - if (logoUrl) { - // Update metadata with logo - setMetadata(prevMetadata => ({ - ...prevMetadata!, - logo: logoUrl - })); - logger.log(`Successfully fetched logo for ${type} ${tmdbId} from TMDB on MetadataScreen`); + logger.log(`[MetadataScreen] Attempting to fetch logo from Metahub for ${imdbId}`); + + // Test if Metahub logo exists with a HEAD request + try { + const response = await fetch(metahubUrl, { method: 'HEAD' }); + if (response.ok) { + logger.log(`[MetadataScreen] Successfully fetched logo from Metahub: + - Content ID: ${id} + - Content Type: ${type} + - Logo URL: ${metahubUrl} + `); + + // Update metadata with Metahub logo + setMetadata(prevMetadata => ({ + ...prevMetadata!, + logo: metahubUrl + })); + return; // Exit if Metahub logo was found + } + } catch (metahubError) { + logger.warn(`[MetadataScreen] Failed to fetch logo from Metahub:`, metahubError); + } + + // If Metahub fails, try TMDB as fallback + if (id.startsWith('tmdb:')) { + const tmdbId = id.split(':')[1]; + const tmdbType = type === 'series' ? 'tv' : 'movie'; + + logger.log(`[MetadataScreen] Attempting to fetch logo from TMDB as fallback for ${tmdbType} (ID: ${tmdbId})`); + + const logoUrl = await TMDBService.getInstance().getContentLogo(tmdbType, tmdbId); + + if (logoUrl) { + logger.log(`[MetadataScreen] Successfully fetched fallback logo from TMDB: + - Content Type: ${tmdbType} + - TMDB ID: ${tmdbId} + - Logo URL: ${logoUrl} + `); + + // Update metadata with TMDB logo + setMetadata(prevMetadata => ({ + ...prevMetadata!, + logo: logoUrl + })); + } else { + logger.warn(`[MetadataScreen] No logo found from either Metahub or TMDB for ${type} (ID: ${id})`); + } } } catch (error) { - logger.error('Failed to fetch logo in MetadataScreen:', error); + logger.error('[MetadataScreen] Failed to fetch logo from all sources:', { + error, + contentId: id, + contentType: type + }); } }; fetchLogo(); + } else if (metadata?.logo) { + logger.log(`[MetadataScreen] Using existing logo from metadata: + - Content ID: ${id} + - Content Type: ${type} + - Logo URL: ${metadata.logo} + `); } - }, [id, type, metadata, setMetadata]); + }, [id, type, metadata, setMetadata, imdbId]); // Function to get episode details from episodeId const getEpisodeDetails = useCallback((episodeId: string): { seasonNumber: string; episodeNumber: string; episodeName: string } | null => {