You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.3 KiB
146 lines
3.3 KiB
import type {
|
|
TmdbMovieDetails,
|
|
TmdbMovieReleaseResult,
|
|
TmdbProductionCompany,
|
|
} from '../api/themoviedb/interfaces';
|
|
import type Media from '../entity/Media';
|
|
import type {
|
|
Cast,
|
|
Crew,
|
|
ExternalIds,
|
|
Genre,
|
|
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[];
|
|
}
|
|
|
|
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 ?? {}),
|
|
});
|