added parallel season fetching

This commit is contained in:
tapframe 2026-01-04 15:57:23 +05:30
parent 4aa22cc1c3
commit 3e63efc178
2 changed files with 37 additions and 18 deletions

View file

@ -489,9 +489,18 @@ const SeriesContentComponent: React.FC<SeriesContentProps> = ({
};
}, []);
// Add effect to scroll to selected season
// Track previous season to only scroll when it actually changes
const previousSeasonRef = React.useRef<number | null>(null);
// Add effect to scroll to selected season (only when season changes, not on every groupedEpisodes update)
useEffect(() => {
if (selectedSeason && seasonScrollViewRef.current && Object.keys(groupedEpisodes).length > 0) {
// Only scroll if the season actually changed (not just groupedEpisodes update)
if (previousSeasonRef.current === selectedSeason) {
return; // Season didn't change, don't scroll
}
previousSeasonRef.current = selectedSeason;
// Find the index of the selected season
const seasons = Object.keys(groupedEpisodes).map(Number).sort((a, b) => a - b);
const selectedIndex = seasons.findIndex(season => season === selectedSeason);

View file

@ -1157,27 +1157,37 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat
// Use just the language code (e.g., 'ar', not 'ar-US') for TMDB API
const lang = settings.tmdbLanguagePreference || 'en';
const seasons = Object.keys(groupedAddonEpisodes).map(Number);
for (const seasonNum of seasons) {
const seasonEps = groupedAddonEpisodes[seasonNum];
// Parallel fetch a reasonable batch (limit concurrency implicitly by season)
const localized = await Promise.all(
seasonEps.map(async ep => {
try {
const data = await tmdbService.getEpisodeDetails(Number(tmdbIdToUse), seasonNum, ep.episode_number, lang);
if (data) {
// Fetch all seasons in parallel (much faster than fetching each episode individually)
const seasonPromises = seasons.map(async seasonNum => {
try {
// getSeasonDetails returns all episodes for a season in one call
const seasonData = await tmdbService.getSeasonDetails(Number(tmdbIdToUse), seasonNum, undefined, lang);
if (seasonData && seasonData.episodes) {
// Create a map of episode number -> localized data for fast lookup
const localizedMap = new Map<number, { name: string; overview: string }>();
for (const ep of seasonData.episodes) {
localizedMap.set(ep.episode_number, { name: ep.name, overview: ep.overview });
}
// Merge localized data into addon episodes
groupedAddonEpisodes[seasonNum] = groupedAddonEpisodes[seasonNum].map(ep => {
const localized = localizedMap.get(ep.episode_number);
if (localized) {
return {
...ep,
name: data.name || ep.name,
overview: data.overview || ep.overview,
name: localized.name || ep.name,
overview: localized.overview || ep.overview,
};
}
} catch { }
return ep;
})
);
groupedAddonEpisodes[seasonNum] = localized;
}
if (__DEV__) logger.log('[useMetadata] merged localized episode names/overviews from TMDB');
return ep;
});
}
} catch { }
});
await Promise.all(seasonPromises);
if (__DEV__) logger.log('[useMetadata] merged localized episode names/overviews from TMDB (batch)');
}
} catch (e) {
if (__DEV__) console.log('[useMetadata] failed to merge localized episode text', e);