mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-03-11 17:45:38 +00:00
added more details for tvshows/movies
This commit is contained in:
parent
a0d9420be2
commit
1c7fd533c7
3 changed files with 293 additions and 24 deletions
|
|
@ -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
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in a new issue