From e437a230290144b87a75311dcd2b7be372d11907 Mon Sep 17 00:00:00 2001 From: tapframe Date: Mon, 27 Oct 2025 20:18:33 +0530 Subject: [PATCH] improved hero banner and logo fallback --- src/components/metadata/HeroSection.tsx | 27 ++++++++++++++++++------- src/hooks/useMetadata.ts | 8 ++++++++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/components/metadata/HeroSection.tsx b/src/components/metadata/HeroSection.tsx index 26a5de8..403b39f 100644 --- a/src/components/metadata/HeroSection.tsx +++ b/src/components/metadata/HeroSection.tsx @@ -1088,14 +1088,23 @@ const HeroSection: React.FC = memo(({ logoLoadOpacity.value = withTiming(1, { duration: 300 }); }, []); - // Handle logo load error - only set error if logo hasn't loaded successfully before + // Handle logo load error - implement three-level fallback: TMDB logo → addon logo → text const handleLogoError = useCallback(() => { if (!logoHasLoadedSuccessfully) { - // Only remove logo if it never loaded successfully - setStableLogoUri(null); + // Try addon logo as fallback if TMDB logo fails + const addonLogo = (metadata as any)?.addonLogo; + if (addonLogo && stableLogoUri !== addonLogo) { + // TMDB logo failed, try addon logo + setStableLogoUri(addonLogo); + setLogoHasLoadedSuccessfully(false); // Reset to allow addon logo to try + logoLoadOpacity.value = 0; // Reset fade for new logo attempt + } else { + // No addon logo available, remove logo to show text + setStableLogoUri(null); + } } // If logo loaded successfully before, keep showing it even if it fails later - }, [logoHasLoadedSuccessfully]); + }, [logoHasLoadedSuccessfully, stableLogoUri, metadata, logoLoadOpacity]); // Performance optimization: Lazy loading setup useEffect(() => { @@ -1203,9 +1212,13 @@ const HeroSection: React.FC = memo(({ setImageError(true); setImageLoaded(false); - // Fallback to poster if banner fails - if (bannerImage !== metadata.banner) { - setBannerImage(metadata.banner || metadata.poster); + // Three-level fallback: TMDB → addon banner → poster + if (bannerImage !== metadata.banner && metadata.banner) { + // Try addon banner if not already on it and it exists + setBannerImage(metadata.banner); + } else if (bannerImage !== metadata.poster && metadata.poster) { + // Only use poster if addon banner also failed/missing + setBannerImage(metadata.poster); } }, [shouldLoadSecondaryData, bannerImage, metadata.banner, metadata.poster, setBannerImage]); diff --git a/src/hooks/useMetadata.ts b/src/hooks/useMetadata.ts index 8de18ef..4f38ef7 100644 --- a/src/hooks/useMetadata.ts +++ b/src/hooks/useMetadata.ts @@ -813,6 +813,9 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat // Start with addon metadata let finalMetadata = content.value as StreamingContent; + + // Store addon logo before TMDB enrichment overwrites it + const addonLogo = (finalMetadata as any).logo; // If localization is enabled, merge TMDB localized text (name/overview) before first render try { @@ -947,6 +950,11 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat } // Commit final metadata once and cache it + // Store addon logo as fallback if TMDB enrichment is enabled + if (settings.enrichMetadataWithTMDB && addonLogo) { + (finalMetadata as any).addonLogo = addonLogo; + } + // Clear banner field if TMDB enrichment is enabled to prevent flash if (settings.enrichMetadataWithTMDB) { finalMetadata = {