Add qloo API endpoints

This commit is contained in:
mjrode
2019-04-12 16:44:25 -05:00
parent e9add729aa
commit c6cbe70dfb
12 changed files with 147 additions and 13 deletions

View File

@@ -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() {

View File

@@ -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"
},

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);

View File

@@ -0,0 +1,9 @@
import movieDbController from '../controllers/movieDb.controller';
const express = require('express');
const router = express.Router();
router.use(movieDbController);
export default router;

View File

@@ -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;

View File

@@ -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,
};

View File

@@ -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};

View File

@@ -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,
};

View File

@@ -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,
};

View File

@@ -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();