metascreen optimization

This commit is contained in:
tapframe 2025-12-09 14:32:33 +05:30
parent 057c709b41
commit 1b990aa6ec
2 changed files with 1001 additions and 995 deletions

View file

@ -573,10 +573,16 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat
inLibrary: false,
};
// Fetch credits to get director and crew information
try {
const credits = await tmdbService.getCredits(parseInt(tmdbId), 'movie');
if (credits && credits.crew) {
// OPTIMIZATION: Fetch credits and logo in parallel instead of sequentially
const preferredLanguage = settings.tmdbLanguagePreference || 'en';
const [creditsResult, logoResult] = await Promise.allSettled([
tmdbService.getCredits(parseInt(tmdbId), 'movie'),
tmdbService.getContentLogo('movie', tmdbId, preferredLanguage)
]);
// Process credits result
if (creditsResult.status === 'fulfilled' && creditsResult.value?.crew) {
const credits = creditsResult.value;
// Extract directors
const directors = credits.crew
.filter((person: any) => person.job === 'Director')
@ -597,20 +603,17 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat
(formattedMovie as any).creators = writers;
(formattedMovie as any).writer = writers;
}
}
} catch (error) {
logger.error('Failed to fetch credits for movie:', error);
} else if (creditsResult.status === 'rejected') {
logger.error('Failed to fetch credits for movie:', creditsResult.reason);
}
// Fetch movie logo from TMDB
try {
const preferredLanguage = settings.tmdbLanguagePreference || 'en';
const logoUrl = await tmdbService.getContentLogo('movie', tmdbId, preferredLanguage);
formattedMovie.logo = logoUrl || undefined; // TMDB logo or undefined (no addon fallback)
// Process logo result
if (logoResult.status === 'fulfilled') {
formattedMovie.logo = logoResult.value || undefined;
if (__DEV__) logger.log(`Successfully fetched logo for movie ${tmdbId} from TMDB`);
} catch (error) {
logger.error('Failed to fetch logo from TMDB:', error);
formattedMovie.logo = undefined; // Error means no logo
} else {
logger.error('Failed to fetch logo from TMDB:', logoResult.reason);
formattedMovie.logo = undefined;
}
setMetadata(formattedMovie);
@ -633,8 +636,15 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat
settings.useTmdbLocalizedMetadata ? `${settings.tmdbLanguagePreference || 'en'}-US` : 'en-US'
);
if (showDetails) {
// Get external IDs to check for IMDb ID
const externalIds = await tmdbService.getShowExternalIds(parseInt(tmdbId));
// OPTIMIZATION: Fetch external IDs, credits, and logo in parallel
const preferredLanguage = settings.tmdbLanguagePreference || 'en';
const [externalIdsResult, creditsResult, logoResult] = await Promise.allSettled([
tmdbService.getShowExternalIds(parseInt(tmdbId)),
tmdbService.getCredits(parseInt(tmdbId), 'series'),
tmdbService.getContentLogo('tv', tmdbId, preferredLanguage)
]);
const externalIds = externalIdsResult.status === 'fulfilled' ? externalIdsResult.value : null;
const imdbId = externalIds?.imdb_id;
if (imdbId) {
@ -657,10 +667,9 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat
inLibrary: false,
};
// Fetch credits to get creators
try {
const credits = await tmdbService.getCredits(parseInt(tmdbId), 'series');
if (credits && credits.crew) {
// Process credits result (already fetched in parallel)
if (creditsResult.status === 'fulfilled' && creditsResult.value?.crew) {
const credits = creditsResult.value;
// Extract creators
const creators = credits.crew
.filter((person: any) =>
@ -674,20 +683,17 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat
if (creators.length > 0) {
(formattedShow as any).creators = creators.slice(0, 3);
}
}
} catch (error) {
logger.error('Failed to fetch credits for TV show:', error);
} else if (creditsResult.status === 'rejected') {
logger.error('Failed to fetch credits for TV show:', creditsResult.reason);
}
// Fetch TV show logo from TMDB
try {
const preferredLanguage = settings.tmdbLanguagePreference || 'en';
const logoUrl = await tmdbService.getContentLogo('tv', tmdbId, preferredLanguage);
formattedShow.logo = logoUrl || undefined; // TMDB logo or undefined (no addon fallback)
// Process logo result (already fetched in parallel)
if (logoResult.status === 'fulfilled') {
formattedShow.logo = logoResult.value || undefined;
if (__DEV__) logger.log(`Successfully fetched logo for TV show ${tmdbId} from TMDB`);
} catch (error) {
logger.error('Failed to fetch logo from TMDB:', error);
formattedShow.logo = undefined; // Error means no logo
} else {
logger.error('Failed to fetch logo from TMDB:', (logoResult as PromiseRejectedResult).reason);
formattedShow.logo = undefined;
}
setMetadata(formattedShow);

View file

@ -242,7 +242,7 @@ const MetadataScreen: React.FC = () => {
if (!loadingCast) {
if (cast && cast.length > 0) {
setPostCastDelayDone(false);
const t = setTimeout(() => setPostCastDelayDone(true), 800);
const t = setTimeout(() => setPostCastDelayDone(true), 200);
return () => clearTimeout(t);
} else {
// If no cast present, no need to delay
@ -376,7 +376,7 @@ const MetadataScreen: React.FC = () => {
interactionComplete.current = true;
});
}
}, 100);
}, 50);
return () => {
setIsScreenFocused(false);
@ -405,7 +405,7 @@ const MetadataScreen: React.FC = () => {
if (metadata && isScreenFocused && !shouldLoadSecondaryData) {
const timer = setTimeout(() => {
setShouldLoadSecondaryData(true);
}, 300);
}, 100);
return () => clearTimeout(timer);
}
}, [metadata, isScreenFocused, shouldLoadSecondaryData]);
@ -467,7 +467,7 @@ const MetadataScreen: React.FC = () => {
// Debounced Trakt progress fetching
useEffect(() => {
if (shouldLoadSecondaryData && metadata && id) {
const timer = setTimeout(fetchTraktProgress, 500);
const timer = setTimeout(fetchTraktProgress, 100);
return () => clearTimeout(timer);
}
}, [shouldLoadSecondaryData, metadata, id, fetchTraktProgress]);