Created one function for searching for different tmdb lists. This replaces 4 endpoints so we have a single way of searching for lists.
This commit is contained in:
		| @@ -6,18 +6,27 @@ var methodTypes = { 'movie': 'searchMovie', 'show': 'searchTv', 'multi': 'search | ||||
| 	'nowPlayingMovies': 'miscNowPlayingMovies', 'nowAiringShows': 'tvOnTheAir', 'movieSimilar': 'movieSimilar', | ||||
| 	'showSimilar': 'tvSimilar' }; | ||||
|  | ||||
|  | ||||
| const TYPE_LIST = ['upcoming', 'discover', 'popular', 'nowplaying', 'similar'] | ||||
| const TMDB_TYPE_LIST = { | ||||
| 	'upcomingmovie': 'miscUpcomingMovies', 'discovermovie': 'discoverMovie',  | ||||
| 	'discovershow': 'discoverTv', 'popularmovie': 'miscPopularMovies', | ||||
| 	'popularshow': 'miscPopularTvs', 'nowplayingmovie': 'miscNowPlayingMovies',  | ||||
| 	'nowplayingshow': 'tvOnTheAir', 'similarmovie': 'movieSimilar', 'similarshow': 'tvSimilar', | ||||
| }; | ||||
|  | ||||
| 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', | ||||
| 			'upcoming': 'u', | ||||
| 			'similar': 'si', | ||||
| 			'lookup': 'l' | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -31,7 +40,7 @@ class TMDB { | ||||
| 		const cacheKey = `${this.cacheTags.search}:${page}:${type}:${text}`; | ||||
| 		return Promise.resolve() | ||||
| 		 .then(() => this.cache.get(cacheKey)) | ||||
| 		 .catch(() => this.tmdb(type, query)) | ||||
| 		 .catch(() => this.tmdb(methodTypes[type], query)) | ||||
| 		 .catch(() => { throw new Error('Could not search for movies/shows at tmdb.'); }) | ||||
| 		 .then((response) => this.cache.set(cacheKey, response)) | ||||
| 		 .then((response) => { | ||||
| @@ -60,218 +69,6 @@ class TMDB { | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	* Retrive list of discover section of movies from TMDB. | ||||
| 	* @param {Page, type} the page number to specify in the request for discover,  | ||||
| 	* and type for movie or show | ||||
| 	* @returns {Promise} dict with discover results, current page and total_pages | ||||
| 	*/  | ||||
| 	discover(page, type='movie') { | ||||
| 		// Sets the tmdb function type to the corresponding type from query | ||||
| 		var tmdbType; | ||||
| 		if (type === 'movie') { | ||||
| 			tmdbType = 'discoverMovie'; | ||||
| 		} else if (type === 'show') { | ||||
| 			tmdbType = 'discoverShow'; | ||||
| 		} else { | ||||
| 			// Throw error if invalid type from query | ||||
| 			return Promise.resolve() | ||||
| 			.then(() => { | ||||
| 				throw new Error('Invalid type declaration.') | ||||
| 			}) | ||||
| 		} | ||||
|  | ||||
| 		// Build a query for tmdb with pagenumber | ||||
| 		const query = { 'page': page } | ||||
| 		const cacheKey = `${this.cacheTags.discover}:${page}:${type}`; | ||||
| 		return Promise.resolve() | ||||
| 		 	.then(() => this.cache.get(cacheKey)) | ||||
| 			.catch(() => this.tmdb(tmdbType, query)) | ||||
| 			.catch(() => { throw new Error('Could not fetch discover.'); }) | ||||
| 			.then((response) => this.cache.set(cacheKey, response)) | ||||
| 			.then((response) => { | ||||
| 				try { | ||||
| 					// Return a object that has the results and a variable for page, total_pages  | ||||
| 					// and seasonedResponse | ||||
| 					var seasonedResponse = response.results.map((result) => {  | ||||
| 						return convertTmdbToSeasoned(result, type); } | ||||
| 					); | ||||
| 					return { 'results': seasonedResponse, | ||||
| 						'page': response.page, 'total_pages': response.total_pages }; | ||||
| 				} catch (error) { | ||||
| 					console.log(error) | ||||
| 					throw new Error('Error while parsing discover list.') | ||||
| 				} | ||||
| 			}); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	* Retrive list of popular section of movies or shows from TMDB. | ||||
| 	* @param {Page, type} the page number to specify in the request for popular,  | ||||
| 	* and type for movie or show | ||||
| 	* @returns {Promise} dict with popular results, current page and total_pages | ||||
| 	*/  | ||||
| 	// TODO add filter for language | ||||
| 	popular(page, type='movie') { | ||||
| 		// Sets the tmdb function type to the corresponding type from query | ||||
| 		var tmdbType; | ||||
| 		if (type === 'movie') { | ||||
| 			tmdbType = 'popularMovies'; | ||||
| 		} else if (type === 'show') { | ||||
| 			tmdbType = 'popularShows'; | ||||
| 		} else { | ||||
| 			// Throw error if invalid type from query | ||||
| 			return Promise.resolve() | ||||
| 			.then(() => { | ||||
| 				throw new Error('Invalid type declaration.') | ||||
| 			}) | ||||
| 		} | ||||
|  | ||||
| 		// Build a query for tmdb with pagenumber | ||||
| 		const query = { 'page': page } | ||||
| 		const cacheKey = `${this.cacheTags.popular}:${page}:${type}`; | ||||
| 		return Promise.resolve() | ||||
| 		 	.then(() => this.cache.get(cacheKey)) | ||||
| 			.catch(() => this.tmdb(tmdbType, query)) | ||||
| 			.catch(() => { throw new Error('Could not fetch popular.'); }) | ||||
| 			.then((response) => this.cache.set(cacheKey, response)) | ||||
| 			.then((response) => { | ||||
| 				try { | ||||
| 					var seasonedResponse = response.results.map((result) => {  | ||||
| 						return convertTmdbToSeasoned(result, type); } | ||||
| 					); | ||||
| 					// Return a object that has the results and a variable for page, total_pages  | ||||
| 					// and seasonedResponse | ||||
| 					return { 'results': seasonedResponse, | ||||
| 						'page': response.page, 'total_pages': response.total_pages }; | ||||
| 				} catch (error) { | ||||
| 					console.log(error) | ||||
| 					throw new Error('Error while parsing discover list.') | ||||
| 				} | ||||
| 			}); | ||||
| 	} | ||||
|  | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	* Retrive list of now playing/airing section of movies or shows from TMDB. | ||||
| 	* @param {Page, type} the page number to specify in the request for now playing/airing,  | ||||
| 	* and type for movie or show | ||||
| 	* @returns {Promise} dict with nowplaying results, current page and total_pages | ||||
| 	*/  | ||||
| 	// TODO add filter for language | ||||
| 	nowplaying(page, type='movie') { | ||||
| 		// Sets the tmdb function type to the corresponding type from query | ||||
| 		var tmdbType; | ||||
| 		if (type === 'movie') { | ||||
| 			tmdbType = 'nowPlayingMovies'; | ||||
| 		} else if (type === 'show') { | ||||
| 			tmdbType = 'nowAiringShows'; | ||||
| 		} else { | ||||
| 			// Throw error if invalid type from query | ||||
| 			return Promise.resolve() | ||||
| 			.then(() => { | ||||
| 				throw new Error('Invalid type declaration.') | ||||
| 			}) | ||||
| 		} | ||||
|  | ||||
| 		// Build a query for tmdb with pagenumber | ||||
| 		const query = { 'page': page } | ||||
| 		const cacheKey = `${this.cacheTags.nowplaying}:${page}:${type}`; | ||||
| 		return Promise.resolve() | ||||
| 		 	.then(() => this.cache.get(cacheKey)) | ||||
| 			.catch(() => this.tmdb(tmdbType, query)) | ||||
| 			.catch(() => { throw new Error('Could not fetch popular.'); }) | ||||
| 			.then((response) => this.cache.set(cacheKey, response)) | ||||
| 			.then((response) => { | ||||
| 				try { | ||||
| 					var seasonedResponse = response.results.map((result) => {  | ||||
| 						return convertTmdbToSeasoned(result, type); } | ||||
| 					); | ||||
| 					// Return a object that has the results and a variable for page, total_pages  | ||||
| 					// and seasonedResponse | ||||
| 					return { 'results': seasonedResponse, | ||||
| 						'page': response.page, 'total_pages': response.total_pages }; | ||||
| 				} catch (error) { | ||||
| 					console.log(error) | ||||
| 					throw new Error('Error while parsing discover list.') | ||||
| 				} | ||||
| 			}); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Retrive list of upcoming movies from TMDB. | ||||
| 	* @param {Page} the page number to specify in the request for upcoming movies | ||||
| 	* @returns {Promise} dict with upcoming results, current page and total_pages | ||||
| 	*/  | ||||
| 	// TODO add filter for language | ||||
| 	upcoming(page) { | ||||
| 		const query = { 'page': page } | ||||
| 		const cacheKey = `${this.cacheTags.upcoming}:${page}`; | ||||
| 		return Promise.resolve() | ||||
| 		 	.then(() => this.cache.get(cacheKey)) | ||||
| 			.catch(() => this.tmdb('upcomingMovies', query)) | ||||
| 			.catch(() => { throw new Error('Could not fetch upcoming movies.'); }) | ||||
| 			.then((response) => this.cache.set(cacheKey, response)) | ||||
| 			.then((response) => { | ||||
| 				try { | ||||
| 					var seasonedResponse = response.results.map((result) => {  | ||||
| 						return convertTmdbToSeasoned(result, 'movie'); } | ||||
| 					); | ||||
| 					// Return a object that has the results and a variable for page, total_pages  | ||||
| 					// and seasonedResponse | ||||
| 					return { 'results': seasonedResponse, | ||||
| 						'page': response.page, 'total_pages': response.total_pages }; | ||||
| 				} catch (parseError) { | ||||
| 					throw new Error('Error while parsing upcoming movies list.') | ||||
| 				} | ||||
| 			}); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	* Retrive list of upcmoing movies from TMDB. | ||||
| 	* @param {Page} the page number to specify in the request for upcoming movies | ||||
| 	* @returns {Promise} dict with similar results, current page and total_pages | ||||
| 	*/  | ||||
| 	// TODO add filter for language | ||||
| 	similar(identifier, type) { | ||||
| 		var tmdbType; | ||||
| 		if (type === 'movie') { | ||||
| 			tmdbType = 'movieSimilar'; | ||||
| 		} else if (type === 'show') { | ||||
| 			tmdbType = 'showSimilar'; | ||||
| 		} else { | ||||
| 			// Throw error if invalid type from query | ||||
| 			return Promise.resolve() | ||||
| 			.then(() => { | ||||
| 				throw new Error('Invalid type declaration.') | ||||
| 			}) | ||||
| 		} | ||||
|  | ||||
| 		const query = { id: identifier } | ||||
| 		const cacheKey = `${this.cacheTags.similar}:${type}:${identifier}`; | ||||
| 		return Promise.resolve() | ||||
| 		 	.then(() => this.cache.get(cacheKey)) | ||||
| 			.catch(() => this.tmdb(tmdbType, query)) | ||||
| 			.catch(() => { throw new Error('Could not fetch upcoming movies.'); }) | ||||
| 			.then((response) => this.cache.set(cacheKey, response)) | ||||
| 			.then((response) => { | ||||
| 				try { | ||||
| 					var seasonedResponse = response.results.map((result) => {  | ||||
| 						return convertTmdbToSeasoned(result, type); } | ||||
| 					); | ||||
| 					// Return a object that has the results and a variable for page, total_pages  | ||||
| 					// and seasonedResponse | ||||
| 					return { 'results': seasonedResponse, | ||||
| 						'page': response.page, 'total_pages': response.total_pages }; | ||||
| 				} catch (parseError) { | ||||
| 					throw new Error('Error while parsing silimar media list.') | ||||
| 				} | ||||
| 			}); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	* Retrieve a specific movie by id from TMDB. | ||||
| @@ -306,7 +103,54 @@ class TMDB { | ||||
| 			}); | ||||
| 	} | ||||
|  | ||||
| 	// TODO ADD CACHE LOOKUP | ||||
|  | ||||
| 	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)) | ||||
| 				.then((response) => { | ||||
| 					resolve(response) | ||||
| 				}) | ||||
| 				.catch(() => { | ||||
| 					return reject('Error while fetching from tmdb list.') | ||||
| 				}) | ||||
| 			} | ||||
| 			return reject('Did not find tmdb list matching query.') | ||||
| 		}) | ||||
| 	} | ||||
|  | ||||
| 	mapResults(response, type) { | ||||
| 		return Promise.resolve() | ||||
| 		.then(() => { | ||||
| 			const mappedResults = response.results.map((result) => { | ||||
| 				return convertTmdbToSeasoned(result, type) | ||||
| 			}) | ||||
|  | ||||
| 			return [mappedResults, response.page, response.total_pages] | ||||
| 		}) | ||||
| 		.catch((error) => { throw new Error(error)}) | ||||
|  | ||||
| 		 | ||||
| 	} | ||||
|  | ||||
| 	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]) => { | ||||
| 				return {'results': mappedResults, 'page': pagenumber, 'total_pages': totalpages} | ||||
| 			}) | ||||
| 	} | ||||
|  | ||||
| 	tmdb(method, argument) { | ||||
| 		return new Promise((resolve, reject) => { | ||||
| 			const callback = (error, reponse) => { | ||||
| @@ -317,10 +161,9 @@ class TMDB { | ||||
| 			}; | ||||
|  | ||||
| 			if (!argument) { | ||||
| 				this.tmdbLibrary[methodTypes[method]](callback); | ||||
| 				// this.tmdbLibrary['miscUpcomingMovies'] | ||||
| 				this.tmdbLibrary[method](callback); | ||||
| 			} else { | ||||
| 				this.tmdbLibrary[methodTypes[method]](argument, callback); | ||||
| 				this.tmdbLibrary[method](argument, callback); | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -81,12 +81,7 @@ router.post('/v1/pirate/add', mustBeAuthenticated, require('./controllers/pirate | ||||
|  * TMDB | ||||
|  */ | ||||
| router.get('/v1/tmdb/search', require('./controllers/tmdb/searchMedia.js')); | ||||
| router.get('/v1/tmdb/discover', require('./controllers/tmdb/discoverMedia.js')); | ||||
| router.get('/v1/tmdb/popular', require('./controllers/tmdb/popularMedia.js')); | ||||
| router.get('/v1/tmdb/nowplaying', require('./controllers/tmdb/nowPlayingMedia.js')); | ||||
| router.get('/v1/tmdb/upcoming', require('./controllers/tmdb/getUpcoming.js')); | ||||
|  | ||||
| router.get('/v1/tmdb/similar/:mediaId', require('./controllers/tmdb/searchSimilar.js')); | ||||
| router.get('/v1/tmdb/list/:listname', require('./controllers/tmdb/listSearch.js')); | ||||
| router.get('/v1/tmdb/:mediaId', require('./controllers/tmdb/readMedia.js')); | ||||
|  | ||||
| /** | ||||
|   | ||||
							
								
								
									
										26
									
								
								seasoned_api/src/webserver/controllers/tmdb/listSearch.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								seasoned_api/src/webserver/controllers/tmdb/listSearch.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| const configuration = require('src/config/configuration').getInstance(); | ||||
| const Cache = require('src/tmdb/cache'); | ||||
| const TMDB = require('src/tmdb/tmdb'); | ||||
| const cache = new Cache(); | ||||
| const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey')); | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Controller: Retrieve nowplaying movies / now airing shows | ||||
|  * @param {Request} req http request variable | ||||
|  * @param {Response} res | ||||
|  * @returns {Callback} | ||||
|  */ | ||||
| function listSearchController(req, res) { | ||||
|   const listname = req.params.listname; | ||||
|   const { type, id, page } = req.query; | ||||
|   console.log(listname, type, id, page) | ||||
|   tmdb.listSearch(listname, type, id, page) | ||||
|   .then((results) => { | ||||
|     res.send(results); | ||||
|   }).catch((error) => { | ||||
|     res.status(404).send({ success: false, error: error.message }); | ||||
|   }); | ||||
| } | ||||
|  | ||||
| module.exports = listSearchController; | ||||
		Reference in New Issue
	
	Block a user