diff --git a/src/endpoints/find.ts b/src/endpoints/find.ts new file mode 100644 index 0000000..4df537d --- /dev/null +++ b/src/endpoints/find.ts @@ -0,0 +1,14 @@ +import { BaseEndpoint } from './base'; +import querystring from 'querystring'; +import { ExternalIdOptions, FindResult } from '../types'; + +export class FindEndpoint extends BaseEndpoint { + constructor(accessToken: string) { + super(accessToken); + } + + async byId(externalId: string, options: ExternalIdOptions): Promise { + const params = querystring.encode(options); + return await this.api.get(`/find/${externalId}?${params}`); + } +} diff --git a/src/endpoints/index.ts b/src/endpoints/index.ts index e40522e..afa61d5 100644 --- a/src/endpoints/index.ts +++ b/src/endpoints/index.ts @@ -11,4 +11,7 @@ export * from './configuration'; export * from './tv-shows'; export * from './discover'; export * from './people'; +export * from './review'; +export * from './trending'; +export * from './find'; diff --git a/src/endpoints/review.ts b/src/endpoints/review.ts new file mode 100644 index 0000000..35925b7 --- /dev/null +++ b/src/endpoints/review.ts @@ -0,0 +1,12 @@ +import { ReviewDetails } from '../types'; +import { BaseEndpoint } from './base'; + +export class ReviewEndpoint extends BaseEndpoint { + constructor(accessToken: string) { + super(accessToken); + } + + async details(id: string): Promise { + return await this.api.get(`/review/${id}`); + } +} diff --git a/src/endpoints/trending.ts b/src/endpoints/trending.ts new file mode 100644 index 0000000..5cdc79f --- /dev/null +++ b/src/endpoints/trending.ts @@ -0,0 +1,14 @@ +import { MediaType, TimeWindow, TrendingResults, } from '../types'; +import { BaseEndpoint } from './base'; + +export class TrendingEndpoint extends BaseEndpoint { + constructor(accessToken: string) { + super(accessToken); + } + + async trending(mediaType : T, timeWindow: TimeWindow): Promise> { + return await this.api.get>(`/trending/${mediaType}/${timeWindow}`); + } +} + + diff --git a/src/tmdb.ts b/src/tmdb.ts index 599ef1a..eb386a3 100644 --- a/src/tmdb.ts +++ b/src/tmdb.ts @@ -10,6 +10,9 @@ import { ConfigurationEndpoint, DiscoverEndpoint, PeopleEndpoint, + ReviewEndpoint, + TrendingEndpoint, + FindEndpoint, } from './endpoints'; export default class TMDB { @@ -62,4 +65,16 @@ export default class TMDB { get people(): PeopleEndpoint{ return new PeopleEndpoint(this.accessToken); } + + get review(): ReviewEndpoint{ + return new ReviewEndpoint(this.accessToken); + } + + get trending(): TrendingEndpoint{ + return new TrendingEndpoint(this.accessToken); + } + + get find() : FindEndpoint{ + return new FindEndpoint(this.accessToken); + } } diff --git a/src/types/find.ts b/src/types/find.ts new file mode 100644 index 0000000..a4a3b8f --- /dev/null +++ b/src/types/find.ts @@ -0,0 +1,29 @@ +import { ParsedUrlQueryInput } from 'querystring'; +import { Episode, Media, MediaType, Movie, Person, Season, TV } from '.'; + +export type ExternalSource = + | 'imdb_id' + | 'freebase_mid' + | 'freebase_id' + | 'tvdb_id' + | 'tvrage_id' + | 'facebook_id' + | 'twitter_id' + | 'instagram_id'; + +export interface ExternalIdOptions extends ParsedUrlQueryInput { + external_source: ExternalSource; + language?: string; +} + +type MediaTagged = T & { + media_type: MediaType; +}; + +export interface FindResult { + movie_results: MediaTagged[]; + person_results: MediaTagged[]; + tv_results: MediaTagged[]; + tv_episode_results: MediaTagged[]; + tv_season_results: MediaTagged[]; +} diff --git a/src/types/index.ts b/src/types/index.ts index 0cd84cb..783be6b 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -8,6 +8,9 @@ export * from './tv-shows'; export * from './watch-providers'; export * from './people'; export * from './discover'; +export * from './review'; +export * from './trending'; +export * from './find'; export interface AuthorDetails { name: string; diff --git a/src/types/review.ts b/src/types/review.ts new file mode 100644 index 0000000..dfd92c9 --- /dev/null +++ b/src/types/review.ts @@ -0,0 +1,8 @@ +import { Review } from './'; + +export interface ReviewDetails extends Review{ + iso_639_1: string; + media_id: number; + media_title: number; + media_type: number; +} \ No newline at end of file diff --git a/src/types/trending.ts b/src/types/trending.ts new file mode 100644 index 0000000..b295ced --- /dev/null +++ b/src/types/trending.ts @@ -0,0 +1,19 @@ +import { Movie, Person, TV } from '.'; +export type MediaType = 'all' | 'movie' | 'tv' | 'person'; + +export type TimeWindow = 'day' | 'week'; + +type TrendingResult = T extends 'tv' +? TV +: T extends 'movie' +? Movie +: T extends 'person' +? Person +: TV | Movie | Person; + +export interface TrendingResults { + page: number; + results: (TrendingResult & {media_type: MediaType})[]; + total_pages: number; + total_results: number; +} \ No newline at end of file diff --git a/src/types/tv-shows.ts b/src/types/tv-shows.ts index aff729a..81b223a 100644 --- a/src/types/tv-shows.ts +++ b/src/types/tv-shows.ts @@ -100,6 +100,8 @@ export interface Episode { still_path: string vote_average: number vote_count: number + show_id: number; + runtime: number; } export interface SeasonDetails {