mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-04-21 00:32:04 +00:00
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.
This commit is contained in:
parent
8b3ffc9c16
commit
775fc0459a
2 changed files with 66 additions and 59 deletions
|
|
@ -368,18 +368,6 @@ export const useMetadata = ({ id, type }: UseMetadataProps): UseMetadataReturn =
|
||||||
logger.error('Failed to fetch credits for movie:', error);
|
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);
|
setMetadata(formattedMovie);
|
||||||
cacheService.setMetadata(id, type, formattedMovie);
|
cacheService.setMetadata(id, type, formattedMovie);
|
||||||
const isInLib = catalogService.getLibraryItems().some(item => item.id === id);
|
const isInLib = catalogService.getLibraryItems().some(item => item.id === id);
|
||||||
|
|
@ -496,40 +484,10 @@ export const useMetadata = ({ id, type }: UseMetadataProps): UseMetadataReturn =
|
||||||
setInLibrary(isInLib);
|
setInLibrary(isInLib);
|
||||||
cacheService.setMetadata(id, type, content.value);
|
cacheService.setMetadata(id, type, content.value);
|
||||||
|
|
||||||
// Fetch and add logo from TMDB
|
// Set the final metadata state without fetching logo (this will be handled by MetadataScreen)
|
||||||
let finalMetadata = { ...content.value };
|
setMetadata(content.value);
|
||||||
try {
|
// Update cache
|
||||||
// Get TMDB ID if not already set
|
cacheService.setMetadata(id, type, content.value);
|
||||||
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);
|
|
||||||
|
|
||||||
if (type === 'series') {
|
if (type === 'series') {
|
||||||
// Load series data in parallel with other data
|
// Load series data in parallel with other data
|
||||||
|
|
|
||||||
|
|
@ -259,29 +259,78 @@ const MetadataScreen = () => {
|
||||||
|
|
||||||
// Fetch logo immediately for TMDB content
|
// Fetch logo immediately for TMDB content
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (metadata && id.startsWith('tmdb:') && !metadata.logo) {
|
if (metadata && !metadata.logo) {
|
||||||
const fetchLogo = async () => {
|
const fetchLogo = async () => {
|
||||||
try {
|
try {
|
||||||
const tmdbId = id.split(':')[1];
|
// First try to get logo from Metahub
|
||||||
const tmdbType = type === 'series' ? 'tv' : 'movie';
|
const metahubUrl = `https://images.metahub.space/logo/medium/${imdbId}/img`;
|
||||||
const logoUrl = await TMDBService.getInstance().getContentLogo(tmdbType, tmdbId);
|
|
||||||
|
|
||||||
if (logoUrl) {
|
logger.log(`[MetadataScreen] Attempting to fetch logo from Metahub for ${imdbId}`);
|
||||||
// Update metadata with logo
|
|
||||||
setMetadata(prevMetadata => ({
|
// Test if Metahub logo exists with a HEAD request
|
||||||
...prevMetadata!,
|
try {
|
||||||
logo: logoUrl
|
const response = await fetch(metahubUrl, { method: 'HEAD' });
|
||||||
}));
|
if (response.ok) {
|
||||||
logger.log(`Successfully fetched logo for ${type} ${tmdbId} from TMDB on MetadataScreen`);
|
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) {
|
} 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();
|
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
|
// Function to get episode details from episodeId
|
||||||
const getEpisodeDetails = useCallback((episodeId: string): { seasonNumber: string; episodeNumber: string; episodeName: string } | null => {
|
const getEpisodeDetails = useCallback((episodeId: string): { seasonNumber: string; episodeNumber: string; episodeName: string } | null => {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue