diff --git a/package.json b/package.json index bbfe876..9773a3e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tmdb-ts", - "version": "1.2.0", + "version": "1.3.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 b7521de..be3d2dd 100644 --- a/src/endpoints/changes.ts +++ b/src/endpoints/changes.ts @@ -1,20 +1,20 @@ +import { ChangeOption, MediaChanges } from '../types'; import { BaseEndpoint } from './base'; -import { ChangeOptions, MediaChanges } from '../types/changes'; export class ChangeEndpoint extends BaseEndpoint { constructor(protected readonly accessToken: string) { super(accessToken); } - async movies(options?: ChangeOptions): Promise { + async movies(options?: ChangeOption): Promise { return await this.api.get(`/movie/changes`, options); } - async tvShows(options?: ChangeOptions): Promise { + async tvShows(options?: ChangeOption): Promise { return await this.api.get(`/tv/changes`, options); } - async person(options?: ChangeOptions): Promise { + async person(options?: ChangeOption): Promise { return await this.api.get(`/person/change`, options); } } diff --git a/src/endpoints/index.ts b/src/endpoints/index.ts index 6c2fa6a..e08baa8 100644 --- a/src/endpoints/index.ts +++ b/src/endpoints/index.ts @@ -14,3 +14,5 @@ export * from './trending'; export * from './find'; export * from './keywords'; export * from './collections'; +export * from './tv-episode'; + diff --git a/src/endpoints/movies.ts b/src/endpoints/movies.ts index 70d0734..e81064e 100644 --- a/src/endpoints/movies.ts +++ b/src/endpoints/movies.ts @@ -3,7 +3,7 @@ import { AlternativeTitles, AppendToResponse, AppendToResponseMovieKey, - ChangeOptions, + ChangeOption, Changes, Credits, ExternalIds, @@ -11,6 +11,7 @@ import { Keywords, LanguageOption, LatestMovie, + MovieChangeValue, MovieDetails, MovieLists, MoviesPlayingNow, @@ -57,8 +58,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?: ChangeOption): 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 0d4aa70..48ae5b7 100644 --- a/src/endpoints/people.ts +++ b/src/endpoints/people.ts @@ -1,18 +1,19 @@ import { AppendToResponse, AppendToResponsePersonKey, - ChangeOptions, + ChangeOption, ExternalIds, PageOption, PeopleImages, PersonTranslations, - PersonChanges, PersonCombinedCredits, PersonDetails, PersonMovieCredit, PersonTvShowCredit, PopularPersons, TaggedImages, + Changes, + PersonChangeValue, } from '../types'; import { BaseEndpoint } from './base'; @@ -38,8 +39,11 @@ export class PeopleEndpoint extends BaseEndpoint { ); } - async changes(id: number, options?: ChangeOptions): Promise { - return await this.api.get( + async changes( + id: number, + options?: ChangeOption + ): Promise> { + return await this.api.get>( `${BASE_PERSON}/${id}/changes`, options ); diff --git a/src/endpoints/tv-episode.ts b/src/endpoints/tv-episode.ts new file mode 100644 index 0000000..88ee28e --- /dev/null +++ b/src/endpoints/tv-episode.ts @@ -0,0 +1,83 @@ +import { + Episode, + EpisodeSelection, + LanguageOption, + ChangeOption, + TvEpisodeCredit, + ExternalIds, + Images, + TvEpisodeTranslations, + Videos, + AppendToResponseMovieKey, + AppendToResponse, + Changes, + TvEpisodeChangeValue, + AppendToResponseTvEpisodeKey, +} from '..'; +import { BaseEndpoint } from './base'; + +const BASE_EPISODE = (episodeSelection: EpisodeSelection): string => { + return `/tv/${episodeSelection.tvShowID}/season/${episodeSelection.seasonNumber}/episode/${episodeSelection.episodeNumber}`; +}; + +export class TvEpisodesEndpoint extends BaseEndpoint { + constructor(accessToken: string) { + super(accessToken); + } + + async details( + episodeSelection: EpisodeSelection, + appendToResponse?: T, + options?: LanguageOption + ) { + const combinedOptions = { + append_to_response: appendToResponse + ? appendToResponse.join(',') + : undefined, + ...options, + }; + + return await this.api.get< + AppendToResponse, T, 'tvEpisode'> + >(`${BASE_EPISODE(episodeSelection)}`, combinedOptions); + } + + async changes(episodeID: number, options?: ChangeOption) { + return await this.api.get>( + `/tv/episode/${episodeID}/changes`, + options + ); + } + + async credits(episodeSelection: EpisodeSelection, options?: LanguageOption) { + return await this.api.get( + `${BASE_EPISODE(episodeSelection)}/credits`, + options + ); + } + + async externalIds(episodeSelection: EpisodeSelection) { + return await this.api.get( + `${BASE_EPISODE(episodeSelection)}/external_ids` + ); + } + + async images(episodeSelection: EpisodeSelection) { + return await this.api.get( + `${BASE_EPISODE(episodeSelection)}/images` + ); + } + + async translations(episodeSelection: EpisodeSelection) { + return await this.api.get( + `${BASE_EPISODE(episodeSelection)}/translations` + ); + } + + async videos(episodeSelection: EpisodeSelection, options?: LanguageOption) { + return await this.api.get( + `${BASE_EPISODE(episodeSelection)}/videos`, + options + ); + } +} diff --git a/src/endpoints/tv-shows.ts b/src/endpoints/tv-shows.ts index 738d4e2..4073dc8 100644 --- a/src/endpoints/tv-shows.ts +++ b/src/endpoints/tv-shows.ts @@ -3,7 +3,7 @@ import { AlternativeTitles, AppendToResponse, AppendToResponseTvKey, - ChangeOptions, + ChangeOption, Changes, ContentRatings, Credits, @@ -24,6 +24,7 @@ import { SimilarTvShows, TopRatedTvShows, Translations, + TvShowChangeValue, TvShowDetails, TvShowsAiringToday, Videos, @@ -58,8 +59,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?: ChangeOption): Promise> { + return await this.api.get>(`${BASE_TV}/${id}/changes`, options); } async contentRatings(id: number): Promise { diff --git a/src/tmdb.ts b/src/tmdb.ts index b0a5416..3e72afa 100644 --- a/src/tmdb.ts +++ b/src/tmdb.ts @@ -15,6 +15,7 @@ import { FindEndpoint, KeywordsEndpoint, CollectionsEndpoint, + TvEpisodesEndpoint, } from './endpoints'; export class TMDB { @@ -60,6 +61,10 @@ export class TMDB { return new TvShowsEndpoint(this.accessToken); } + get tvEpisode(): TvEpisodesEndpoint { + return new TvEpisodesEndpoint(this.accessToken); + } + get discover(): DiscoverEndpoint { return new DiscoverEndpoint(this.accessToken); } diff --git a/src/types/changes.ts b/src/types/changes.ts index 3c5f786..62151e9 100644 --- a/src/types/changes.ts +++ b/src/types/changes.ts @@ -10,26 +10,20 @@ export interface MediaChanges { total_results: number; } -export interface ChangeOptions { - end_date?: string; - start_date?: string; - page?: number; +export interface Changes { + changes: Change[]; } -export interface Changes { - changes: Change[]; -} - -export interface Change { +export interface Change { key: string; - items: ChangeItem[]; + items: ChangeItem[]; } -export interface ChangeItem { +export interface ChangeItem { id: string; action: string; time: string; - value: Array; + value: T; iso_639_1: string; - original_value: Array; + original_value: T; } diff --git a/src/types/index.ts b/src/types/index.ts index a6f0c0b..0e04011 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -14,6 +14,7 @@ export * from './trending'; export * from './find'; export * from './keywords'; export * from './collections'; +export * from './tv-episode'; export type MediaType = 'movie' | 'tv' | 'person'; diff --git a/src/types/movies.ts b/src/types/movies.ts index 77789b9..15fce6e 100644 --- a/src/types/movies.ts +++ b/src/types/movies.ts @@ -155,3 +155,14 @@ export interface UpcomingMovies { total_results: number; total_pages: number; } + +export type MovieChangeValue = + | string + | { + person_id: number; + character: string; + order: number; + cast_id: number; + credit_id: string; + } + | unknown; diff --git a/src/types/options.ts b/src/types/options.ts index af8f924..b2ceb61 100644 --- a/src/types/options.ts +++ b/src/types/options.ts @@ -10,7 +10,6 @@ import { MovieLists, PeopleImages, PersonTranslations, - PersonChanges, PersonCombinedCredits, PersonMovieCredit, PersonTvShowCredit, @@ -24,6 +23,12 @@ import { Translations, Videos, WatchProviders, + PersonChangeValue, + MovieChangeValue, + TvShowChangeValue, + TvEpisodeChangeValue, + TvEpisodeCredit, + TvEpisodeTranslations, } from '.'; export interface LanguageOption { @@ -38,6 +43,11 @@ export interface PageOption { page?: number; } +export interface ChangeOption extends PageOption { + start_date?: Date; + end_date?: Date; +} + export type AppendToResponseMovieKey = | 'images' | 'videos' @@ -82,12 +92,24 @@ export type AppendToResponsePersonKey = | 'tagged_images' | 'translations'; +export type AppendToResponseTvEpisodeKey = + | 'images' + | 'credits' + | 'external_ids' + | 'videos' + | 'translations'; + type AppendToResponseAllKeys = | AppendToResponseTvKey | AppendToResponseMovieKey + | AppendToResponseTvEpisodeKey | AppendToResponsePersonKey; -export type AppendToResponseMediaType = 'movie' | 'tvShow' | 'person'; +export type AppendToResponseMediaType = + | 'movie' + | 'tvShow' + | 'person' + | 'tvEpisode'; export type AppendToResponse< K, @@ -98,7 +120,11 @@ export type AppendToResponse< ? object : T extends Array ? ('credits' extends T[number] - ? { credits: Omit } + ? { + credits: Media extends 'tvEpisode' + ? TvEpisodeCredit + : Omit; + } : object) & ('videos' extends T[number] ? { videos: Omit } : object) & ('images' extends T[number] @@ -120,9 +146,14 @@ export type AppendToResponse< : object) & ('changes' extends T[number] ? { - changes: Omit< - Media extends 'person' ? PersonChanges : Changes, - 'id' + changes: Changes< + Media extends 'person' + ? PersonChangeValue + : Media extends 'movie' + ? MovieChangeValue + : Media extends 'tvShow' + ? TvShowChangeValue + : TvEpisodeChangeValue >; } : object) & @@ -142,7 +173,16 @@ export type AppendToResponse< ? { external_ids: Omit } : object) & ('translations' extends T[number] - ? { translations: Omit } + ? { + translations: Omit< + Media extends 'person' + ? PersonTranslations + : Media extends 'tvEpisode' + ? TvEpisodeTranslations + : Translations, + 'id' + >; + } : object) & ('watch/providers' extends T[number] ? { 'watch/providers': Omit } diff --git a/src/types/people.ts b/src/types/people.ts index 333c1ba..cb34952 100644 --- a/src/types/people.ts +++ b/src/types/people.ts @@ -96,22 +96,13 @@ export interface PersonDetails { 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 type PersonChangeValue = + | string + | { + profile: { + file_path: string; + }; + }; export interface PopularPersons { page: number; diff --git a/src/types/tv-episode.ts b/src/types/tv-episode.ts new file mode 100644 index 0000000..8212d2e --- /dev/null +++ b/src/types/tv-episode.ts @@ -0,0 +1,58 @@ +import { Credits, Crew } from '.'; + +export interface EpisodeSelection { + tvShowID: number; + seasonNumber: number; + episodeNumber: number; +} + +export interface Episode { + air_date: string; + episode_number: number; + crew: Crew[]; + guest_stars: GuestStar[]; + id: number; + name: string; + overview: string; + production_code: string; + season_number: number; + still_path: string; + vote_average: number; + vote_count: number; + runtime: number; + show_id: number; +} + +export interface GuestStar { + credit_id: string; + order: number; + character: string; + adult: boolean; + gender: number | null; + id: number; + known_for_department: string; + name: string; + original_name: string; + popularity: number; + profile_path: string | null; +} + +export interface TvEpisodeCredit extends Credits { + guest_stars: GuestStar[]; +} + +export interface TvEpisodeTranslations { + id: number; + translations: { + iso_3166_1: string; + iso_639_1: string; + name: string; + english_name: string; + data: { + name: string; + overview: string; + }; + }; +} + +export type TvEpisodeChangeValue = string | unknown; \ No newline at end of file diff --git a/src/types/tv-shows.ts b/src/types/tv-shows.ts index a38f533..eba1193 100644 --- a/src/types/tv-shows.ts +++ b/src/types/tv-shows.ts @@ -3,7 +3,7 @@ import { ProductionCompany, ProductionCountry, SpokenLanguage, - Crew, + Episode, } from './'; export interface CreatedBy { @@ -93,37 +93,6 @@ export interface TvShowDetails { vote_count: number; } -export interface GuestStar { - credit_id: string; - order: number; - character: string; - adult: boolean; - gender: number | null; - id: number; - known_for_department: string; - name: string; - original_name: string; - popularity: number; - profile_path: string | null; -} - -export interface Episode { - air_date: string; - episode_number: number; - crew: Crew[]; - guest_stars: GuestStar[]; - id: number; - name: string; - overview: string; - production_code: string; - season_number: number; - still_path: string; - vote_average: number; - vote_count: number; - show_id: number; - runtime: number; -} - export interface SeasonDetails { air_date: string; episodes: Episode[]; @@ -310,3 +279,8 @@ export interface TopRatedTvShows { total_results: number; total_pages: number; } + +export interface TvShowChangeValue { + season_id: number; + season_number: number; +}