import fetch from 'cross-fetch'; import * as YTS from './types/types'; /** * TODO: Implement proxy? */ export const config: YTS.ConfigType = { baseUrl: 'https://yts.mx/api/v2/', format: 'json', paths: { search: '/list_movies', details: '/movie_details', suggestions: '/movie_suggestions', comments: '/movie_comments', reviews: '/movie_reviews', parentals: '/movie_parental_guides', upcomming: '/list_upcoming', } } /** * TypeScript compiler complains about strings only * This helper converts all params to strings * * @param params * @returns URLSearchParams */ function searchParams(params: Record) { Object.keys(params).forEach(param => params[param] = params[param].toString()) return new URLSearchParams(params); } /** * Send a request to YTS API * * @param path - path to api endpoint * @param params - https://yts.mx/api * @param format - json|jsonp|xml * @returns */ async function doFetch(path: string, params?: URLSearchParams, format = config.format) { try { return await fetch(`${config.baseUrl}/${path}?${params}`.replace('///', '/')).then(async response => { if ( format === 'xml' ) { return await response.text(); } return await response.json(); }); } catch(e) { if ( e instanceof Error ) { throw new YtsApiException(e.message) } throw new YtsApiException('Could not fullfill request'); } } /** * Used to list and search through out all the available movies. Can sort, filter, search and order the results * * @param params * @param format * @returns */ export async function search(params?: YTS.ListMoviesParams, format?: YTS.ConfigType['format']): Promise { return await doFetch(`${config.paths.search}.${format || config.format}`, params ? searchParams(params) : undefined, format); } /** * Returns the information about a specific movie * * @param params * @param format * @returns */ export async function details(params: YTS.MovieDetailsParams, format?: YTS.ConfigType['format']): Promise { if(typeof params.movie_id === 'string' && params.movie_id.match(/tt/)) { return await doFetch(`${config.paths.details}.${format || config.format}`, searchParams(Object.assign({ imdb_id: params.movie_id }, params)), format); } return await doFetch(`${config.paths.details}.${format || config.format}`, searchParams(params), format); } /** * Returns 4 related movies as suggestions for the user * * @param params * @param format * @returns */ export async function suggestions(params: YTS.MovieSuggestions, format?: YTS.ConfigType['format']): Promise { return await doFetch(`${config.paths.suggestions}.${format || config.format}`, searchParams(params), format); } /** * Returns all the comments for the specified movie * * ! NOTE: The API route is broken, this function is non functional for the time being * ! Mabye in the future this will be working again. This is a YTS problem and not a package problem * ! As soon as these routings are working as intended I will remove the @deprecated marker * @deprecated This method is not working, API route is not working on YTS side * @param params * @param format */ export async function comments(params: YTS.MovieComments, format?: YTS.ConfigType['format']) { return await doFetch(`${config.paths.comments}.${format || config.format}`, searchParams(params), format); } /** * Returns all the IMDb movie reviews for the specified movie * * ! NOTE: The API route is broken, this function is non functional for the time being * ! Mabye in the future this will be working again. This is a YTS problem and not a package problem * ! As soon as these routings are working as intended I will remove the @deprecated marker * @deprecated This method is not working, API route is not working on YTS side * @param params * @param format */ export async function reviews(params: YTS.MovieReviews, format?: YTS.ConfigType['format']) { return await doFetch(`${config.paths.reviews}.${format || config.format}`, searchParams(params), format); } /** * Returns all the parental guide ratings for the specified movie * * ! Apparently this is not yet implemented inside the YTS API * * @param params * @param format * @returns */ export async function parentals(params: YTS.MovieParentalGuides, format?: YTS.ConfigType['format']) { return await doFetch(`${config.paths.parentals}.${format || config.format}`, searchParams(params), format); } /** * Returns the 4 latest upcoming movies * * ! NOTE: The API route is broken, this function is non functional for the time being * ! Mabye in the future this will be working again. This is a YTS problem and not a package problem * ! As soon as these routings are working as intended I will remove the @deprecated marker * @deprecated This method is not working, API route is not working on YTS side * @param format * @returns */ export async function upcomming(format?: YTS.ConfigType['format']) { return await doFetch(`${config.paths.upcomming}.${format || config.format}`, undefined, format); } class YtsApiException extends Error {}