UNPKG

better-trakt

Version:

A Trakt.tv client with native Typescript support and quality of life features

415 lines (372 loc) 11.6 kB
import { ApiConfig, ApiNamespace } from '../client'; import { getMediaSummary_Full, getMediaPeople, getTrendingMedia, getPopularMedia, getRecommendedMedia, getPlayedMedia, getWatchedMedia, getCollectedMedia, getAnticipatedMedia, getBoxOfficeMedia, getUpdatesMedia, getUpdatedIDsMedia, getAliasesMedia, getMediaTranslations, getMediaComments, getListsWithMedia, getMediaRating, getRelatedMedia, getMediaStats, getWatchingMedia, } from '../media'; import { MovieSummary_Full, MoviePeople, TrendingMovie, TraktApiContent, RecommendedPeriod, RecommendedMovie, Played_Watched_CollectedMovie, AnticipatedMovie, BoxOfficeMovie, UpdatesMovie, UpdatedStartDate, UpdatedIDs, Release, ReleasesCountry, Alias, MovieTranslation, CommentSortByMedia, Comment, ListQueryByType, MediaRating, List, MovieStats, UserProfile, } from '../trakt'; import { ApiResponse, checkRequiredArg, Pagination, Filters, fetch } from '../utils'; /** * Movies api namespace */ export class Movies implements ApiNamespace { config: ApiConfig; constructor(config: ApiConfig) { this.config = { apiUrl: `${config.apiUrl}/movies`, client: config.client, }; } /** * Returns a single movie's details. * @param movieId movie id * @returns */ summary({ movieId }: { movieId: string }): Promise<ApiResponse<MovieSummary_Full>> { checkRequiredArg(movieId, 'movieId', 'string'); return getMediaSummary_Full<MovieSummary_Full>(this.config, movieId); } /** * Returns all cast and crew for a movie. * @param movieId movie id * @returns */ people({ movieId }: { movieId: string }): Promise<ApiResponse<MoviePeople>> { checkRequiredArg(movieId, 'movieId', 'string'); return getMediaPeople<MoviePeople>(this.config, movieId); } /** * Returns all movies being watched right now. * @param pagination * @returns */ trending({ pagination, filters, }: { pagination: Pagination; filters?: Filters; }): Promise<ApiResponse<TrendingMovie[]>> { checkRequiredArg(pagination, 'pagination', 'object'); return getTrendingMedia<TrendingMovie[]>(this.config, 'movies', { pagination, filters }); } /** * Returns the most popular movies. * @param pagination * @returns */ popular({ pagination, filters, }: { pagination: Pagination; filters?: Filters; }): Promise<ApiResponse<TraktApiContent[]>> { checkRequiredArg(pagination, 'pagination', 'object'); return getPopularMedia(this.config, 'movies', { pagination, filters }); } /** * Returns the most recommended movies in the specified time period, defaulting to weekly. All stats are relative to the specific time period. * @param param0 * @returns */ recommended({ pagination, filters, period, }: { pagination: Pagination; filters?: Filters; period?: RecommendedPeriod; }): Promise<ApiResponse<RecommendedMovie[]>> { checkRequiredArg(pagination, 'pagination', 'object'); return getRecommendedMedia<RecommendedMovie[]>(this.config, 'movies', { pagination, filters, period }); } /** * Returns the most played (a single user can watch multiple times) movies in the specified time period, defaulting to weekly. All stats are relative to the specific time period. * @param param0 * @returns */ played({ pagination, filters, period, }: { pagination: Pagination; filters?: Filters; period?: RecommendedPeriod; }): Promise<ApiResponse<Played_Watched_CollectedMovie[]>> { checkRequiredArg(pagination, 'pagination', 'object'); return getPlayedMedia<Played_Watched_CollectedMovie[]>(this.config, 'movies', { pagination, filters, period }); } /** * Returns the most collected (unique users) shows in the specified time period, defaulting to weekly. All stats are relative to the specific time period. * @param param0 * @returns */ watched({ pagination, filters, period, }: { pagination: Pagination; filters?: Filters; period?: RecommendedPeriod; }): Promise<ApiResponse<Played_Watched_CollectedMovie[]>> { checkRequiredArg(pagination, 'pagination', 'object'); return getWatchedMedia<Played_Watched_CollectedMovie[]>(this.config, 'movies', { pagination, filters, period }); } /** * Returns the most collected (unique users) movies in the specified time period, defaulting to weekly. All stats are relative to the specific time period. * @param param0 * @returns */ collected({ pagination, filters, period, }: { pagination: Pagination; filters?: Filters; period?: RecommendedPeriod; }): Promise<ApiResponse<Played_Watched_CollectedMovie[]>> { checkRequiredArg(pagination, 'pagination', 'object'); return getCollectedMedia<Played_Watched_CollectedMovie[]>(this.config, 'movies', { pagination, filters, period }); } /** * Returns the most anticipated movies based on the number of lists a movie appears on. * @param param0 * @returns */ anticipated({ pagination, filters, }: { pagination: Pagination; filters?: Filters; }): Promise<ApiResponse<AnticipatedMovie[]>> { checkRequiredArg(pagination, 'pagination', 'object'); return getAnticipatedMedia<AnticipatedMovie[]>(this.config, 'movies', { pagination, filters }); } /** * Returns the top 10 grossing movies in the U.S. box office last weekend. Updated every Monday morning. * @returns */ boxOffice(): Promise<ApiResponse<BoxOfficeMovie[]>> { return getBoxOfficeMedia<BoxOfficeMovie[]>(this.config, 'movies'); } /** * Returns all shows updated since the specified UTC date and time. * We recommended storing the X-Start-Date header you can be efficient using this method moving forward. * By default, 10 results are returned. You can send a limit to get up to 100 results per page. * * **Important!** * The start_date is only accurate to the hour, for caching purposes. * Please drop the minutes and seconds from your timestamp to help optimize our cached data. * For example, use 2021-07-17T12:00:00Z and not 2021-07-17T12:23:34Z. * * Note: The start_date can only be a maximum of 30 days in the past. * @param param0 * @returns */ updates({ pagination, startDate, }: { pagination: Pagination; startDate?: UpdatedStartDate; }): Promise<ApiResponse<UpdatesMovie[]>> { checkRequiredArg(pagination, 'pagination', 'object'); return getUpdatesMedia<UpdatesMovie[]>(this.config, 'movies', { pagination, startDate }); } /** * Returns all show Trakt IDs updated since the specified UTC date and time. * We recommended storing the X-Start-Date header you can be efficient using this method moving forward. * By default, 10 results are returned. You can send a limit to get up to 100 results per page. * * **Important!** * The start_date is only accurate to the hour, for caching purposes. * Please drop the minutes and seconds from your timestamp to help optimize our cached data. * For example, use 2021-07-17T12:00:00Z and not 2021-07-17T12:23:34Z. * * Note: The start_date can only be a maximum of 30 days in the past. * @param param0 * @returns */ updatedIDs({ pagination, startDate, }: { pagination: Pagination; startDate?: UpdatedStartDate; }): Promise<ApiResponse<UpdatedIDs>> { checkRequiredArg(pagination, 'pagination', 'object'); return getUpdatedIDsMedia(this.config, 'movies', { pagination, startDate }); } /** * Returns all title aliases for a movie. Includes country where name is different. * @param param0 * @returns */ aliases({ movieID }: { movieID: string }): Promise<ApiResponse<Alias[]>> { checkRequiredArg(movieID, 'movieID', 'string'); return getAliasesMedia(this.config, 'movies', { mediaID: movieID }); } /** * Returns all releases for a movie including country, * certification, release date, release type, and note. * The release type can be set to unknown, premiere, * limited, theatrical, digital, physical, or tv. * The note might have optional info such as the film festival * name for a premiere release or Blu-ray specs for a physical release. * We pull this info from TMDB. * @param param0 * @returns All the releases for a movie */ async releases({ movieID, country, }: { movieID: string; country?: ReleasesCountry; }): Promise<ApiResponse<Release[]>> { const url = `${this.config.apiUrl}/movies/${movieID}/releases`; const response = await fetch<Release[]>(this.config.client, url, { country }); return response; } /** * Returns all translations for a movie, including language and translated values for title, tagline and overview. * @param param0 * @returns */ async translations({ movieID, language, }: { movieID: string; language?: string; }): Promise<ApiResponse<MovieTranslation[]>> { checkRequiredArg(movieID, 'movieID', 'string'); return getMediaTranslations<MovieTranslation[]>(this.config, 'movies', movieID, language); } /** * Returns all top level comments for a movie. By default, the newest comments are returned first. * Other sorting options include oldest, most likes, most replies, highest rated, lowest rated, and most plays. * @param param0 * @returns */ async comments({ movieID, pagination, sort, }: { movieID: string; pagination: Pagination; sort?: CommentSortByMedia; }): Promise<ApiResponse<Comment[]>> { checkRequiredArg(movieID, 'movieID', 'string'); return getMediaComments(this.config, 'movies', movieID, { pagination, sort }); } /** * Returns all lists that contain this movie. By default, personal lists are returned sorted by the most popular. * @param param0 * @returns */ async lists({ movieID, pagination, sort, type, }: { movieID: string; pagination: Pagination; sort?: CommentSortByMedia; type?: ListQueryByType; }): Promise<ApiResponse<List[]>> { checkRequiredArg(movieID, 'movieID', 'string'); return getListsWithMedia(this.config, 'movies', movieID, { pagination, sort, type }); } /** * Returns rating (between 0 and 10) and distribution for a movie. * @param param0 * @returns */ async ratings({ movieID }: { movieID: string }): Promise<ApiResponse<MediaRating>> { checkRequiredArg(movieID, 'movieID', 'string'); return getMediaRating(this.config, 'movies', movieID); } /** * Returns related and similar movies. * @param param0 * @returns */ async related({ movieID, pagination, }: { movieID: string; pagination: Pagination; }): Promise<ApiResponse<TraktApiContent[]>> { checkRequiredArg(movieID, 'movieID', 'string'); return getRelatedMedia(this.config, 'movies', movieID, { pagination }); } /** * Returns lots of movie stats. * @param param0 * @returns */ async stats({ movieID }: { movieID: string }): Promise<ApiResponse<MovieStats>> { checkRequiredArg(movieID, 'movieID', 'string'); return getMediaStats<MovieStats>(this.config, 'movies', movieID); } /** * Returns all users watching this movie right now. * @param param0 * @returns */ async watching({ movieID }: { movieID: string }): Promise<ApiResponse<UserProfile[]>> { checkRequiredArg(movieID, 'movieID', 'string'); return getWatchingMedia(this.config, 'movies', movieID); } }