diff --git a/package.json b/package.json index 5ccb4b0..56cb43b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tmdb-ts", - "version": "1.0.0", + "version": "1.1.0", "description": "TMDB v3 library wrapper", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/endpoints/changes.ts b/src/endpoints/changes.ts index a4316b5..b7521de 100644 --- a/src/endpoints/changes.ts +++ b/src/endpoints/changes.ts @@ -1,20 +1,20 @@ import { BaseEndpoint } from './base'; -import { ChangeOptions, Changes } from '../types/changes'; +import { ChangeOptions, MediaChanges } from '../types/changes'; export class ChangeEndpoint extends BaseEndpoint { constructor(protected readonly accessToken: string) { super(accessToken); } - async movies(options?: ChangeOptions): Promise { - return await this.api.get(`/movie/changes`, options); + async movies(options?: ChangeOptions): Promise { + return await this.api.get(`/movie/changes`, options); } - async tvShows(options?: ChangeOptions): Promise { - return await this.api.get(`/tv/changes`, options); + async tvShows(options?: ChangeOptions): Promise { + return await this.api.get(`/tv/changes`, options); } - async person(options?: ChangeOptions): Promise { - return await this.api.get(`/person/change`, options); + async person(options?: ChangeOptions): Promise { + return await this.api.get(`/person/change`, options); } } diff --git a/src/endpoints/movies.ts b/src/endpoints/movies.ts index f9c312f..70d0734 100644 --- a/src/endpoints/movies.ts +++ b/src/endpoints/movies.ts @@ -1,14 +1,16 @@ import { BaseEndpoint } from './base'; import { AlternativeTitles, + AppendToResponse, + AppendToResponseMovieKey, ChangeOptions, + Changes, Credits, ExternalIds, Images, Keywords, LanguageOption, LatestMovie, - MovieChanges, MovieDetails, MovieLists, MoviesPlayingNow, @@ -33,8 +35,20 @@ export class MoviesEndpoint extends BaseEndpoint { super(accessToken); } - async details(id: number): Promise { - return await this.api.get(`${BASE_MOVIE}/${id}`); + async details( + id: number, + appendToResponse?: T + ) { + const options = { + append_to_response: appendToResponse + ? appendToResponse.join(',') + : undefined, + }; + + return await this.api.get>( + `${BASE_MOVIE}/${id}`, + options + ); } async alternativeTitles(id: number): Promise { @@ -43,11 +57,8 @@ export class MoviesEndpoint extends BaseEndpoint { ); } - async changes(id: number, options?: ChangeOptions): Promise { - return await this.api.get( - `${BASE_MOVIE}/${id}/changes`, - options - ); + async changes(id: number, options?: ChangeOptions): Promise { + return await this.api.get(`${BASE_MOVIE}/${id}/changes`, options); } async credits(id: number): Promise { diff --git a/src/endpoints/people.ts b/src/endpoints/people.ts index 26742ce..0d4aa70 100644 --- a/src/endpoints/people.ts +++ b/src/endpoints/people.ts @@ -1,12 +1,14 @@ import { + AppendToResponse, + AppendToResponsePersonKey, 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/endpoints/tv-shows.ts b/src/endpoints/tv-shows.ts index c1c3746..738d4e2 100644 --- a/src/endpoints/tv-shows.ts +++ b/src/endpoints/tv-shows.ts @@ -1,7 +1,10 @@ import { BaseEndpoint } from './base'; import { AlternativeTitles, + AppendToResponse, + AppendToResponseTvKey, ChangeOptions, + Changes, ContentRatings, Credits, EpisodeGroups, @@ -21,7 +24,6 @@ import { SimilarTvShows, TopRatedTvShows, Translations, - TvShowChanges, TvShowDetails, TvShowsAiringToday, Videos, @@ -35,8 +37,19 @@ export class TvShowsEndpoint extends BaseEndpoint { super(accessToken); } - async details(id: number): Promise { - return await this.api.get(`${BASE_TV}/${id}`); + async details( + id: number, + appendToResponse?: T + ) { + const options = { + append_to_response: appendToResponse + ? appendToResponse.join(',') + : undefined, + }; + return await this.api.get>( + `${BASE_TV}/${id}`, + options + ); } async alternativeTitles(id: number): Promise { @@ -45,11 +58,8 @@ export class TvShowsEndpoint extends BaseEndpoint { ); } - async changes(id: number, options?: ChangeOptions): Promise { - return await this.api.get( - `${BASE_TV}/${id}/changes`, - options - ); + async changes(id: number, options?: ChangeOptions): Promise { + return await this.api.get(`${BASE_TV}/${id}/changes`, options); } async contentRatings(id: number): Promise { diff --git a/src/types/changes.ts b/src/types/changes.ts index b15b7c5..3c5f786 100644 --- a/src/types/changes.ts +++ b/src/types/changes.ts @@ -1,10 +1,10 @@ -export interface Change { +export interface MediaChange { id: number; adult: boolean | undefined; } -export interface Changes { - results: Change[]; +export interface MediaChanges { + results: MediaChange[]; page: number; total_pages: number; total_results: number; @@ -15,3 +15,21 @@ export interface ChangeOptions { start_date?: string; page?: number; } + +export interface Changes { + changes: Change[]; +} + +export interface Change { + key: string; + items: ChangeItem[]; +} + +export interface ChangeItem { + id: string; + action: string; + time: string; + value: Array; + iso_639_1: string; + original_value: Array; +} diff --git a/src/types/configuration.ts b/src/types/configuration.ts index 231d3cc..f87686d 100644 --- a/src/types/configuration.ts +++ b/src/types/configuration.ts @@ -1,4 +1,4 @@ -export interface Images { +export interface ImageConfiguration { base_url: string; secure_base_url: string; backdrop_sizes: BackdropSizes[]; @@ -9,7 +9,7 @@ export interface Images { } export interface Configuration { - images: Images; + images: ImageConfiguration; change_keys: ChangeKeys[]; } diff --git a/src/types/index.ts b/src/types/index.ts index 8432a50..292685d 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -128,6 +128,7 @@ export interface ContentRatings { } export interface ContentRatingsResult { + descriptor: unknown[]; iso_3166_1: string; rating: string; } @@ -202,3 +203,10 @@ export interface Image { vote_count: number; width: number; } + +export interface Images { + id: number; + backdrops: Image[]; + logos: Image[]; + posters: Image[]; +} diff --git a/src/types/movies.ts b/src/types/movies.ts index e08c0a5..77789b9 100644 --- a/src/types/movies.ts +++ b/src/types/movies.ts @@ -94,24 +94,6 @@ export interface MovieLists { total_results: number; } -export interface MovieChangeItem { - id: string; - action: string; - time: string; - iso_639_1: string; - value: string; - original_value: string; -} - -export interface MovieChange { - key: string; - items: MovieChangeItem[]; -} - -export interface MovieChanges { - changes: MovieChange[]; -} - export interface LatestMovie { adult: boolean; backdrop_path?: string; diff --git a/src/types/options.ts b/src/types/options.ts index 13af8ff..af8f924 100644 --- a/src/types/options.ts +++ b/src/types/options.ts @@ -1,3 +1,31 @@ +import { + AlternativeTitles, + Changes, + ContentRatings, + Credits, + EpisodeGroups, + ExternalIds, + Images, + Keywords, + MovieLists, + PeopleImages, + PersonTranslations, + PersonChanges, + PersonCombinedCredits, + PersonMovieCredit, + PersonTvShowCredit, + Recommendations, + ReleaseDates, + Reviews, + ScreenedTheatrically, + SimilarMovies, + SimilarTvShows, + TaggedImages, + Translations, + Videos, + WatchProviders, +} from '.'; + export interface LanguageOption { language?: string; } @@ -9,3 +37,147 @@ export interface RegionOption { export interface PageOption { page?: number; } + +export type AppendToResponseMovieKey = + | 'images' + | 'videos' + | 'credits' + | 'recommendations' + | 'reviews' + | 'changes' + | 'similar' + | 'lists' + | 'release_dates' + | 'alternative_titles' + | 'external_ids' + | 'translations' + | 'watch/providers' + | 'keywords'; + +export type AppendToResponseTvKey = + | 'content_ratings' + | 'images' + | 'videos' + | 'credits' + | 'recommendations' + | 'reviews' + | 'changes' + | 'similar' + | 'alternative_titles' + | 'external_ids' + | 'translations' + | 'watch/providers' + | 'aggregate_credits' + | 'episode_groups' + | 'screened_theatrically' + | 'keywords'; + +export type AppendToResponsePersonKey = + | 'images' + | 'changes' + | 'movie_credits' + | 'tv_credits' + | 'combined_credits' + | 'external_ids' + | 'tagged_images' + | 'translations'; + +type AppendToResponseAllKeys = + | AppendToResponseTvKey + | AppendToResponseMovieKey + | AppendToResponsePersonKey; + +export type AppendToResponseMediaType = 'movie' | 'tvShow' | 'person'; + +export type AppendToResponse< + K, + T extends AppendToResponseAllKeys[] | undefined, + Media extends AppendToResponseMediaType +> = K & + (T extends undefined + ? object + : T extends Array + ? ('credits' extends T[number] + ? { credits: Omit } + : object) & + ('videos' extends T[number] ? { videos: Omit } : object) & + ('images' extends T[number] + ? { + images: Omit< + Media extends 'person' ? PeopleImages : Images, + 'id' + >; + } + : object) & + ('recommendations' extends T[number] + ? { recommendations: Recommendations } + : object) & + ('reviews' extends T[number] + ? { reviews: Omit } + : object) & + ('reviews' extends T[number] + ? { reviews: Omit } + : object) & + ('changes' extends T[number] + ? { + changes: Omit< + Media extends 'person' ? PersonChanges : Changes, + 'id' + >; + } + : object) & + ('keywords' extends T[number] + ? { keywords: Omit } + : object) & + ('lists' extends T[number] + ? { lists: Omit } + : object) & + ('release_dates' extends T[number] + ? { release_dates: Omit } + : object) & + ('alternative_titles' extends T[number] + ? { alternative_titles: Omit } + : object) & + ('external_ids' extends T[number] + ? { external_ids: Omit } + : object) & + ('translations' extends T[number] + ? { translations: Omit } + : object) & + ('watch/providers' extends T[number] + ? { 'watch/providers': Omit } + : object) & + ('aggregate_credits' extends T[number] + ? { aggregate_credits: Omit } + : object) & + ('episode_groups' extends T[number] + ? { episode_groups: Omit } + : object) & + ('screened_theatrically' extends T[number] + ? { screened_theatrically: Omit } + : object) & + ('similar' extends T[number] + ? { + 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; diff --git a/src/types/tv-shows.ts b/src/types/tv-shows.ts index 375dc50..a38f533 100644 --- a/src/types/tv-shows.ts +++ b/src/types/tv-shows.ts @@ -134,24 +134,6 @@ export interface SeasonDetails { season_number: number; } -export interface TvShowItem { - id: string; - action: string; - time: string; - value: Array; - iso_639_1: string; - original_value: Array; -} - -export interface TvShowChange { - key: string; - items: TvShowItem[]; -} - -export interface TvShowChanges { - changes: TvShowChange[]; -} - export interface Network { id: number; logo_path: string;