|
|
|
import type {
|
|
|
|
TmdbAggregateCreditCast,
|
|
|
|
TmdbCreditCast,
|
|
|
|
TmdbCreditCrew,
|
|
|
|
TmdbExternalIds,
|
|
|
|
TmdbVideo,
|
|
|
|
TmdbVideoResult,
|
|
|
|
TmdbWatchProviderDetails,
|
|
|
|
TmdbWatchProviders,
|
|
|
|
} from '../api/themoviedb/interfaces';
|
|
|
|
import { Video } from '../models/Movie';
|
|
|
|
|
|
|
|
export interface ProductionCompany {
|
|
|
|
id: number;
|
|
|
|
logoPath?: string;
|
|
|
|
originCountry: string;
|
|
|
|
name: string;
|
|
|
|
description?: string;
|
|
|
|
headquarters?: string;
|
|
|
|
homepage?: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface TvNetwork {
|
|
|
|
id: number;
|
|
|
|
logoPath?: string;
|
|
|
|
originCountry?: string;
|
|
|
|
name: string;
|
|
|
|
headquarters?: string;
|
|
|
|
homepage?: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface Keyword {
|
|
|
|
id: number;
|
|
|
|
name: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface Genre {
|
|
|
|
id: number;
|
|
|
|
name: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface Cast {
|
|
|
|
id: number;
|
|
|
|
castId: number;
|
|
|
|
character: string;
|
|
|
|
creditId: string;
|
|
|
|
gender?: number;
|
|
|
|
name: string;
|
|
|
|
order: number;
|
|
|
|
profilePath?: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface Crew {
|
|
|
|
id: number;
|
|
|
|
creditId: string;
|
|
|
|
department: string;
|
|
|
|
gender?: number;
|
|
|
|
job: string;
|
|
|
|
name: string;
|
|
|
|
profilePath?: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface ExternalIds {
|
|
|
|
imdbId?: string;
|
|
|
|
freebaseMid?: string;
|
|
|
|
freebaseId?: string;
|
|
|
|
tvdbId?: number;
|
|
|
|
tvrageId?: string;
|
|
|
|
facebookId?: string;
|
|
|
|
instagramId?: string;
|
|
|
|
twitterId?: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface WatchProviders {
|
|
|
|
iso_3166_1: string;
|
|
|
|
link?: string;
|
|
|
|
buy?: WatchProviderDetails[];
|
|
|
|
flatrate?: WatchProviderDetails[];
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface WatchProviderDetails {
|
|
|
|
displayPriority?: number;
|
|
|
|
logoPath?: string;
|
|
|
|
id: number;
|
|
|
|
name: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export const mapCast = (person: TmdbCreditCast): Cast => ({
|
|
|
|
castId: person.cast_id,
|
|
|
|
character: person.character,
|
|
|
|
creditId: person.credit_id,
|
|
|
|
id: person.id,
|
|
|
|
name: person.name,
|
|
|
|
order: person.order,
|
|
|
|
gender: person.gender,
|
|
|
|
profilePath: person.profile_path,
|
|
|
|
});
|
|
|
|
|
|
|
|
export const mapAggregateCast = (person: TmdbAggregateCreditCast): Cast => ({
|
|
|
|
castId: person.cast_id,
|
|
|
|
// the first role is the one for which the actor appears the most as
|
|
|
|
character: person.roles[0].character,
|
|
|
|
creditId: person.roles[0].credit_id,
|
|
|
|
id: person.id,
|
|
|
|
name: person.name,
|
|
|
|
order: person.order,
|
|
|
|
gender: person.gender,
|
|
|
|
profilePath: person.profile_path,
|
|
|
|
});
|
|
|
|
|
|
|
|
export const mapCrew = (person: TmdbCreditCrew): Crew => ({
|
|
|
|
creditId: person.credit_id,
|
|
|
|
department: person.department,
|
|
|
|
id: person.id,
|
|
|
|
job: person.job,
|
|
|
|
name: person.name,
|
|
|
|
gender: person.gender,
|
|
|
|
profilePath: person.profile_path,
|
|
|
|
});
|
|
|
|
|
|
|
|
export const mapExternalIds = (eids: TmdbExternalIds): ExternalIds => ({
|
|
|
|
facebookId: eids.facebook_id,
|
|
|
|
freebaseId: eids.freebase_id,
|
|
|
|
freebaseMid: eids.freebase_mid,
|
|
|
|
imdbId: eids.imdb_id,
|
|
|
|
instagramId: eids.instagram_id,
|
|
|
|
tvdbId: eids.tvdb_id,
|
|
|
|
tvrageId: eids.tvrage_id,
|
|
|
|
twitterId: eids.twitter_id,
|
|
|
|
});
|
|
|
|
|
|
|
|
export const mapVideos = (videoResult: TmdbVideoResult): Video[] =>
|
|
|
|
videoResult?.results.map(({ key, name, size, type, site }: TmdbVideo) => ({
|
|
|
|
site,
|
|
|
|
key,
|
|
|
|
name,
|
|
|
|
size,
|
|
|
|
type,
|
|
|
|
url: siteUrlCreator(site, key),
|
|
|
|
}));
|
|
|
|
|
|
|
|
export const mapWatchProviders = (watchProvidersResult: {
|
|
|
|
[iso_3166_1: string]: TmdbWatchProviders;
|
|
|
|
}): WatchProviders[] =>
|
|
|
|
Object.entries(watchProvidersResult).map(
|
|
|
|
([iso_3166_1, provider]) =>
|
|
|
|
({
|
|
|
|
iso_3166_1,
|
|
|
|
link: provider.link,
|
|
|
|
buy: mapWatchProviderDetails(provider.buy ?? []),
|
|
|
|
flatrate: mapWatchProviderDetails(provider.flatrate ?? []),
|
|
|
|
} as WatchProviders)
|
|
|
|
);
|
|
|
|
|
|
|
|
export const mapWatchProviderDetails = (
|
|
|
|
watchProviderDetails: TmdbWatchProviderDetails[]
|
|
|
|
): WatchProviderDetails[] =>
|
|
|
|
watchProviderDetails.map(
|
|
|
|
(provider) =>
|
|
|
|
({
|
|
|
|
displayPriority: provider.display_priority,
|
|
|
|
logoPath: provider.logo_path,
|
|
|
|
id: provider.provider_id,
|
|
|
|
name: provider.provider_name,
|
|
|
|
} as WatchProviderDetails)
|
|
|
|
);
|
|
|
|
|
|
|
|
const siteUrlCreator = (site: Video['site'], key: string): string =>
|
|
|
|
({
|
|
|
|
YouTube: `https://www.youtube.com/watch?v=${key}`,
|
|
|
|
}[site]);
|