From 7d96ad04d16ec1847b7c78564067203629d8b59a Mon Sep 17 00:00:00 2001 From: DerPenz Date: Sat, 22 Apr 2023 15:33:28 +0200 Subject: [PATCH] full support for /person --- src/endpoints/people.ts | 37 ++++++++++++++++--------- src/types/options.ts | 60 ++++++++++++++++++++++++++++++++++++----- src/types/people.ts | 11 +++++--- 3 files changed, 86 insertions(+), 22 deletions(-) diff --git a/src/endpoints/people.ts b/src/endpoints/people.ts index 26742ce..e50e067 100644 --- a/src/endpoints/people.ts +++ b/src/endpoints/people.ts @@ -1,12 +1,14 @@ import { + AppendToResponse, + AppendToResponsePersonKeys, ChangeOptions, ExternalIds, - Image, PageOption, - PeopleTranslations, + PeopleImages, + PersonTranslations, PersonChanges, PersonCombinedCredits, - PersonDetail, + PersonDetails, PersonMovieCredit, PersonTvShowCredit, PopularPersons, @@ -21,8 +23,19 @@ export class PeopleEndpoint extends BaseEndpoint { super(accessToken); } - async details(id: number): Promise { - return await this.api.get(`${BASE_PERSON}/${id}`); + async details( + id: number, + appendToResponse?: T + ) { + const options = { + append_to_response: appendToResponse + ? appendToResponse.join(',') + : undefined, + }; + return await this.api.get>( + `${BASE_PERSON}/${id}`, + options + ); } async changes(id: number, options?: ChangeOptions): Promise { @@ -54,10 +67,8 @@ export class PeopleEndpoint extends BaseEndpoint { return await this.api.get(`${BASE_PERSON}/${id}/external_ids`); } - async images(id: number): Promise<{ id: number; profiles: Image[] }> { - return await this.api.get<{ id: number; profiles: Image[] }>( - `${BASE_PERSON}/${id}/images` - ); + async images(id: number): Promise { + return await this.api.get(`${BASE_PERSON}/${id}/images`); } async taggedImages(id: number, options?: PageOption): Promise { @@ -67,14 +78,14 @@ export class PeopleEndpoint extends BaseEndpoint { ); } - async translation(id: number): Promise { - return await this.api.get( + async translation(id: number): Promise { + return await this.api.get( `${BASE_PERSON}/${id}/translations` ); } - async latest(): Promise { - return await this.api.get(`${BASE_PERSON}/latest`); + async latest(): Promise { + return await this.api.get(`${BASE_PERSON}/latest`); } async popular(options?: PageOption): Promise { diff --git a/src/types/options.ts b/src/types/options.ts index 24a8e84..c2aba2a 100644 --- a/src/types/options.ts +++ b/src/types/options.ts @@ -8,12 +8,19 @@ import { Images, Keywords, MovieLists, + PeopleImages, + PersonTranslations, + PersonChanges, + PersonCombinedCredits, + PersonMovieCredit, + PersonTvShowCredit, Recommendations, ReleaseDates, Reviews, ScreenedTheatrically, SimilarMovies, SimilarTvShows, + TaggedImages, Translations, Videos, WatchProviders, @@ -65,11 +72,22 @@ export type AppendToResponseTvKeys = | 'screened_theatrically' | 'keywords'; +export type AppendToResponsePersonKeys = + | 'images' + | 'changes' + | 'movie_credits' + | 'tv_credits' + | 'combined_credits' + | 'external_ids' + | 'tagged_images' + | 'translations'; + type AppendToResponseAllKeys = | AppendToResponseTvKeys - | AppendToResponseMovieKeys; + | AppendToResponseMovieKeys + | AppendToResponsePersonKeys; -export type AppendToResponseMediaType = 'movie' | 'tvShow'; +export type AppendToResponseMediaType = 'movie' | 'tvShow' | 'person'; export type AppendToResponse< K, @@ -83,7 +101,14 @@ export type AppendToResponse< ? { credits: Omit } : object) & ('videos' extends T[number] ? { videos: Omit } : object) & - ('images' extends T[number] ? { images: Omit } : object) & + ('images' extends T[number] + ? { + images: Omit< + Media extends 'person' ? PeopleImages : Images, + 'id' + >; + } + : object) & ('recommendations' extends T[number] ? { recommendations: Recommendations } : object) & @@ -94,7 +119,12 @@ export type AppendToResponse< ? { reviews: Omit } : object) & ('changes' extends T[number] - ? { changes: Omit } + ? { + changes: Omit< + Media extends 'person' ? PersonChanges : Changes, + 'id' + >; + } : object) & ('keywords' extends T[number] ? { keywords: Omit } @@ -112,7 +142,7 @@ export type AppendToResponse< ? { external_ids: Omit } : object) & ('translations' extends T[number] - ? { translations: Omit } + ? { translations: Omit } : object) & ('watch/providers' extends T[number] ? { 'watch/providers': Omit } @@ -127,9 +157,27 @@ export type AppendToResponse< ? { screened_theatrically: Omit } : object) & ('similar' extends T[number] - ? { similar: Media extends 'movie' ? SimilarMovies : SimilarTvShows } + ? { + similar: Media extends 'movie' + ? SimilarMovies + : Media extends 'tvShow' + ? SimilarTvShows + : unknown; + } : object) & ('content_ratings' extends T[number] ? { content_ratings: Omit } + : object) & + ('movie_credits' extends T[number] + ? { movie_credits: Omit } + : object) & + ('tv_credits' extends T[number] + ? { tv_credits: Omit } + : object) & + ('combined_credits' extends T[number] + ? { combined_credits: Omit } + : object) & + ('tagged_images' extends T[number] + ? { tagged_images: TaggedImages } : object) : never); diff --git a/src/types/people.ts b/src/types/people.ts index 56be4ef..333c1ba 100644 --- a/src/types/people.ts +++ b/src/types/people.ts @@ -1,4 +1,4 @@ -import { Movie, Person, TV } from '.'; +import { Image, Movie, Person, TV } from '.'; interface Cast { character: string; @@ -79,7 +79,7 @@ export interface PersonCombinedCredits { id: number; } -export interface PersonDetail { +export interface PersonDetails { birthday: string; known_for_department: string; deathday: string; @@ -120,6 +120,11 @@ export interface PopularPersons { total_pages: number; } +export interface PeopleImages { + id: number; + profiles: Image[]; +} + export interface TaggedImage { aspect_ratio: number; file_path: string; @@ -141,7 +146,7 @@ export interface TaggedImages { total_pages: number; } -export interface PeopleTranslations { +export interface PersonTranslations { id: number; translations: { iso_3166_1: string;