added more details for tvshows/movies

This commit is contained in:
tapframe 2025-10-13 13:23:19 +05:30
parent a0d9420be2
commit 1c7fd533c7
3 changed files with 293 additions and 24 deletions

View file

@ -1781,32 +1781,76 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat
let productionInfo: any[] = [];
if (type === 'series') {
// Fetch networks for TV shows
// Fetch networks and additional details for TV shows
const showDetails = await tmdbService.getTVShowDetails(tmdbId, 'en-US');
if (showDetails && showDetails.networks) {
productionInfo = Array.isArray(showDetails.networks)
? showDetails.networks
.map((n: any) => ({
id: n?.id,
name: n?.name,
logo: tmdbService.getImageUrl(n?.logo_path, 'w185'),
}))
.filter((n: any) => n && (n.logo || n.name))
: [];
if (showDetails) {
// Fetch networks
if (showDetails.networks) {
productionInfo = Array.isArray(showDetails.networks)
? showDetails.networks
.map((n: any) => ({
id: n?.id,
name: n?.name,
logo: tmdbService.getImageUrl(n?.logo_path, 'w185'),
}))
.filter((n: any) => n && (n.logo || n.name))
: [];
}
// Fetch additional TV details
const tvDetails = {
status: showDetails.status,
firstAirDate: showDetails.first_air_date,
lastAirDate: showDetails.last_air_date,
numberOfSeasons: showDetails.number_of_seasons,
numberOfEpisodes: showDetails.number_of_episodes,
episodeRunTime: showDetails.episode_run_time,
type: showDetails.type,
originCountry: showDetails.origin_country,
originalLanguage: showDetails.original_language,
createdBy: showDetails.created_by,
};
// Update metadata with TV details
setMetadata((prev: any) => ({
...prev,
tvDetails
}));
}
} else if (type === 'movie') {
// Fetch production companies for movies
// Fetch production companies and additional details for movies
const movieDetails = await tmdbService.getMovieDetails(String(tmdbId), 'en-US');
if (movieDetails && movieDetails.production_companies) {
productionInfo = Array.isArray(movieDetails.production_companies)
? movieDetails.production_companies
.map((c: any) => ({
id: c?.id,
name: c?.name,
logo: tmdbService.getImageUrl(c?.logo_path, 'w185'),
}))
.filter((c: any) => c && (c.logo || c.name))
: [];
if (movieDetails) {
// Fetch production companies
if (movieDetails.production_companies) {
productionInfo = Array.isArray(movieDetails.production_companies)
? movieDetails.production_companies
.map((c: any) => ({
id: c?.id,
name: c?.name,
logo: tmdbService.getImageUrl(c?.logo_path, 'w185'),
}))
.filter((c: any) => c && (c.logo || c.name))
: [];
}
// Fetch additional movie details
const movieDetailsObj = {
status: movieDetails.status,
releaseDate: movieDetails.release_date,
runtime: movieDetails.runtime,
budget: movieDetails.budget,
revenue: movieDetails.revenue,
originalLanguage: movieDetails.original_language,
originCountry: movieDetails.origin_country,
tagline: movieDetails.tagline,
};
// Update metadata with movie details
setMetadata((prev: any) => ({
...prev,
movieDetails: movieDetailsObj
}));
}
}

View file

@ -918,6 +918,83 @@ const MetadataScreen: React.FC = () => {
/>
)}
{/* Movie Details section - shown above recommendations for movies when TMDB enrichment is ON */}
{shouldLoadSecondaryData && Object.keys(groupedEpisodes).length === 0 && metadata?.movieDetails && (
<View style={styles.tvDetailsContainer}>
<Text style={styles.tvDetailsHeader}>Movie Details</Text>
{metadata.movieDetails.tagline && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Tagline</Text>
<Text style={[styles.tvDetailValue, { fontStyle: 'italic' }]}>
"{metadata.movieDetails.tagline}"
</Text>
</View>
)}
{metadata.movieDetails.status && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Status</Text>
<Text style={styles.tvDetailValue}>{metadata.movieDetails.status}</Text>
</View>
)}
{metadata.movieDetails.releaseDate && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Release Date</Text>
<Text style={styles.tvDetailValue}>
{new Date(metadata.movieDetails.releaseDate).toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
})}
</Text>
</View>
)}
{metadata.movieDetails.runtime && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Runtime</Text>
<Text style={styles.tvDetailValue}>
{Math.floor(metadata.movieDetails.runtime / 60)}h {metadata.movieDetails.runtime % 60}m
</Text>
</View>
)}
{metadata.movieDetails.budget && metadata.movieDetails.budget > 0 && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Budget</Text>
<Text style={styles.tvDetailValue}>
${metadata.movieDetails.budget.toLocaleString()}
</Text>
</View>
)}
{metadata.movieDetails.revenue && metadata.movieDetails.revenue > 0 && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Revenue</Text>
<Text style={styles.tvDetailValue}>
${metadata.movieDetails.revenue.toLocaleString()}
</Text>
</View>
)}
{metadata.movieDetails.originCountry && metadata.movieDetails.originCountry.length > 0 && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Origin Country</Text>
<Text style={styles.tvDetailValue}>{metadata.movieDetails.originCountry.join(', ')}</Text>
</View>
)}
{metadata.movieDetails.originalLanguage && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Original Language</Text>
<Text style={styles.tvDetailValue}>{metadata.movieDetails.originalLanguage.toUpperCase()}</Text>
</View>
)}
</View>
)}
{/* Recommendations Section with skeleton when loading - Lazy loaded */}
{type === 'movie' && shouldLoadSecondaryData && (
<MemoizedMoreLikeThisSection
@ -940,6 +1017,92 @@ const MetadataScreen: React.FC = () => {
) : (
metadata && <MemoizedMovieContent metadata={metadata} />
)}
{/* TV Details section - shown after episodes for series when TMDB enrichment is ON */}
{shouldLoadSecondaryData && Object.keys(groupedEpisodes).length > 0 && metadata?.tvDetails && (
<View style={styles.tvDetailsContainer}>
<Text style={styles.tvDetailsHeader}>Show Details</Text>
{metadata.tvDetails.status && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Status</Text>
<Text style={styles.tvDetailValue}>{metadata.tvDetails.status}</Text>
</View>
)}
{metadata.tvDetails.firstAirDate && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>First Air Date</Text>
<Text style={styles.tvDetailValue}>
{new Date(metadata.tvDetails.firstAirDate).toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
})}
</Text>
</View>
)}
{metadata.tvDetails.lastAirDate && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Last Air Date</Text>
<Text style={styles.tvDetailValue}>
{new Date(metadata.tvDetails.lastAirDate).toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
})}
</Text>
</View>
)}
{metadata.tvDetails.numberOfSeasons && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Seasons</Text>
<Text style={styles.tvDetailValue}>{metadata.tvDetails.numberOfSeasons}</Text>
</View>
)}
{metadata.tvDetails.numberOfEpisodes && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Total Episodes</Text>
<Text style={styles.tvDetailValue}>{metadata.tvDetails.numberOfEpisodes}</Text>
</View>
)}
{metadata.tvDetails.episodeRunTime && metadata.tvDetails.episodeRunTime.length > 0 && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Episode Runtime</Text>
<Text style={styles.tvDetailValue}>
{metadata.tvDetails.episodeRunTime.join(' - ')} min
</Text>
</View>
)}
{metadata.tvDetails.originCountry && metadata.tvDetails.originCountry.length > 0 && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Origin Country</Text>
<Text style={styles.tvDetailValue}>{metadata.tvDetails.originCountry.join(', ')}</Text>
</View>
)}
{metadata.tvDetails.originalLanguage && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Original Language</Text>
<Text style={styles.tvDetailValue}>{metadata.tvDetails.originalLanguage.toUpperCase()}</Text>
</View>
)}
{metadata.tvDetails.createdBy && metadata.tvDetails.createdBy.length > 0 && (
<View style={styles.tvDetailRow}>
<Text style={styles.tvDetailLabel}>Created By</Text>
<Text style={styles.tvDetailValue}>
{metadata.tvDetails.createdBy.map(creator => creator.name).join(', ')}
</Text>
</View>
)}
</View>
)}
</Animated.View>
</Animated.ScrollView>
</>
@ -1114,14 +1277,50 @@ const styles = StyleSheet.create({
opacity: 0.9,
},
productionHeader: {
fontSize: 14,
fontSize: 16,
fontWeight: '700',
color: '#fff',
marginBottom: 8,
marginBottom: 12,
textTransform: 'uppercase',
letterSpacing: 1,
opacity: 0.9,
},
tvDetailsContainer: {
paddingHorizontal: 16,
marginTop: 20,
marginBottom: 16,
},
tvDetailsHeader: {
fontSize: 16,
fontWeight: '700',
color: '#fff',
marginBottom: 12,
textTransform: 'uppercase',
letterSpacing: 1,
opacity: 0.9,
},
tvDetailRow: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
paddingVertical: 8,
borderBottomWidth: 1,
borderBottomColor: 'rgba(255,255,255,0.1)',
},
tvDetailLabel: {
fontSize: 14,
fontWeight: '600',
color: '#fff',
opacity: 0.8,
},
tvDetailValue: {
fontSize: 14,
fontWeight: '500',
color: '#fff',
opacity: 0.9,
textAlign: 'right',
flex: 1,
},
});

View file

@ -98,6 +98,32 @@ export interface StreamingContent {
name: string;
logo?: string;
}>;
tvDetails?: {
status?: string;
firstAirDate?: string;
lastAirDate?: string;
numberOfSeasons?: number;
numberOfEpisodes?: number;
episodeRunTime?: number[];
type?: string;
originCountry?: string[];
originalLanguage?: string;
createdBy?: Array<{
id: number;
name: string;
profile_path?: string;
}>;
};
movieDetails?: {
status?: string;
releaseDate?: string;
runtime?: number;
budget?: number;
revenue?: number;
originalLanguage?: string;
originCountry?: string[];
tagline?: string;
};
}
export interface CatalogContent {