From 898c1702df5d9831693155ef4db17cc364d91e09 Mon Sep 17 00:00:00 2001 From: chrisk325 Date: Sun, 15 Mar 2026 16:19:12 +0530 Subject: [PATCH] fix tmdbid and imdbid extractor for special ids --- src/hooks/useMetadata.ts | 49 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/src/hooks/useMetadata.ts b/src/hooks/useMetadata.ts index dd3ba802..f3a1d4f1 100644 --- a/src/hooks/useMetadata.ts +++ b/src/hooks/useMetadata.ts @@ -939,6 +939,22 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat if (finalTmdbId) setTmdbId(finalTmdbId); } + // If the addon returned an imdb_id in its metadata (e.g. Kitsu addon), set it now. + // This ensures imdbId state is populated for Trakt scrobbling even without TMDB enrichment. + if (!imdbId && (finalMetadata as any).imdb_id) { + const resolvedImdb = (finalMetadata as any).imdb_id as string; + setImdbId(resolvedImdb); + // Also resolve tmdbId from the imdb_id if we still don't have it + if (!finalTmdbId) { + const foundTmdbId = await tmdbSvc.findTMDBIdByIMDB(resolvedImdb); + if (foundTmdbId) { + finalTmdbId = foundTmdbId; + setTmdbId(foundTmdbId); + setMetadata(prev => prev ? { ...prev, tmdbId: foundTmdbId } : null); + } + } + } + if (finalTmdbId) { const lang = settings.useTmdbLocalizedMetadata ? (settings.tmdbLanguagePreference || 'en') : 'en'; if (normalizedType === 'movie') { @@ -2230,20 +2246,43 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat // Fetch TMDB ID if needed and then recommendations useEffect(() => { const fetchTmdbIdAndRecommendations = async () => { - if (!settings.enrichMetadataWithTMDB) { + if (!metadata) return; + + const isAnimeId = id.startsWith('kitsu:') || id.startsWith('mal:') || id.startsWith('anilist:'); + + // For anime IDs we always try to resolve tmdbId and imdbId regardless of enrichment setting, + // because they're needed for Trakt scrobbling even when TMDB enrichment is disabled. + if (!settings.enrichMetadataWithTMDB && !isAnimeId) { if (__DEV__) console.log('[useMetadata] enrichment disabled; skip TMDB id extraction (extract path)'); return; } - if (metadata && !tmdbId) { + + if (!tmdbId) { try { - const tmdbService = TMDBService.getInstance(); - const fetchedTmdbId = await tmdbService.extractTMDBIdFromStremioId(id); + const tmdbSvc = TMDBService.getInstance(); + const fetchedTmdbId = await tmdbSvc.extractTMDBIdFromStremioId(id); if (fetchedTmdbId) { if (__DEV__) console.log('[useMetadata] extracted TMDB id from content id', { id, fetchedTmdbId }); setTmdbId(fetchedTmdbId); + + // For anime IDs, also resolve the IMDb ID from TMDB external IDs so Trakt can scrobble + if (isAnimeId && !imdbId) { + try { + const externalIds = await tmdbSvc.getShowExternalIds(fetchedTmdbId); + if (externalIds?.imdb_id) { + if (__DEV__) console.log('[useMetadata] resolved imdbId for anime via TMDB', { id, imdbId: externalIds.imdb_id }); + setImdbId(externalIds.imdb_id); + } + } catch (e) { + if (__DEV__) console.warn('[useMetadata] could not resolve imdbId from TMDB for anime ID', { id }); + } + } + + if (!settings.enrichMetadataWithTMDB) return; // Only needed imdbId, skip enrichment + // Fetch certification only if granular setting is enabled if (settings.tmdbEnrichCertification) { - const certification = await tmdbService.getCertification(normalizedType, fetchedTmdbId); + const certification = await tmdbSvc.getCertification(normalizedType, fetchedTmdbId); if (certification) { if (__DEV__) console.log('[useMetadata] fetched certification via TMDB id (extract path)', { type, fetchedTmdbId, certification }); setMetadata(prev => prev ? {