diff --git a/src/endpoints/movies.ts b/src/endpoints/movies.ts index f9c312f..22503cc 100644 --- a/src/endpoints/movies.ts +++ b/src/endpoints/movies.ts @@ -1,6 +1,8 @@ import { BaseEndpoint } from './base'; import { AlternativeTitles, + AppendToResponse, + AppendToResponseKeys, ChangeOptions, Credits, ExternalIds, @@ -33,8 +35,18 @@ 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 { diff --git a/src/endpoints/tv-shows.ts b/src/endpoints/tv-shows.ts index c1c3746..fd956c9 100644 --- a/src/endpoints/tv-shows.ts +++ b/src/endpoints/tv-shows.ts @@ -1,6 +1,8 @@ import { BaseEndpoint } from './base'; import { AlternativeTitles, + AppendToResponse, + AppendToResponseKeys, ChangeOptions, ContentRatings, Credits, @@ -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 { diff --git a/src/types/options.ts b/src/types/options.ts index 13af8ff..e48c572 100644 --- a/src/types/options.ts +++ b/src/types/options.ts @@ -1,3 +1,13 @@ +import { + Credits, + Images, + Keywords, + Recommendations, + Reviews, + Translations, + Videos, +} from '.'; + export interface LanguageOption { language?: string; } @@ -9,3 +19,31 @@ export interface RegionOption { export interface PageOption { page?: number; } + +export type AppendToResponseKeys = + | 'images' + | 'videos' + | 'credits' + | 'recommendations' + | 'reviews' + | 'keywords'; + +export type AppendToResponse< + K, + T extends AppendToResponseKeys[] | undefined +> = 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 } : object) & + ('recommendations' extends T[number] + ? { recommendations: Recommendations } + : object) & + ('reviews' extends T[number] ? { reviews: Omit } : object) & + ('reviews' extends T[number] + ? { reviews: Omit } + : object) & + ('keywords' extends T[number] ? { keywords: Omit } : object) + : never);