import type {
TmdbMovieDetails ,
TmdbMovieReleaseResult ,
TmdbProductionCompany ,
} from '@server/api/themoviedb/interfaces' ;
import type Media from '@server/entity/Media' ;
import type {
Cast ,
Crew ,
ExternalIds ,
Genre ,
Keyword ,
ProductionCompany ,
WatchProviders ,
} from './common' ;
import {
mapCast ,
mapCrew ,
mapExternalIds ,
mapVideos ,
mapWatchProviders ,
} from './common' ;
export interface Video {
url? : string ;
site : 'YouTube' ;
key : string ;
name : string ;
size : number ;
type :
| 'Clip'
| 'Teaser'
| 'Trailer'
| 'Featurette'
| 'Opening Credits'
| 'Behind the Scenes'
| 'Bloopers' ;
}
export interface MovieDetails {
id : number ;
imdbId? : string ;
adult : boolean ;
backdropPath? : string ;
budget : number ;
genres : Genre [ ] ;
homepage? : string ;
originalLanguage : string ;
originalTitle : string ;
overview? : string ;
popularity : number ;
relatedVideos? : Video [ ] ;
posterPath? : string ;
productionCompanies : ProductionCompany [ ] ;
productionCountries : {
iso_3166_1 : string ;
name : string ;
} [ ] ;
releaseDate : string ;
releases : TmdbMovieReleaseResult ;
revenue : number ;
runtime? : number ;
spokenLanguages : {
iso_639_1 : string ;
name : string ;
} [ ] ;
status : string ;
tagline? : string ;
title : string ;
video : boolean ;
voteAverage : number ;
voteCount : number ;
credits : {
cast : Cast [ ] ;
crew : Crew [ ] ;
} ;
collection ? : {
id : number ;
name : string ;
posterPath? : string ;
backdropPath? : string ;
} ;
mediaInfo? : Media ;
externalIds : ExternalIds ;
plexUrl? : string ;
watchProviders? : WatchProviders [ ] ;
keywords : Keyword [ ] ;
}
export const mapProductionCompany = (
company : TmdbProductionCompany
) : ProductionCompany = > ( {
id : company.id ,
name : company.name ,
originCountry : company.origin_country ,
description : company.description ,
headquarters : company.headquarters ,
homepage : company.homepage ,
logoPath : company.logo_path ,
} ) ;
export const mapMovieDetails = (
movie : TmdbMovieDetails ,
media? : Media
) : MovieDetails = > ( {
id : movie.id ,
adult : movie.adult ,
budget : movie.budget ,
genres : movie.genres ,
relatedVideos : mapVideos ( movie . videos ) ,
originalLanguage : movie.original_language ,
originalTitle : movie.original_title ,
popularity : movie.popularity ,
productionCompanies : movie.production_companies.map ( mapProductionCompany ) ,
productionCountries : movie.production_countries ,
releaseDate : movie.release_date ,
releases : movie.release_dates ,
revenue : movie.revenue ,
spokenLanguages : movie.spoken_languages ,
status : movie.status ,
title : movie.title ,
video : movie.video ,
voteAverage : movie.vote_average ,
voteCount : movie.vote_count ,
backdropPath : movie.backdrop_path ,
homepage : movie.homepage ,
imdbId : movie.imdb_id ,
overview : movie.overview ,
posterPath : movie.poster_path ,
runtime : movie.runtime ,
tagline : movie.tagline ,
credits : {
cast : movie.credits.cast.map ( mapCast ) ,
crew : movie.credits.crew.map ( mapCrew ) ,
} ,
collection : movie.belongs_to_collection
? {
id : movie.belongs_to_collection.id ,
name : movie.belongs_to_collection.name ,
posterPath : movie.belongs_to_collection.poster_path ,
backdropPath : movie.belongs_to_collection.backdrop_path ,
}
: undefined ,
externalIds : mapExternalIds ( movie . external_ids ) ,
mediaInfo : media ,
watchProviders : mapWatchProviders ( movie [ 'watch/providers' ] ? . results ? ? { } ) ,
keywords : movie.keywords.keywords.map ( ( keyword ) = > ( {
id : keyword.id ,
name : keyword.name ,
} ) ) ,
} ) ;