Api #79

Merged
KevinMidboe merged 8 commits from api into master 2018-02-07 13:22:50 +00:00
Showing only changes of commit 6fd65fdb23 - Show all commits

View File

@@ -1,172 +1,134 @@
const moviedb = require('moviedb'); const moviedb = require('moviedb');
const convertTmdbToSeasoned = require('src/tmdb/convertTmdbToSeasoned'); const convertTmdbToSeasoned = require('src/tmdb/convertTmdbToSeasoned');
var methodTypes = { 'movie': 'searchMovie', 'show': 'searchTv', 'multi': 'searchMulti', 'movieInfo': 'movieInfo',
'tvInfo': 'tvInfo', 'upcomingMovies': 'miscUpcomingMovies', 'discoverMovie': 'discoverMovie',
'discoverShow': 'discoverTv', 'popularMovies': 'miscPopularMovies', 'popularShows': 'miscPopularTvs',
'nowPlayingMovies': 'miscNowPlayingMovies', 'nowAiringShows': 'tvOnTheAir', 'movieSimilar': 'movieSimilar',
'showSimilar': 'tvSimilar' };
const TMDB_METHODS = {
const TYPE_LIST = ['upcoming', 'discover', 'popular', 'nowplaying', 'similar'] upcoming: { movie: 'miscUpcomingMovies' },
const TMDB_TYPE_LIST = { discover: { movie: 'discoverMovie', show: 'discoverTv' },
'upcomingmovie': 'miscUpcomingMovies', 'discovermovie': 'discoverMovie', popular: { movie: 'miscPopularMovies', show: 'miscPopularTvs' },
'discovershow': 'discoverTv', 'popularmovie': 'miscPopularMovies', nowplaying: { movie: 'miscNowPlayingMovies', show: 'tvOnTheAir' },
'popularshow': 'miscPopularTvs', 'nowplayingmovie': 'miscNowPlayingMovies', similar: { movie: 'movieSimilar', show: 'tvSimilar' },
'nowplayingshow': 'tvOnTheAir', 'similarmovie': 'movieSimilar', 'similarshow': 'tvSimilar', search: { movie: 'searchMovie', show: 'searchTv', multi: 'searchMulti' },
info: { movie: 'movieInfo', show: 'tvInfo' },
}; };
class TMDB { class TMDB {
constructor(cache, apiKey, tmdbLibrary) {
this.cache = cache
this.tmdbLibrary = tmdbLibrary || moviedb(apiKey);
this.cacheTags = {
'search': 'se',
'info': 'i',
'upcoming': 'u',
'discover': 'd',
'popular': 'p',
'nowplaying': 'n',
'similar': 'si',
}
}
/** constructor(cache, apiKey, tmdbLibrary) {
* Retrive list of of items from TMDB matching the query and/or type given. this.cache = cache;
* @param {queryText, page, type} the page number to specify in the request for discover, this.tmdbLibrary = tmdbLibrary || moviedb(apiKey);
* @returns {Promise} dict with query results, current page and total_pages this.cacheTags = {
*/ search: 'se',
search(text, page = 1, type = 'multi') { info: 'i',
const query = { 'query': text, 'page': page }; upcoming: 'u',
const cacheKey = `${this.cacheTags.search}:${page}:${type}:${text}`; discover: 'd',
return Promise.resolve() popular: 'p',
.then(() => this.cache.get(cacheKey)) nowplaying: 'n',
.catch(() => this.tmdb(methodTypes[type], query)) similar: 'si',
.catch(() => { throw new Error('Could not search for movies/shows at tmdb.'); }) };
.then((response) => this.cache.set(cacheKey, response)) }
.then((response) => this.mapResults(response))
.catch((error) => { throw new Error(error); })
.then(([mappedResults, pagenumber, totalpages, total_results]) => {
return {'results': mappedResults, 'page': pagenumber, 'total_results': total_results, 'total_pages': totalpages}
})
}
/**
* Retrieve a specific movie by id from TMDB.
* @param {Number} identifier of the movie you want to retrieve
* @returns {Promise} succeeds if movie was found
*/
lookup(identifier, type = 'movie') {
const query = { id: identifier };
const cacheKey = `${this.cacheTags.info}:${type}:${identifier}`;
return Promise.resolve()
.then(() => this.cache.get(cacheKey))
.catch(() => this.tmdb(this.tmdbMethod('info', type), query))
.catch(() => { throw new Error('Could not find a movie with that id.'); })
.then(response => this.cache.set(cacheKey, response))
.then((response) => {
try {
return convertTmdbToSeasoned(response, type);
} catch (parseError) {
console.error(parseError);
throw new Error('Could not parse movie.');
}
});
}
/**
* Retrive list of of items from TMDB matching the query and/or type given.
* @param {queryText, page, type} the page number to specify in the request for discover,
* @returns {Promise} dict with query results, current page and total_pages
*/
search(text, page = 1, type = 'multi') {
const query = { query: text, page };
const cacheKey = `${this.cacheTags.search}:${page}:${type}:${text}`;
return Promise.resolve()
.then(() => this.cache.get(cacheKey))
.catch(() => this.tmdb(this.tmdbMethod('search', type), query))
.catch(() => { throw new Error('Could not search for movies/shows at tmdb.'); })
.then(response => this.cache.set(cacheKey, response))
.then(response => this.mapResults(response, type))
.catch((error) => { throw new Error(error); })
.then(([mappedResults, pagenumber, totalpages, total_results]) => ({
results: mappedResults, page: pagenumber, total_results, total_pages: totalpages,
}));
}
/** /**
* Retrieve a specific movie by id from TMDB. * Fetches a given list from tmdb.
* @param {Number} identifier of the movie you want to retrieve * @param {listName} List we want to fetch.
* @returns {Promise} succeeds if movie was found * @param {type} The to specify in the request for discover (default 'movie').
*/ * @param {id} When finding similar a id can be added to query
lookup(identifier, queryType = 'movie') { * @param {page} Page number we want to fetch.
var type, tmdbType; * @returns {Promise} dict with query results, current page and total_pages
if (queryType === 'movie' || queryType === 'movieInfo') { type = 'movie', tmdbType = 'movieInfo' } */
else if (queryType === 'show' || queryType === 'tvInfo') { type = 'show', tmdbType = 'tvInfo' } listSearch(listName, type = 'movie', id, page = '1') {
else { const params = { id, page };
return Promise.resolve() const cacheKey = `${this.cacheTags[listName]}:${type}:${id}:${page}`;
.then(() => { return Promise.resolve()
throw new Error('Invalid type declaration.') .then(() => this.cache.get(cacheKey))
}) .catch(() => this.tmdb(this.tmdbMethod(listName, type), params))
} .then(response => this.cache.set(cacheKey, response))
const query = { id: identifier }; .then(response => this.mapResults(response, type))
const cacheKey = `${this.cacheTags.lookup}:${type}:${identifier}`; .catch((error) => { throw new Error(error); })
return Promise.resolve() .then(([mappedResults, pagenumber, totalpages, total_results]) => ({
.then(() => this.cache.get(cacheKey)) results: mappedResults, page: pagenumber, total_pages: totalpages, total_results,
.catch(() => this.tmdb(tmdbType, query)) }));
.catch(() => { throw new Error('Could not find a movie with that id.'); }) }
.then((response) => this.cache.set(cacheKey, response))
.then((response) => {
try {
return convertTmdbToSeasoned(response, type);
} catch (parseError) {
throw new Error('Could not parse movie.');
}
});
}
/** static tmdbMethod(apiMethod, type) {
* Verifies that a list_name corresponds to a tmdb list and calls the tmdb const method = TMDB_METHODS[apiMethod][type];
* api with list name and paramters. if (method !== undefined) return method;
* @param {list_name} The name of a list we want to search for. throw new Error('Could not find tmdb api method.');
* @param {media_type} The type declared in listSearch. }
* @param {params} Params is page and id given as parameters in listSearch.
* @returns {Promise} dict with raw tmdb results.
*/
searchTmdbList(list_name, media_type, params) {
return new Promise((resolve, reject) => {
if (TYPE_LIST.includes(list_name) && ['movie', 'show'].includes(media_type)) {
const searchQuery = list_name.toLowerCase() + media_type.toLowerCase();
const tmdbList = TMDB_TYPE_LIST[searchQuery]
return Promise.resolve() /**
.then(() => this.tmdb(tmdbList, params)) * Maps our response from tmdb api to a movie/show object.
.then((response) => { * @param {response} JSON response from tmdb.
resolve(response) * @param {type} The type declared in listSearch.
}) * @returns {Promise} dict with tmdb results, mapped as movie/show objects.
.catch(() => { */
return reject('Error while fetching from tmdb list.') static mapResults(response, type) {
}) return Promise.resolve()
} .then(() => {
return reject('Did not find tmdb list matching query.') const mappedResults = response.results.map(result => convertTmdbToSeasoned(result, type));
}) return [mappedResults, response.page, response.total_pages, response.total_results];
} })
.catch((error) => { throw new Error(error); });
}
/** tmdb(method, argument) {
* Maps our response from tmdb api to a movie/show object. return new Promise((resolve, reject) => {
* @param {response} JSON response from tmdb. const callback = (error, reponse) => {
* @param {type} The type declared in listSearch. if (error) {
* @returns {Promise} dict with tmdb results, mapped as movie/show objects. return reject(error);
*/ }
mapResults(response, type) { return resolve(reponse);
return Promise.resolve() };
.then(() => {
const mappedResults = response.results.map((result) => {
return convertTmdbToSeasoned(result, type)
})
return [mappedResults, response.page, response.total_pages, response.total_results]
})
.catch((error) => { throw new Error(error)})
if (!argument) {
} this.tmdbLibrary[method](callback);
} else {
/** this.tmdbLibrary[method](argument, callback);
* Fetches a given list from tmdb. }
* @param {list_name} List we want to fetch. });
* @param {media_type} The to specify in the request for discover (default 'movie'). }
* @param {id} When finding similar a id can be added to query
* @param {page} Page number we want to fetch.
* @returns {Promise} dict with query results, current page and total_pages
*/
listSearch(list_name, media_type='movie', id, page='1') {
const params = {'id': id, 'page': page}
const cacheKey = `${this.cacheTags[list_name]}:${media_type}:${id}:${page}`;
return Promise.resolve()
.then(() => this.cache.get(cacheKey))
.catch(() => this.searchTmdbList(list_name, media_type, params))
.then((response) => this.cache.set(cacheKey, response))
.then((response) => this.mapResults(response, media_type))
.catch((error) => { throw new Error(error); })
.then(([mappedResults, pagenumber, totalpages, total_results]) => {
return {'results': mappedResults, 'page': pagenumber, 'total_pages': totalpages, 'total_results': total_results}
})
}
tmdb(method, argument) {
return new Promise((resolve, reject) => {
const callback = (error, reponse) => {
if (error) {
return reject(error);
}
resolve(reponse);
};
if (!argument) {
this.tmdbLibrary[method](callback);
} else {
this.tmdbLibrary[method](argument, callback);
}
})
}
} }
module.exports = TMDB; module.exports = TMDB;