New release_dates endpoint for movie
This commit is contained in:
		| @@ -3,7 +3,7 @@ const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); | |||||||
| const convertTmdbToShow = require('src/tmdb/convertTmdbToShow'); | const convertTmdbToShow = require('src/tmdb/convertTmdbToShow'); | ||||||
| const convertTmdbToPerson = require('src/tmdb/convertTmdbToPerson'); | const convertTmdbToPerson = require('src/tmdb/convertTmdbToPerson'); | ||||||
|  |  | ||||||
| const { Credits } = require('src/tmdb/types'); | const { Credits, ReleaseDates} = require('src/tmdb/types'); | ||||||
| // const { tmdbInfo } = require('src/tmdb/types') | // const { tmdbInfo } = require('src/tmdb/types') | ||||||
|  |  | ||||||
| class TMDB { | class TMDB { | ||||||
| @@ -17,6 +17,7 @@ class TMDB { | |||||||
|       personSearch: 'ps', |       personSearch: 'ps', | ||||||
|       movieInfo: 'mi', |       movieInfo: 'mi', | ||||||
|       movieCredits: 'mc', |       movieCredits: 'mc', | ||||||
|  |       movieReleaseDates: 'mrd', | ||||||
|       showInfo: 'si',  |       showInfo: 'si',  | ||||||
|       personInfo: 'pi', |       personInfo: 'pi', | ||||||
|       miscNowPlayingMovies: 'npm', |       miscNowPlayingMovies: 'npm', | ||||||
| @@ -129,6 +130,25 @@ class TMDB { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   tmdbRelaseDatesError(error) { | ||||||
|  |     if (error.status === 404) { | ||||||
|  |       throw { | ||||||
|  |         status: 404, | ||||||
|  |         message: error.response.body.status_message | ||||||
|  |       } | ||||||
|  |     } else if (error.status === 401) { | ||||||
|  |       throw { | ||||||
|  |         status: 401, | ||||||
|  |         message: error.response.body.status_message | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     throw { | ||||||
|  |       status: 500, | ||||||
|  |       message: 'An unexpected error occured while fetching release dates from tmdb' | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   movieCredits(identifier) { |   movieCredits(identifier) { | ||||||
|     const query = { id: identifier } |     const query = { id: identifier } | ||||||
|     const cacheKey = `${this.cacheTags.movieCredits}:${identifier}` |     const cacheKey = `${this.cacheTags.movieCredits}:${identifier}` | ||||||
| @@ -140,6 +160,17 @@ class TMDB { | |||||||
|       .then(credits => Credits.convertFromTmdbResponse(credits)) |       .then(credits => Credits.convertFromTmdbResponse(credits)) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   movieReleaseDates(identifier) { | ||||||
|  |     const query = { id: identifier } | ||||||
|  |     const cacheKey = `${this.cacheTags.movieReleaseDates}:${identifier}` | ||||||
|  |  | ||||||
|  |     return this.cache.get(cacheKey) | ||||||
|  |       .catch(() => this.tmdb('movieReleaseDates', query)) | ||||||
|  |       .catch(tmdbError => this.tmdbRelaseDatesError(tmdbError)) | ||||||
|  |       .then(releaseDates => this.cache.set(cacheKey, releaseDates, 1)) | ||||||
|  |       .then(releaseDates => ReleaseDates.convertFromTmdbResponse(releaseDates)) | ||||||
|  |   } | ||||||
|  |   | ||||||
|   /** |   /** | ||||||
|    * Retrieve a specific show by id from TMDB. |    * Retrieve a specific show by id from TMDB. | ||||||
|    * @param {Number} identifier of the show you want to retrieve |    * @param {Number} identifier of the show you want to retrieve | ||||||
|   | |||||||
| @@ -2,5 +2,6 @@ import Movie from './types/movie.js' | |||||||
| import Show from './types/show.js' | import Show from './types/show.js' | ||||||
| import Person from './types/person.js' | import Person from './types/person.js' | ||||||
| import Credits from './types/credits.js' | import Credits from './types/credits.js' | ||||||
|  | import ReleaseDates from './types/releaseDates.js' | ||||||
|  |  | ||||||
| module.exports = { Movie, Show, Person, Credits } | module.exports = { Movie, Show, Person, ReleaseDates } | ||||||
|   | |||||||
							
								
								
									
										62
									
								
								seasoned_api/src/tmdb/types/releaseDates.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								seasoned_api/src/tmdb/types/releaseDates.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | |||||||
|  | class ReleaseDate { | ||||||
|  |   constructor(certification, language, releaseDate, type, note) { | ||||||
|  |     this.certification = certification; | ||||||
|  |     this.language = language; | ||||||
|  |     this.releaseDate = releaseDate; | ||||||
|  |     this.type = this.releaseTypeLookup(type); | ||||||
|  |     this.note = note; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   releaseTypeLookup(releaseTypeKey) { | ||||||
|  |     const releaseTypeEnum = { | ||||||
|  |       1: 'Premier', | ||||||
|  |       2: 'Limited theatrical', | ||||||
|  |       3: 'Theatrical', | ||||||
|  |       4: 'Digital', | ||||||
|  |       5: 'Physical', | ||||||
|  |       6: 'TV' | ||||||
|  |     } | ||||||
|  |     if (releaseTypeKey <= Object.keys(releaseTypeEnum).length) { | ||||||
|  |       return releaseTypeEnum[releaseTypeKey] | ||||||
|  |     } else { | ||||||
|  |       // TODO log | Release type not defined, does this need updating? | ||||||
|  |       return null | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class Release {  | ||||||
|  |   constructor(country, releaseDates) { | ||||||
|  |     this.country = country; | ||||||
|  |     this.releaseDates = releaseDates; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class ReleaseDates {  | ||||||
|  |   constructor(id, releases) { | ||||||
|  |     this.id = id; | ||||||
|  |     this.releases = releases; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static convertFromTmdbResponse(response) { | ||||||
|  |     console.log('this is relese dates response') | ||||||
|  |     const { id, results } = response; | ||||||
|  |  | ||||||
|  |     const releases = results.map(countryRelease =>  | ||||||
|  |       new Release( | ||||||
|  |         countryRelease.iso_3166_1,  | ||||||
|  |         countryRelease.release_dates.map(rd => new ReleaseDate(rd.certification, rd.iso_639_1, rd.release_date, rd.type, rd.note)) | ||||||
|  |       )) | ||||||
|  |  | ||||||
|  |     return new ReleaseDates(id, releases) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   createJsonResponse() { | ||||||
|  |     return JSON.stringify({ | ||||||
|  |       id: this.id, | ||||||
|  |       release_dates: this.releases | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | module.exports = ReleaseDates; | ||||||
| @@ -79,9 +79,13 @@ router.get('/v2/show/now_playing', listController.nowPlayingShows); | |||||||
| router.get('/v2/show/popular', listController.popularShows); | router.get('/v2/show/popular', listController.popularShows); | ||||||
| router.get('/v2/show/top_rated', listController.topRatedShows); | router.get('/v2/show/top_rated', listController.topRatedShows); | ||||||
|  |  | ||||||
|  | router.get('/v2/movie/:id/credits', require('./controllers/movie/credits.js')); | ||||||
|  | router.get('/v2/movie/:id/release_dates', require('./controllers/movie/releaseDates.js')); | ||||||
|  |  | ||||||
| router.get('/v2/movie/:id', require('./controllers/info/movieInfo.js')); | router.get('/v2/movie/:id', require('./controllers/info/movieInfo.js')); | ||||||
| router.get('/v2/show/:id', require('./controllers/info/showInfo.js')); | router.get('/v2/show/:id', require('./controllers/info/showInfo.js')); | ||||||
| router.get('/v2/person/:id', require('./controllers/info/personInfo.js')); | router.get('/v2/person/:id', require('./controllers/info/personInfo.js')); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Plex |  * Plex | ||||||
|  */ |  */ | ||||||
|   | |||||||
							
								
								
									
										26
									
								
								seasoned_api/src/webserver/controllers/movie/releaseDates.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								seasoned_api/src/webserver/controllers/movie/releaseDates.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')); | ||||||
|  |  | ||||||
|  | const movieReleaseDatesController = (req, res) => { | ||||||
|  |   const movieId = req.params.id; | ||||||
|  |  | ||||||
|  |   tmdb.movieReleaseDates(movieId) | ||||||
|  |     .then(releaseDates => res.send(releaseDates)) | ||||||
|  |     .catch(error => { | ||||||
|  |       const { status, message } = error; | ||||||
|  |  | ||||||
|  |       if (status && message) { | ||||||
|  |         res.status(error.status).send({ success: false, error: error.message }) | ||||||
|  |       } else { | ||||||
|  |         // TODO log unhandled errors : here our at tmdbReleaseError ? | ||||||
|  |         console.log('error', error) | ||||||
|  |         res.status(500).send({ message: 'An unexpected error occured while requesting movie credits' }) | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | module.exports = movieReleaseDatesController; | ||||||
		Reference in New Issue
	
	Block a user