Spaces:
Paused
Paused
File size: 5,365 Bytes
95f4e64 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
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<string, any>) {
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<YTS.SearchResponse> {
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<YTS.DetailsResponse> {
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<YTS.SuggestionsResponse> {
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 {} |