mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-04-21 16:51:57 +00:00
metascreen optimization
This commit is contained in:
parent
057c709b41
commit
1b990aa6ec
2 changed files with 1001 additions and 995 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
Loading…
Reference in a new issue