From 912a91e8dc04ef6e01f338be2d0bdb7de3001ea2 Mon Sep 17 00:00:00 2001 From: DerPenz Date: Tue, 7 Feb 2023 17:07:15 +0100 Subject: [PATCH 1/3] added people endpoint with details, credits --- src/endpoints/index.ts | 2 + src/endpoints/people.ts | 32 +++++++++++++++ src/types/index.ts | 1 + src/types/people.ts | 89 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 src/endpoints/people.ts create mode 100644 src/types/people.ts diff --git a/src/endpoints/index.ts b/src/endpoints/index.ts index e613363..1b48033 100644 --- a/src/endpoints/index.ts +++ b/src/endpoints/index.ts @@ -9,3 +9,5 @@ export * from './genre'; export * from './movies'; export * from './configuration'; export * from './tv-shows'; +export * from './people'; + diff --git a/src/endpoints/people.ts b/src/endpoints/people.ts new file mode 100644 index 0000000..92fcdd6 --- /dev/null +++ b/src/endpoints/people.ts @@ -0,0 +1,32 @@ +import { PersonDetail, PersonMovieCredit, PersonTvShowCredit } from '../types'; +import { BaseEndpoint } from './base'; + +const BASE_PERSON = '/person'; + + + +export class PeopleEndpoint extends BaseEndpoint { + constructor(accessToken: string) { + super(accessToken); + } + + async details(id: number): Promise { + return await this.api.get(`${BASE_PERSON}/${id}`); + } + + async movieCredits( + id: number + ): Promise { + return await this.api.get( + `${BASE_PERSON}/${id}/movie_credits` + ); + } + + async tvShowCredits( + id: number + ): Promise { + return await this.api.get( + `${BASE_PERSON}/${id}/tv_credits` + ); + } +} diff --git a/src/types/index.ts b/src/types/index.ts index 4e294c0..f3fb230 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -6,6 +6,7 @@ export * from './movies'; export * from './search'; export * from './tv-shows'; export * from './watch-providers'; +export * from './people'; export interface AuthorDetails { name: string; diff --git a/src/types/people.ts b/src/types/people.ts new file mode 100644 index 0000000..a19c509 --- /dev/null +++ b/src/types/people.ts @@ -0,0 +1,89 @@ +interface Cast { + character: string; + credit_id: string; + vote_count: number; + id: number; + backdrop_path: string; + poster_path: string; + original_language: string; + vote_average: number; + genre_ids: number[]; + popularity: number; + overview: string; +} + +interface Crew { + id: number; + department: string; + original_language: string; + credit_id: string; + overview: string; + vote_count: number; + poster_path: string; + backdrop_path: string; + popularity: number; + genre_ids: number[]; + job: string; + vote_average: number; +} + +export interface PersonMovieCast extends Cast { + release_date: string; + video: boolean; + adult: boolean; + title: string; + original_title: string; +} + +export interface PersonMovieCrew extends Crew { + original_title: string; + video: boolean; + title: string; + adult: boolean; + release_date: string; +} + +export interface PersonTvShowCrew extends Crew { + episode_count: number; + origin_country: string[]; + original_name: string; + name: string; + first_air_date: string; +} + +export interface PersonTvShowCast extends Cast { + original_name: string; + name: string; + episode_count: number; + first_air_date: string; + origin_country: string[]; +} + +export interface PersonMovieCredit { + cast: PersonMovieCast[]; + crew: PersonMovieCrew[]; + id: number; +} + +export interface PersonTvShowCredit { + cast: PersonTvShowCast[]; + crew: PersonTvShowCrew[]; + id: number; +} + +export interface PersonDetail { + birthday: string, + known_for_department: string, + deathday: string, + id: number, + name: string, + also_known_as: string[] + gender: number, + biography: string, + popularity: number, + place_of_birth: string, + profile_path: string, + adult: boolean, + imdb_id: string, + homepage: string + } \ No newline at end of file From d29afab89fce6fb34eca2826ad130531270a02fe Mon Sep 17 00:00:00 2001 From: DerPenz Date: Sun, 19 Feb 2023 17:34:38 +0100 Subject: [PATCH 2/3] added all people endpoints --- src/endpoints/people.ts | 55 ++++++++++++++++++++++++--------- src/types/index.ts | 10 ++++++ src/types/people.ts | 68 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 118 insertions(+), 15 deletions(-) diff --git a/src/endpoints/people.ts b/src/endpoints/people.ts index 92fcdd6..d5e4f68 100644 --- a/src/endpoints/people.ts +++ b/src/endpoints/people.ts @@ -1,10 +1,10 @@ -import { PersonDetail, PersonMovieCredit, PersonTvShowCredit } from '../types'; +import { ChangeOptions, ExternalIds, Image, PeopleTranslations, PersonChanges, PersonCombinedCredits, PersonDetail, PersonMovieCredit, PersonTvShowCredit, PopularPersons, TaggedImages } from '../types'; import { BaseEndpoint } from './base'; +import querystring from 'querystring'; const BASE_PERSON = '/person'; - export class PeopleEndpoint extends BaseEndpoint { constructor(accessToken: string) { super(accessToken); @@ -14,19 +14,46 @@ export class PeopleEndpoint extends BaseEndpoint { return await this.api.get(`${BASE_PERSON}/${id}`); } - async movieCredits( - id: number - ): Promise { - return await this.api.get( - `${BASE_PERSON}/${id}/movie_credits` - ); + async changes(id: number, options? : ChangeOptions): Promise { + const params = querystring.encode(options); + return await this.api.get(`${BASE_PERSON}/${id}/changes?${params}`); } - async tvShowCredits( - id: number - ): Promise { - return await this.api.get( - `${BASE_PERSON}/${id}/tv_credits` - ); + async movieCredits(id: number): Promise { + return await this.api.get(`${BASE_PERSON}/${id}/movie_credits`); + } + + async tvShowCredits(id: number): Promise { + return await this.api.get(`${BASE_PERSON}/${id}/tv_credits`); + } + + async combinedCredits(id: number) : Promise { + return await this.api.get(`${BASE_PERSON}/${id}/combined_credits`) + } + + async externalId(id: number): Promise{ + 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 taggedImages(id: number, options?: {page?: number}): Promise{ + const params = querystring.encode(options); + return await this.api.get(`${BASE_PERSON}/${id}/tagged_images?${params}`); + } + + 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 popular(options?: {page?: number}): Promise{ + const params = querystring.encode(options); + return await this.api.get(`${BASE_PERSON}/popular?${params}`); } } diff --git a/src/types/index.ts b/src/types/index.ts index f3fb230..7b3e0c4 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -197,3 +197,13 @@ export interface Translations { id: number; translations: Translation[]; } + +export interface Image{ + aspect_ratio: number; + file_path: string; + height: number; + iso_639_1: string; + vote_average: number; + vote_count: number; + width: number; +} \ No newline at end of file diff --git a/src/types/people.ts b/src/types/people.ts index a19c509..6e9ebc0 100644 --- a/src/types/people.ts +++ b/src/types/people.ts @@ -1,3 +1,5 @@ +import { Movie, Person, TV, TvShowItem } from "."; + interface Cast { character: string; credit_id: string; @@ -71,6 +73,12 @@ export interface PersonTvShowCredit { id: number; } +export interface PersonCombinedCredits { + cast: (PersonMovieCast & PersonTvShowCast)[]; + crew: (PersonMovieCrew & PersonTvShowCrew)[]; + id: number; +} + export interface PersonDetail { birthday: string, known_for_department: string, @@ -86,4 +94,62 @@ export interface PersonDetail { adult: boolean, imdb_id: string, homepage: string - } \ No newline at end of file +} + +export interface PersonChange{ + id: string; + action: string; + time: string; + iso_639_1: string; + iso_3166_1: string; + value: string | { profile: { file_path: string;} }; + original_value: string | { profile: { file_path: string; } }; +} + +export interface PersonChanges { + changes: { + key: string; + items: PersonChange[]; + }[]; +} + +export interface PopularPersons{ + page: number; + results: Person[]; + total_results: number; + total_pages: number; +} + +export interface TaggedImage{ + aspect_ratio: number; + file_path: string; + height: number; + id: string; + iso_639_1: string; + vote_average: number; + vote_count: number; + width: number; + image_type: string; + media_type: string; + media: Movie | TV +} + +export interface TaggedImages{ + page: number; + results: TaggedImage[]; + total_results: number; + total_pages: number; +} + +export interface PeopleTranslations{ + id: number; + translations: { + iso_3166_1: string; + iso_639_1: string; + name: string; + english_name: string; + data: { + biography: string + }; + } +} \ No newline at end of file From 16db522215a0d0543981a5dee812273cc90da5b2 Mon Sep 17 00:00:00 2001 From: DerPenz Date: Sun, 19 Feb 2023 17:35:00 +0100 Subject: [PATCH 3/3] Integrated people endpoint with main TMDB class --- src/tmdb.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/tmdb.ts b/src/tmdb.ts index 8e5283a..91bc4ec 100644 --- a/src/tmdb.ts +++ b/src/tmdb.ts @@ -8,6 +8,7 @@ import { SearchEndpoint, TvShowsEndpoint, ConfigurationEndpoint, + PeopleEndpoint, } from './endpoints'; export default class TMDB { @@ -52,4 +53,8 @@ export default class TMDB { get tvShows(): TvShowsEndpoint{ return new TvShowsEndpoint(this.accessToken); } + + get people(): PeopleEndpoint{ + return new PeopleEndpoint(this.accessToken); + } }