diff --git a/client/src/components/MediaList.js b/client/src/components/MediaList.js index 8e383e8..a1bcef9 100644 --- a/client/src/components/MediaList.js +++ b/client/src/components/MediaList.js @@ -3,11 +3,8 @@ import PropTypes from 'prop-types'; import {withStyles} from '@material-ui/core/styles'; import {connect} from 'react-redux'; import styles from '../css/materialize.css.js'; -import axios from 'axios'; import MediaCard from './MediaCard'; import * as actions from '../actions'; -import {BrowserRouter, Link} from 'react-router-dom'; -import Similar from './plex/Similar'; class MediaList extends Component { componentDidMount() { diff --git a/package.json b/package.json index 8b7600b..3e9bf40 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "debug": "nodemon --exec babel-node --inspect index.js", "db:reset": "NODE_ENV=test npx sequelize db:migrate:undo:all && NODE_ENV=test npx sequelize db:migrate && npx sequelize db:migrate:undo:all && npx sequelize db:migrate", "start": "babel-node index.js", - "server": "babel-node index.js", + "server": "nodemon --exec babel-node index.js", "client": "npm run start --prefix client", "heroku-postbuild": "npm install && NPM_CONFIG_PRODUCTION=false npm install --prefix client && npm run build --prefix client" }, diff --git a/server/controllers/movieDb.controller.js b/server/controllers/movieDb.controller.js new file mode 100644 index 0000000..ab66bc8 --- /dev/null +++ b/server/controllers/movieDb.controller.js @@ -0,0 +1,9 @@ +import {Router} from 'express'; +import movieDbService from '../services/moviedb'; + +const router = Router(); + +router.get('/tv/search', movieDbService.searchTv); +router.get('/tv/similar', movieDbService.similarTv); + +export default router; diff --git a/server/controllers/tdaw.controller.js b/server/controllers/tdaw.controller.js index fa14562..30c6c0f 100644 --- a/server/controllers/tdaw.controller.js +++ b/server/controllers/tdaw.controller.js @@ -5,5 +5,6 @@ const router = Router(); router.get('/similar', tdawService.similarMedia); router.get('/most-watched', tdawService.mostWatched); +router.get('/qloo/media', tdawService.qlooMedia); export default router; diff --git a/server/index.js b/server/index.js index 9c05c27..8d4c0b8 100644 --- a/server/index.js +++ b/server/index.js @@ -7,6 +7,7 @@ import {sequelize} from './db/models'; import keys from '../config'; import plex from './routes/plex.route'; import tdaw from './routes/tdaw.route'; +import movieDb from './routes/movieDb.route'; import auth from './routes/auth.route'; import recommend from './routes/recommend.route'; require('./services/auth/passport'); @@ -37,6 +38,7 @@ export default () => { // Set up routes server.use('/api/plex', plex); server.use('/api/tdaw', tdaw); + server.use('/api/moviedb', movieDb); server.use('/api/recommend', recommend); server.use('/auth', auth); server.use('/api/auth', auth); diff --git a/server/routes/movieDb.route.js b/server/routes/movieDb.route.js new file mode 100644 index 0000000..f32ea54 --- /dev/null +++ b/server/routes/movieDb.route.js @@ -0,0 +1,9 @@ +import movieDbController from '../controllers/movieDb.controller'; + +const express = require('express'); + +const router = express.Router(); + +router.use(movieDbController); + +export default router; diff --git a/server/services/helpers.js b/server/services/helpers.js index 52484ca..52c5b88 100644 --- a/server/services/helpers.js +++ b/server/services/helpers.js @@ -8,7 +8,7 @@ const formatResponse = response => { return JSON.parse(parser.toJson(response.data)); } if (response.config.url.includes('tastedive')) { - console.log('taste dive response', response.data); + console.log('taste dive response', response.data.Similar.Results[0]); return response.data.Similar.Results; } return response.data; diff --git a/server/services/moviedb/index.js b/server/services/moviedb/index.js new file mode 100644 index 0000000..024421c --- /dev/null +++ b/server/services/moviedb/index.js @@ -0,0 +1,22 @@ +import movieDbApi from './movieDbApi'; +import helpers from '../helpers'; + +const searchTv = async (req, res) => { + const {showName} = req.query; + const response = await movieDbApi.searchTv(showName); + console.log(response); + res.json(response); +}; + +const similarTv = async (req, res) => { + const {showName} = req.query; + const searchResponse = await movieDbApi.searchTv(showName); + const response = await movieDbApi.similarTV(searchResponse.id); + console.log(response); + res.json(response); +}; + +export default { + searchTv, + similarTv, +}; diff --git a/server/services/moviedb/movieDbApi.js b/server/services/moviedb/movieDbApi.js new file mode 100644 index 0000000..4692b10 --- /dev/null +++ b/server/services/moviedb/movieDbApi.js @@ -0,0 +1,34 @@ +import config from '../../../config'; +import helpers from '../helpers'; +import models from '../../db/models'; +import MovieDb from 'moviedb-promise'; +const mdb = new MovieDb(config.server.movieApiKey); + +const searchTv = async showName => { + try { + const response = await mdb.searchTv({ + query: showName, + }); + + const show = response.results.filter( + result => result.original_name.toLowerCase() === showName.toLowerCase(), + )[0]; + + return show; + } catch (error) { + helpers.handleError(error, 'searchTv'); + } +}; + +const similarTV = async showId => { + try { + console.log('showID', showId); + const response = await mdb.tvSimilar({id: showId}); + console.log(response); + return response; + } catch (error) { + helpers.handleError(error, 'searchTv'); + } +}; + +export default {searchTv, similarTV}; diff --git a/server/services/tdaw/index.js b/server/services/tdaw/index.js index dd646bc..e0eceb1 100644 --- a/server/services/tdaw/index.js +++ b/server/services/tdaw/index.js @@ -3,8 +3,7 @@ import helpers from '../helpers'; const similarMedia = async (req, res) => { try { - const {mediaName} = req.query; - const {mediaType} = req.query; + const {mediaName, mediaType} = req.query; const response = await tdawApi.similarMedia(mediaName, mediaType); res.json(response); } catch (error) { @@ -19,7 +18,19 @@ const mostWatched = async (req, res) => { res.json(response); }; +const qlooMedia = async (req, res) => { + try { + const {mediaName, mediaType} = req.query; + const mediaId = await tdawApi.qlooMediaId(mediaName, mediaType); + const response = await tdawApi.qlooMedia(mediaId, mediaType); + res.json(response); + } catch (error) { + helpers.handleError(res, tdawApi.name); + } +}; + export default { similarMedia, mostWatched, + qlooMedia, }; diff --git a/server/services/tdaw/tdawApi.js b/server/services/tdaw/tdawApi.js index 70c63b8..fab5573 100644 --- a/server/services/tdaw/tdawApi.js +++ b/server/services/tdaw/tdawApi.js @@ -21,7 +21,6 @@ const similarMedia = async function(mediaName, mediaType) { const response = await helpers.request(mediaUrl); return response; } catch (error) { - console.log(error); return { code: error.status, message: error.statusText, @@ -37,4 +36,49 @@ const mostWatched = async () => { }); }; -export default {similarMedia, tdawMediaUrl, mostWatched}; +const qlooMediaId = async (mediaName, mediaType) => { + const params = { + host: + 'https://qsz08t9vtl.execute-api.us-east-1.amazonaws.com/production/search', + queryParams: {query: mediaName}, + }; + + const formattedMediaType = mediaTypeMapping()[mediaType]; + + const response = await helpers.request(helpers.buildUrl(params)); + + const filteredResponse = response.results.filter(results => + results.categories.includes(formattedMediaType), + ); + + return filteredResponse[0].id; +}; + +const mediaTypeMapping = () => { + return {tv: 'tv/shows', movie: 'film/movies'}; +}; + +const qlooMedia = async (mediaId, mediaType) => { + // recs?category=tv/shows&sample=70AB59C0-789F-4E11-B72D-FE09BF76901E&prioritize_indomain=False + const formattedMediaType = mediaTypeMapping()[mediaType]; + const params = { + host: + 'https://qsz08t9vtl.execute-api.us-east-1.amazonaws.com/production/recs', + queryParams: { + category: formattedMediaType, + sample: mediaId, + prioritize_indomain: 'False', + }, + }; + + const response = await helpers.request(helpers.buildUrl(params)); + console.log(response); + return response; +}; +export default { + similarMedia, + tdawMediaUrl, + mostWatched, + qlooMediaId, + qlooMedia, +}; diff --git a/test/server/services/plex/auth.test.js b/test/server/services/plex/auth.test.js index 4b2cad5..ff7a1b6 100644 --- a/test/server/services/plex/auth.test.js +++ b/test/server/services/plex/auth.test.js @@ -3,15 +3,20 @@ import * as nocks from '../../../nocks'; import app from '../../../../index'; describe('Users', () => { - describe('GET /api/v1/plex/auth', async () => { - it('should get plex auth token', done => { + describe('GET /api/plex/auth', async () => { + it.only('should get plex auth token', done => { nocks.auth(); chai .request(app) - .get('/api/plex/auth') - .query({username: 'username', password: 'password'}) + .get('/api/plex/token') + .query({ + username: 'username', + password: 'password', + plexUrl: 'plexserver.com', + }) .end((err, res) => { + console.log(res); res.should.have.status(200); res.body.should.equal('testPlexApiToken'); done();