diff --git a/src/endpoints/collections.ts b/src/endpoints/collections.ts index 50550a9..8227931 100644 --- a/src/endpoints/collections.ts +++ b/src/endpoints/collections.ts @@ -1,4 +1,5 @@ import { + CollectionImageOptions, DetailedCollection, ImageCollection, LanguageOption, @@ -23,10 +24,14 @@ export class CollectionsEndpoint extends BaseEndpoint { ); } - async images(id: number, options?: LanguageOption): Promise { + async images(id: number, options?: CollectionImageOptions): Promise { + const computedOptions = { + include_image_language: options?.include_image_language?.join(','), + language: options?.language, + }; return await this.api.get( `${BASE_COLLECTION}/${id}/images`, - options + computedOptions ); } diff --git a/src/endpoints/genre.ts b/src/endpoints/genre.ts index e9d306e..e9a51b8 100644 --- a/src/endpoints/genre.ts +++ b/src/endpoints/genre.ts @@ -1,3 +1,4 @@ +import { LanguageOption } from '../types'; import { BaseEndpoint } from './base'; export interface Genres { @@ -9,11 +10,11 @@ export class GenreEndpoint extends BaseEndpoint { super(accessToken); } - async movies(): Promise { - return await this.api.get('/genre/movie/list'); + async movies(options?: LanguageOption): Promise { + return await this.api.get('/genre/movie/list', options); } - async tvShows(): Promise { - return await this.api.get('/genre/tv/list'); + async tvShows(options?: LanguageOption): Promise { + return await this.api.get('/genre/tv/list', options); } } diff --git a/src/endpoints/movies.ts b/src/endpoints/movies.ts index 087953a..c686651 100644 --- a/src/endpoints/movies.ts +++ b/src/endpoints/movies.ts @@ -31,6 +31,13 @@ import { const BASE_MOVIE = '/movie'; +export interface MoviesImageSearchOptions extends LanguageOption { + /** + * a list of ISO-639-1 values to query + */ + include_image_language?: string[], +} + export class MoviesEndpoint extends BaseEndpoint { constructor(protected readonly accessToken: string) { super(accessToken); @@ -38,12 +45,14 @@ export class MoviesEndpoint extends BaseEndpoint { async details( id: number, - appendToResponse?: T + appendToResponse?: T, + language?: string ) { const options = { append_to_response: appendToResponse ? appendToResponse.join(',') : undefined, + language: language, }; return await this.api.get>( @@ -68,16 +77,20 @@ export class MoviesEndpoint extends BaseEndpoint { ); } - async credits(id: number): Promise { - return await this.api.get(`${BASE_MOVIE}/${id}/credits`); + async credits(id: number, options?: LanguageOption): Promise { + return await this.api.get(`${BASE_MOVIE}/${id}/credits`, options); } async externalIds(id: number): Promise { return await this.api.get(`${BASE_MOVIE}/${id}/external_ids`); } - async images(id: number): Promise { - return await this.api.get(`${BASE_MOVIE}/${id}/images`); + async images(id: number, options?: MoviesImageSearchOptions): Promise { + const computedOptions = { + include_image_language: options?.include_image_language?.join(','), + language: options?.language, + }; + return await this.api.get(`${BASE_MOVIE}/${id}/images`, computedOptions); } async keywords(id: number): Promise { @@ -86,14 +99,14 @@ export class MoviesEndpoint extends BaseEndpoint { async lists( id: number, - options?: LanguageOption | PageOption + options?: LanguageOption & PageOption ): Promise { return await this.api.get(`${BASE_MOVIE}/${id}/lists`, options); } async recommendations( id: number, - options?: PageOption + options?: LanguageOption & PageOption ): Promise { return await this.api.get( `${BASE_MOVIE}/${id}/recommendations`, @@ -107,11 +120,11 @@ export class MoviesEndpoint extends BaseEndpoint { ); } - async reviews(id: number, options?: PageOption): Promise { + async reviews(id: number, options?: LanguageOption & PageOption): Promise { return await this.api.get(`${BASE_MOVIE}/${id}/reviews`, options); } - async similar(id: number, options?: PageOption): Promise { + async similar(id: number, options?: LanguageOption & PageOption): Promise { return await this.api.get( `${BASE_MOVIE}/${id}/similar`, options @@ -122,8 +135,8 @@ export class MoviesEndpoint extends BaseEndpoint { return await this.api.get(`${BASE_MOVIE}/${id}/translations`); } - async videos(id: number): Promise { - return await this.api.get(`${BASE_MOVIE}/${id}/videos`); + async videos(id: number, options?: LanguageOption): Promise { + return await this.api.get(`${BASE_MOVIE}/${id}/videos`, options); } /** @@ -149,7 +162,7 @@ export class MoviesEndpoint extends BaseEndpoint { ); } - async popular(options?: PageOption): Promise { + async popular(options?: LanguageOption & PageOption): Promise { return await this.api.get(`${BASE_MOVIE}/popular`, options); } diff --git a/src/endpoints/people.ts b/src/endpoints/people.ts index 48ae5b7..9d7e606 100644 --- a/src/endpoints/people.ts +++ b/src/endpoints/people.ts @@ -14,6 +14,7 @@ import { TaggedImages, Changes, PersonChangeValue, + LanguageOption, } from '../types'; import { BaseEndpoint } from './base'; @@ -26,12 +27,14 @@ export class PeopleEndpoint extends BaseEndpoint { async details( id: number, - appendToResponse?: T + appendToResponse?: T, + language?: string ) { const options = { append_to_response: appendToResponse ? appendToResponse.join(',') : undefined, + language: language }; return await this.api.get>( `${BASE_PERSON}/${id}`, @@ -49,21 +52,24 @@ export class PeopleEndpoint extends BaseEndpoint { ); } - async movieCredits(id: number): Promise { + async movieCredits(id: number, options?: LanguageOption): Promise { return await this.api.get( - `${BASE_PERSON}/${id}/movie_credits` + `${BASE_PERSON}/${id}/movie_credits`, + options ); } - async tvShowCredits(id: number): Promise { + async tvShowCredits(id: number, options?: LanguageOption): Promise { return await this.api.get( - `${BASE_PERSON}/${id}/tv_credits` + `${BASE_PERSON}/${id}/tv_credits`, + options ); } - async combinedCredits(id: number): Promise { + async combinedCredits(id: number, options?: LanguageOption): Promise { return await this.api.get( - `${BASE_PERSON}/${id}/combined_credits` + `${BASE_PERSON}/${id}/combined_credits`, + options ); } @@ -92,7 +98,7 @@ export class PeopleEndpoint extends BaseEndpoint { return await this.api.get(`${BASE_PERSON}/latest`); } - async popular(options?: PageOption): Promise { + async popular(options?: LanguageOption & PageOption): Promise { return await this.api.get( `${BASE_PERSON}/popular`, options diff --git a/src/endpoints/search.ts b/src/endpoints/search.ts index 83fd6c1..7b83ab0 100644 --- a/src/endpoints/search.ts +++ b/src/endpoints/search.ts @@ -1,6 +1,6 @@ import { BaseEndpoint } from './base'; import { MultiSearchResult, Search } from '../types/search'; -import { Collection, Company, Movie, Person, TV } from '../types'; +import { Collection, Company, LanguageOption, Movie, PageOption, Person, RegionOption, TV } from '../types'; const BASE_SEARCH = '/search'; @@ -9,22 +9,27 @@ export interface SearchOptions { page?: number; } -export interface MovieSearchOptions extends SearchOptions { +export interface MovieSearchOptions extends SearchOptions, LanguageOption, PageOption, RegionOption { include_adult?: boolean; year?: number; primary_release_year?: number; } -export interface TvSearchOptions extends SearchOptions { +export interface CollectionSearchOptions extends SearchOptions, LanguageOption, PageOption, RegionOption { include_adult?: boolean; +} + +export interface TvSearchOptions extends SearchOptions, LanguageOption, PageOption { + include_adult?: boolean; + year?: number; first_air_date_year?: number; } -export interface PeopleSearchOptions extends SearchOptions { +export interface PeopleSearchOptions extends SearchOptions, LanguageOption, PageOption { include_adult?: boolean; } -export interface MultiSearchOptions extends SearchOptions { +export interface MultiSearchOptions extends SearchOptions, LanguageOption, PageOption { include_adult?: boolean; } diff --git a/src/endpoints/trending.ts b/src/endpoints/trending.ts index 1d2124b..e6558e0 100644 --- a/src/endpoints/trending.ts +++ b/src/endpoints/trending.ts @@ -1,4 +1,4 @@ -import { TrendingMediaType, TimeWindow, TrendingResults } from '../types'; +import { TrendingMediaType, TimeWindow, TrendingResults, LanguageOption } from '../types'; import { BaseEndpoint } from './base'; export class TrendingEndpoint extends BaseEndpoint { @@ -8,10 +8,12 @@ export class TrendingEndpoint extends BaseEndpoint { async trending( mediaType: T, - timeWindow: TimeWindow + timeWindow: TimeWindow, + options?: LanguageOption ): Promise> { return await this.api.get>( - `/trending/${mediaType}/${timeWindow}` + `/trending/${mediaType}/${timeWindow}`, + options ); } } diff --git a/src/endpoints/tv-episode.ts b/src/endpoints/tv-episode.ts index 88ee28e..ff80f7c 100644 --- a/src/endpoints/tv-episode.ts +++ b/src/endpoints/tv-episode.ts @@ -20,6 +20,20 @@ const BASE_EPISODE = (episodeSelection: EpisodeSelection): string => { return `/tv/${episodeSelection.tvShowID}/season/${episodeSelection.seasonNumber}/episode/${episodeSelection.episodeNumber}`; }; +export interface TvEpisodeImageSearchOptions extends LanguageOption { + /** + * a list of ISO-639-1 values to query + */ + include_image_language?: string[], +} + +export interface TvEpisodeVideoSearchOptions extends LanguageOption { + /** + * a list of ISO-639-1 values to query + */ + include_video_language?: string[], +} + export class TvEpisodesEndpoint extends BaseEndpoint { constructor(accessToken: string) { super(accessToken); @@ -62,9 +76,14 @@ export class TvEpisodesEndpoint extends BaseEndpoint { ); } - async images(episodeSelection: EpisodeSelection) { + async images(episodeSelection: EpisodeSelection, options?: TvEpisodeImageSearchOptions) { + const computedOptions = { + include_image_language: options?.include_image_language?.join(','), + language: options?.language, + }; return await this.api.get( - `${BASE_EPISODE(episodeSelection)}/images` + `${BASE_EPISODE(episodeSelection)}/images`, + computedOptions ); } @@ -74,10 +93,14 @@ export class TvEpisodesEndpoint extends BaseEndpoint { ); } - async videos(episodeSelection: EpisodeSelection, options?: LanguageOption) { + async videos(episodeSelection: EpisodeSelection, options?: TvEpisodeVideoSearchOptions) { + const computedOptions = { + include_video_language: options?.include_video_language?.join(','), + language: options?.language, + }; return await this.api.get( `${BASE_EPISODE(episodeSelection)}/videos`, - options + computedOptions ); } } diff --git a/src/endpoints/tv-seasons.ts b/src/endpoints/tv-seasons.ts index 7be3512..221f71d 100644 --- a/src/endpoints/tv-seasons.ts +++ b/src/endpoints/tv-seasons.ts @@ -20,6 +20,20 @@ const BASE_SEASON = (seasonSelection: SeasonSelection): string => { return `/tv/${seasonSelection.tvShowID}/season/${seasonSelection.seasonNumber}`; }; +export interface TvSeasonImageSearchOptions extends LanguageOption { + /** + * a list of ISO-639-1 values to query + */ + include_image_language?: string[], +} + +export interface TvSeasonVideoSearchOptions extends LanguageOption { + /** + * a list of ISO-639-1 values to query + */ + include_video_language?: string[], +} + export class TvSeasonsEndpoint extends BaseEndpoint { constructor(accessToken: string) { super(accessToken); @@ -77,17 +91,25 @@ export class TvSeasonsEndpoint extends BaseEndpoint { ); } - async images(seasonSelection: SeasonSelection, options?: LanguageOption) { + async images(seasonSelection: SeasonSelection, options?: TvSeasonImageSearchOptions) { + const computedOptions = { + include_image_language: options?.include_image_language?.join(','), + language: options?.language, + }; return await this.api.get( `${BASE_SEASON(seasonSelection)}/images`, - options + computedOptions ); } - async videos(seasonSelection: SeasonSelection, options?: LanguageOption) { + async videos(seasonSelection: SeasonSelection, options?: TvSeasonVideoSearchOptions) { + const computedOptions = { + include_video_language: options?.include_video_language?.join(','), + language: options?.language, + }; return await this.api.get( `${BASE_SEASON(seasonSelection)}/videos`, - options + computedOptions ); } diff --git a/src/endpoints/tv-shows.ts b/src/endpoints/tv-shows.ts index 4bfd454..478828d 100644 --- a/src/endpoints/tv-shows.ts +++ b/src/endpoints/tv-shows.ts @@ -18,13 +18,15 @@ import { PageOption, PopularTvShows, Recommendations, - RegionOption, Reviews, ScreenedTheatrically, SeasonDetails, SimilarTvShows, + TimezoneOption, TopRatedTvShows, Translations, + TvShowImageOptions, + TvShowVideoOptions, TvShowChangeValue, TvShowDetails, TvShowsAiringToday, @@ -41,12 +43,14 @@ export class TvShowsEndpoint extends BaseEndpoint { async details( id: number, - appendToResponse?: T + appendToResponse?: T, + language?: string ) { const options = { append_to_response: appendToResponse ? appendToResponse.join(',') : undefined, + language: language, }; return await this.api.get>( `${BASE_TV}/${id}`, @@ -76,14 +80,15 @@ export class TvShowsEndpoint extends BaseEndpoint { ); } - async aggregateCredits(id: number): Promise { + async aggregateCredits(id: number, options?: LanguageOption): Promise { return await this.api.get( - `${BASE_TV}/${id}/aggregate_credits` + `${BASE_TV}/${id}/aggregate_credits`, + options ); } - async credits(id: number): Promise { - return await this.api.get(`${BASE_TV}/${id}/credits`); + async credits(id: number, options?: LanguageOption): Promise { + return await this.api.get(`${BASE_TV}/${id}/credits`, options); } async season(tvId: number, seasonNumber: number): Promise { @@ -100,8 +105,12 @@ export class TvShowsEndpoint extends BaseEndpoint { return await this.api.get(`${BASE_TV}/${id}/external_ids`); } - async images(id: number): Promise { - return await this.api.get(`${BASE_TV}/${id}/images`); + async images(id: number, options?: TvShowImageOptions): Promise { + const computedOptions = { + include_image_language: options?.include_image_language?.join(','), + language: options?.language, + }; + return await this.api.get(`${BASE_TV}/${id}/images`, computedOptions); } async keywords(id: number): Promise { @@ -110,7 +119,7 @@ export class TvShowsEndpoint extends BaseEndpoint { async recommendations( id: number, - options?: PageOption + options?: LanguageOption & PageOption ): Promise { return await this.api.get( `${BASE_TV}/${id}/recommendations`, @@ -118,7 +127,7 @@ export class TvShowsEndpoint extends BaseEndpoint { ); } - async reviews(id: number, options?: PageOption): Promise { + async reviews(id: number, options?: LanguageOption & PageOption): Promise { return await this.api.get(`${BASE_TV}/${id}/reviews`, options); } @@ -128,7 +137,7 @@ export class TvShowsEndpoint extends BaseEndpoint { ); } - async similar(id: number, options?: PageOption): Promise { + async similar(id: number, options?: LanguageOption & PageOption): Promise { return await this.api.get( `${BASE_TV}/${id}/similar`, options @@ -139,8 +148,12 @@ export class TvShowsEndpoint extends BaseEndpoint { return await this.api.get(`${BASE_TV}/${id}/translations`); } - async videos(id: number): Promise { - return await this.api.get(`${BASE_TV}/${id}/videos`); + async videos(id: number, options?: TvShowVideoOptions): Promise { + const computedOptions = { + include_video_language: options?.include_video_language?.join(','), + language: options?.language, + }; + return await this.api.get(`${BASE_TV}/${id}/videos`, computedOptions); } /** @@ -157,12 +170,14 @@ export class TvShowsEndpoint extends BaseEndpoint { return await this.api.get(`${BASE_TV}/latest`); } - async onTheAir(): Promise { - return await this.api.get(`${BASE_TV}/on_the_air`); + async onTheAir( + options?: PageOption & LanguageOption & TimezoneOption + ): Promise { + return await this.api.get(`${BASE_TV}/on_the_air`, options); } async airingToday( - options?: PageOption & LanguageOption & RegionOption + options?: PageOption & LanguageOption & TimezoneOption ): Promise { return await this.api.get( `${BASE_TV}/airing_today`, @@ -171,13 +186,13 @@ export class TvShowsEndpoint extends BaseEndpoint { } async popular( - options?: PageOption & LanguageOption & RegionOption + options?: PageOption & LanguageOption ): Promise { return await this.api.get(`${BASE_TV}/popular`, options); } async topRated( - options?: PageOption & LanguageOption & RegionOption + options?: PageOption & LanguageOption ): Promise { return await this.api.get(`${BASE_TV}/top_rated`, options); } diff --git a/src/types/collections.ts b/src/types/collections.ts index 5f98cd5..a91e080 100644 --- a/src/types/collections.ts +++ b/src/types/collections.ts @@ -1,4 +1,4 @@ -import { Movie } from '.'; +import { LanguageOption, Movie } from '.'; export interface Collection { id: number; @@ -14,3 +14,10 @@ export interface Collection { export interface DetailedCollection extends Collection { parts: Movie[]; } + +export interface CollectionImageOptions extends LanguageOption { + /** + * a list of ISO-639-1 values to query + */ + include_image_language?: string[], +} \ No newline at end of file diff --git a/src/types/keywords.ts b/src/types/keywords.ts index 62d2fd1..9c46be0 100644 --- a/src/types/keywords.ts +++ b/src/types/keywords.ts @@ -1,6 +1,7 @@ import { Movie } from '.'; +import { PageOption } from './options'; -export interface KeywordsOptions { +export interface KeywordsOptions extends PageOption { include_adult?: boolean; language?: string; } diff --git a/src/types/options.ts b/src/types/options.ts index 12b78a7..48be056 100644 --- a/src/types/options.ts +++ b/src/types/options.ts @@ -40,6 +40,10 @@ export interface RegionOption { region?: string; } +export interface TimezoneOption { + timezone?: string; +} + export interface PageOption { page?: number; } diff --git a/src/types/tv-shows.ts b/src/types/tv-shows.ts index 5bf4772..352fb80 100644 --- a/src/types/tv-shows.ts +++ b/src/types/tv-shows.ts @@ -3,7 +3,7 @@ import { ProductionCompany, ProductionCountry, SpokenLanguage, - Episode, + LanguageOption, } from './'; export interface CreatedBy { @@ -274,3 +274,17 @@ export interface TvShowChangeValue { season_id: number; season_number: number; } + +export interface TvShowImageOptions extends LanguageOption { + /** + * a list of ISO-639-1 values to query + */ + include_image_language?: string[], +} + +export interface TvShowVideoOptions extends LanguageOption { + /** + * a list of ISO-639-1 values to query + */ + include_video_language?: string[], +} \ No newline at end of file