Feat: Plex authentication #124
48
seasoned_api/src/tautulli/tautulli.js
Normal file
48
seasoned_api/src/tautulli/tautulli.js
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
const fetch = require('node-fetch');
|
||||||
|
|
||||||
|
class Tautulli {
|
||||||
|
constructor(apiKey, ip, port) {
|
||||||
|
this.apiKey = apiKey;
|
||||||
|
this.ip = ip;
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
buildUrlWithCmdAndUserid(cmd, user_id) {
|
||||||
|
const url = new URL('api/v2', `http://${this.ip}:${this.port}`)
|
||||||
|
url.searchParams.append('apikey', this.apiKey)
|
||||||
|
url.searchParams.append('cmd', cmd)
|
||||||
|
url.searchParams.append('user_id', user_id)
|
||||||
|
|
||||||
|
return url
|
||||||
|
}
|
||||||
|
|
||||||
|
getPlaysByDays(plex_userid, days) {
|
||||||
|
const url = this.buildUrlWithCmdAndUserid('get_plays_by_date', plex_userid)
|
||||||
|
url.searchParams.append('time_range', days)
|
||||||
|
|
||||||
|
return fetch(url.href)
|
||||||
|
.then(resp => resp.json())
|
||||||
|
}
|
||||||
|
|
||||||
|
watchTimeStats(plex_userid) {
|
||||||
|
const url = this.buildUrlWithCmdAndUserid('get_user_watch_time_stats', plex_userid)
|
||||||
|
url.searchParams.append('grouping', 0)
|
||||||
|
|
||||||
|
return fetch(url.href)
|
||||||
|
.then(resp => resp.json())
|
||||||
|
}
|
||||||
|
|
||||||
|
viewHistory(plex_userid) {
|
||||||
|
const url = this.buildUrlWithCmdAndUserid('get_history', plex_userid)
|
||||||
|
|
||||||
|
url.searchParams.append('start', 0)
|
||||||
|
url.searchParams.append('length', 50)
|
||||||
|
|
||||||
|
console.log('fetching url', url.href)
|
||||||
|
|
||||||
|
return fetch(url.href)
|
||||||
|
.then(resp => resp.json())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Tautulli;
|
||||||
@@ -8,6 +8,7 @@ const mustHaveAccountLinkedToPlex = require('./middleware/mustHaveAccountLinkedT
|
|||||||
const configuration = require('src/config/configuration').getInstance();
|
const configuration = require('src/config/configuration').getInstance();
|
||||||
|
|
||||||
const listController = require('./controllers/list/listController');
|
const listController = require('./controllers/list/listController');
|
||||||
|
const tautulli = require('./controllers/user/viewHistory.js');
|
||||||
|
|
||||||
// TODO: Have our raven router check if there is a value, if not don't enable raven.
|
// TODO: Have our raven router check if there is a value, if not don't enable raven.
|
||||||
Raven.config(configuration.get('raven', 'DSN')).install();
|
Raven.config(configuration.get('raven', 'DSN')).install();
|
||||||
@@ -58,6 +59,10 @@ router.get('/v1/user/search_history', mustBeAuthenticated, require('./controller
|
|||||||
router.get('/v1/user/requests', mustBeAuthenticated, require('./controllers/user/requests.js'));
|
router.get('/v1/user/requests', mustBeAuthenticated, require('./controllers/user/requests.js'));
|
||||||
router.post('/v1/user/authenticate', mustBeAuthenticated, require('./controllers/user/authenticatePlexAccount.js'));
|
router.post('/v1/user/authenticate', mustBeAuthenticated, require('./controllers/user/authenticatePlexAccount.js'));
|
||||||
|
|
||||||
|
router.get('/v1/user/view_history', mustHaveAccountLinkedToPlex, tautulli.userViewHistoryController);
|
||||||
|
router.get('/v1/user/watch_time', mustHaveAccountLinkedToPlex, tautulli.watchTimeStatsController);
|
||||||
|
router.get('/v1/user/plays_by_day', mustHaveAccountLinkedToPlex, tautulli.getPlaysByDaysController);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Seasoned
|
* Seasoned
|
||||||
*/
|
*/
|
||||||
|
|||||||
80
seasoned_api/src/webserver/controllers/user/viewHistory.js
Normal file
80
seasoned_api/src/webserver/controllers/user/viewHistory.js
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
const configuration = require('src/config/configuration').getInstance();
|
||||||
|
const Tautulli = require('src/tautulli/tautulli');
|
||||||
|
const tautulli = new Tautulli('', '', );
|
||||||
|
|
||||||
|
function handleError(error, res) {
|
||||||
|
const { status, message } = error;
|
||||||
|
|
||||||
|
if (status && message) {
|
||||||
|
res.status(status).send({ success: false, message })
|
||||||
|
} else {
|
||||||
|
console.log('caught view history controller error', error)
|
||||||
|
res.status(500).send({ message: 'An unexpected error occured while fetching view history'})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function watchTimeStatsController(req, res) {
|
||||||
|
const user = req.loggedInUser;
|
||||||
|
|
||||||
|
tautulli.watchTimeStats(user.plex_userid)
|
||||||
|
.then(data => {
|
||||||
|
console.log('data', data, JSON.stringify(data.response.data))
|
||||||
|
|
||||||
|
return res.send({
|
||||||
|
success: true,
|
||||||
|
data: data.response.data,
|
||||||
|
message: 'watch time successfully fetched from tautulli'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPlaysByDaysController(req, res) {
|
||||||
|
const user = req.loggedInUser;
|
||||||
|
const days = req.query.days || undefined;
|
||||||
|
|
||||||
|
if (days === undefined) {
|
||||||
|
return res.status(422).send({
|
||||||
|
success: false,
|
||||||
|
message: "Missing parameter: days (number)"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
tautulli.getPlaysByDays(user.plex_userid, days)
|
||||||
|
.then(data => res.send({
|
||||||
|
success: true,
|
||||||
|
data: data.response.data
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function userViewHistoryController(req, res) {
|
||||||
|
const user = req.loggedInUser;
|
||||||
|
|
||||||
|
console.log('user', user)
|
||||||
|
|
||||||
|
|
||||||
|
// TODO here we should check if we can init tau
|
||||||
|
// and then return 501 Not implemented
|
||||||
|
|
||||||
|
tautulli.viewHistory(user.plex_userid)
|
||||||
|
.then(data => {
|
||||||
|
console.log('data', data, JSON.stringify(data.response.data.data))
|
||||||
|
|
||||||
|
|
||||||
|
return res.send({
|
||||||
|
success: true,
|
||||||
|
data: data.response.data.data,
|
||||||
|
message: 'view history successfully fetched from tautulli'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.catch(error => handleError(error))
|
||||||
|
|
||||||
|
|
||||||
|
// const username = user.username;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
watchTimeStatsController,
|
||||||
|
getPlaysByDaysController,
|
||||||
|
userViewHistoryController
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user