diff --git a/seasoned_api/src/tmdb/tmdb.js b/seasoned_api/src/tmdb/tmdb.js index 91fc81a..80ea986 100644 --- a/seasoned_api/src/tmdb/tmdb.js +++ b/seasoned_api/src/tmdb/tmdb.js @@ -3,7 +3,7 @@ const convertTmdbToMovie = require('src/tmdb/convertTmdbToMovie'); const convertTmdbToShow = require('src/tmdb/convertTmdbToShow'); 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') class TMDB { @@ -17,6 +17,7 @@ class TMDB { personSearch: 'ps', movieInfo: 'mi', movieCredits: 'mc', + movieReleaseDates: 'mrd', showInfo: 'si', personInfo: 'pi', 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) { const query = { id: identifier } const cacheKey = `${this.cacheTags.movieCredits}:${identifier}` @@ -139,6 +159,17 @@ class TMDB { .then(credits => this.cache.set(cacheKey, credits, 86400)) .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. diff --git a/seasoned_api/src/tmdb/types.js b/seasoned_api/src/tmdb/types.js index 08de9ab..9b096c4 100644 --- a/seasoned_api/src/tmdb/types.js +++ b/seasoned_api/src/tmdb/types.js @@ -2,5 +2,6 @@ import Movie from './types/movie.js' import Show from './types/show.js' import Person from './types/person.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 } diff --git a/seasoned_api/src/tmdb/types/releaseDates.js b/seasoned_api/src/tmdb/types/releaseDates.js new file mode 100644 index 0000000..3959922 --- /dev/null +++ b/seasoned_api/src/tmdb/types/releaseDates.js @@ -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; diff --git a/seasoned_api/src/webserver/app.js b/seasoned_api/src/webserver/app.js index cb84124..db48442 100644 --- a/seasoned_api/src/webserver/app.js +++ b/seasoned_api/src/webserver/app.js @@ -79,9 +79,13 @@ router.get('/v2/show/now_playing', listController.nowPlayingShows); router.get('/v2/show/popular', listController.popularShows); 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/show/:id', require('./controllers/info/showInfo.js')); router.get('/v2/person/:id', require('./controllers/info/personInfo.js')); + /** * Plex */ diff --git a/seasoned_api/src/webserver/controllers/movie/releaseDates.js b/seasoned_api/src/webserver/controllers/movie/releaseDates.js new file mode 100644 index 0000000..7234888 --- /dev/null +++ b/seasoned_api/src/webserver/controllers/movie/releaseDates.js @@ -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; \ No newline at end of file