base tv-episode integration

This commit is contained in:
DerPenz
2023-05-06 18:57:20 +02:00
parent b0b6398169
commit 9457dce115
7 changed files with 171 additions and 32 deletions

View File

@@ -14,3 +14,5 @@ export * from './trending';
export * from './find';
export * from './keywords';
export * from './collections';
export * from './tv-episode';

View File

@@ -0,0 +1,83 @@
import {
Episode,
EpisodeSelection,
LanguageOption,
PageOption,
ChangeOption,
TvEpisodeChanges,
TvEpisodeCredit,
ExternalIds,
Images,
TvEpisodeTranslations,
Videos,
AppendToResponseMovieKey,
AppendToResponse,
} 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<T extends AppendToResponseMovieKey[] | undefined>(
episodeSelection: EpisodeSelection,
appendToResponse?: T,
options?: LanguageOption
) {
const combinedOptions = {
append_to_response: appendToResponse
? appendToResponse.join(',')
: undefined,
...options,
};
return await this.api.get<
AppendToResponse<Omit<Episode, 'show_id'>, T, 'movie'>
>(`${BASE_EPISODE(episodeSelection)}`, combinedOptions);
}
async changes(episodeID: number, options?: PageOption & ChangeOption) {
return await this.api.get<TvEpisodeChanges>(
`/tv/episode/${episodeID}/changes`,
options
);
}
async credits(episodeSelection: EpisodeSelection, options?: LanguageOption) {
return await this.api.get<TvEpisodeCredit>(
`${BASE_EPISODE(episodeSelection)}/credits`,
options
);
}
async externalIds(episodeSelection: EpisodeSelection) {
return await this.api.get<ExternalIds>(
`${BASE_EPISODE(episodeSelection)}/external_ids`
);
}
async images(episodeSelection: EpisodeSelection) {
return await this.api.get<Images>(
`${BASE_EPISODE(episodeSelection)}/images`
);
}
async translations(episodeSelection: EpisodeSelection) {
return await this.api.get<TvEpisodeTranslations>(
`${BASE_EPISODE(episodeSelection)}/translations`
);
}
async videos(episodeSelection: EpisodeSelection, options?: LanguageOption) {
return await this.api.get<Videos>(
`${BASE_EPISODE(episodeSelection)}/videos`,
options
);
}
}

View File

@@ -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);
}

View File

@@ -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';

View File

@@ -38,6 +38,11 @@ export interface PageOption {
page?: number;
}
export interface ChangeOption extends PageOption {
start_date?: Date;
end_date?: Date;
}
export type AppendToResponseMovieKey =
| 'images'
| 'videos'

74
src/types/tv-episode.ts Normal file
View File

@@ -0,0 +1,74 @@
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 TvEpisodeChangeItem {
id: string;
action: string;
time: string;
iso_639_1: string;
iso_3166_1: string;
value: string;
}
export interface TvEpisodeChange {
key: string;
items: TvEpisodeChangeItem[];
}
export interface TvEpisodeChanges {
changes: TvEpisodeChange[];
}
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;
};
};
}

View File

@@ -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[];