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..d5e4f68 --- /dev/null +++ b/src/endpoints/people.ts @@ -0,0 +1,59 @@ +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); + } + + async details(id: number): Promise { + return await this.api.get(`${BASE_PERSON}/${id}`); + } + + async changes(id: number, options? : ChangeOptions): Promise { + const params = querystring.encode(options); + return await this.api.get(`${BASE_PERSON}/${id}/changes?${params}`); + } + + 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/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); + } } diff --git a/src/types/index.ts b/src/types/index.ts index 4e294c0..7b3e0c4 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; @@ -196,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 new file mode 100644 index 0000000..6e9ebc0 --- /dev/null +++ b/src/types/people.ts @@ -0,0 +1,155 @@ +import { Movie, Person, TV, TvShowItem } from "."; + +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 PersonCombinedCredits { + cast: (PersonMovieCast & PersonTvShowCast)[]; + crew: (PersonMovieCrew & 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 +} + +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