This commit is contained in:
2022-01-03 18:23:49 +01:00
parent 8165cf8e85
commit 95d2b0095b
3 changed files with 218 additions and 118 deletions

View File

@@ -1,39 +1,47 @@
const Plex = require('src/plex/plex') const Plex = require("src/plex/plex");
const configuration = require('src/config/configuration').getInstance(); const configuration = require("src/config/configuration").getInstance();
const plex = new Plex(configuration.get('plex', 'ip')) const plex = new Plex(configuration.get("plex", "ip"));
const establishedDatabase = require('src/database/database'); const establishedDatabase = require("src/database/database");
class UpdateRequestsInPlex { class UpdateRequestsInPlex {
constructor() { constructor() {
this.database = establishedDatabase; this.database = establishedDatabase;
this.queries = { this.queries = {
getMovies: `SELECT * FROM requests WHERE status = 'requested' OR status = 'downloading'`, getMovies: `SELECT * FROM requests WHERE status = 'requested' OR status = 'downloading'`,
// getMovies: "select * from requests where status is 'reset'", // getMovies: "select * from requests where status is 'reset'",
saveNewStatus: `UPDATE requests SET status = ? WHERE id IS ? and type IS ?`, saveNewStatus: `UPDATE requests SET status = ? WHERE id IS ? and type IS ?`
} };
} }
getByStatus() { getByStatus() {
return this.database.all(this.queries.getMovies); return this.database.all(this.queries.getMovies);
} }
scrub() { scrub() {
return this.getByStatus() return this.getByStatus().then(requests =>
.then((requests) => Promise.all(requests.map(movie => plex.existsInPlex(movie)))) Promise.all(requests.map(movie => plex.existsInPlex(movie)))
);
} }
commitNewStatus(status, id, type, title) { commitNewStatus(status, id, type, title) {
console.log(type, title, 'updated to:', status) console.log(type, title, "updated to:", status);
this.database.run(this.queries.saveNewStatus, [status, id, type]) this.database.run(this.queries.saveNewStatus, [status, id, type]);
} }
updateStatus(status) { updateStatus(status) {
this.getByStatus() this.getByStatus()
.then(requests => Promise.all(requests.map(request => plex.existsInPlex(request)))) .then(requests =>
.then(matchedRequests => matchedRequests.filter(request => request.existsInPlex)) Promise.all(requests.map(request => plex.existsInPlex(request)))
.then(newMatches => newMatches.map(match => this.commitNewStatus(status, match.id, match.type, match.title))) )
.then(matchedRequests =>
matchedRequests.filter(request => request.existsInPlex)
)
.then(newMatches =>
newMatches.map(match =>
this.commitNewStatus(status, match.id, match.type, match.title)
)
);
} }
} }
var requestsUpdater = new UpdateRequestsInPlex(); var requestsUpdater = new UpdateRequestsInPlex();
requestsUpdater.updateStatus('downloaded') requestsUpdater.updateStatus("downloaded");
module.exports = UpdateRequestsInPlex module.exports = UpdateRequestsInPlex;

View File

@@ -1,26 +1,26 @@
const express = require('express'); const express = require("express");
const Raven = require('raven'); const Raven = require("raven");
const bodyParser = require('body-parser'); const bodyParser = require("body-parser");
const tokenToUser = require('./middleware/tokenToUser'); const tokenToUser = require("./middleware/tokenToUser");
const mustBeAuthenticated = require('./middleware/mustBeAuthenticated'); const mustBeAuthenticated = require("./middleware/mustBeAuthenticated");
const mustBeAdmin = require('./middleware/mustBeAdmin'); const mustBeAdmin = require("./middleware/mustBeAdmin");
const mustHaveAccountLinkedToPlex = require('./middleware/mustHaveAccountLinkedToPlex'); const mustHaveAccountLinkedToPlex = require("./middleware/mustHaveAccountLinkedToPlex");
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'); const tautulli = require("./controllers/user/viewHistory.js");
const SettingsController = require('./controllers/user/settings'); const SettingsController = require("./controllers/user/settings");
const AuthenticatePlexAccountController = require('./controllers/user/authenticatePlexAccount'); const AuthenticatePlexAccountController = require("./controllers/user/authenticatePlexAccount");
// 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();
const app = express(); // define our app using express const app = express(); // define our app using express
app.use(Raven.requestHandler()); app.use(Raven.requestHandler());
app.use(bodyParser.json()); app.use(bodyParser.json());
const router = express.Router(); const router = express.Router();
const allowedOrigins = configuration.get('webserver', 'origins'); const allowedOrigins = configuration.get("webserver", "origins");
// TODO: All JSON handling in a single router // TODO: All JSON handling in a single router
// router.use(bodyParser.json()); // router.use(bodyParser.json());
@@ -34,115 +34,195 @@ router.use((req, res, next) => {
// TODO add logging of all incoming // TODO add logging of all incoming
const origin = req.headers.origin; const origin = req.headers.origin;
if (allowedOrigins.indexOf(origin) > -1) { if (allowedOrigins.indexOf(origin) > -1) {
res.setHeader('Access-Control-Allow-Origin', origin); res.setHeader("Access-Control-Allow-Origin", origin);
} }
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, loggedinuser'); res.header(
res.header('Access-Control-Allow-Methods', 'POST, GET, PUT'); "Access-Control-Allow-Headers",
"Content-Type, Authorization, loggedinuser"
);
res.header("Access-Control-Allow-Methods", "POST, GET, PUT");
next(); next();
}); });
router.get('/', function mainHandler(req, res) { router.get("/", function mainHandler(req, res) {
throw new Error('Broke!'); throw new Error("Broke!");
}); });
app.use(Raven.errorHandler()); app.use(Raven.errorHandler());
app.use(function onError(err, req, res, next) { app.use(function onError(err, req, res, next) {
res.statusCode = 500; res.statusCode = 500;
res.end(res.sentry + '\n'); res.end(res.sentry + "\n");
}); });
/** /**
* User * User
*/ */
router.post('/v1/user', require('./controllers/user/register.js')); router.post("/v1/user", require("./controllers/user/register.js"));
router.post('/v1/user/login', require('./controllers/user/login.js')); router.post("/v1/user/login", require("./controllers/user/login.js"));
router.get('/v1/user/settings', mustBeAuthenticated, SettingsController.getSettingsController); router.get(
router.put('/v1/user/settings', mustBeAuthenticated, SettingsController.updateSettingsController); "/v1/user/settings",
router.get('/v1/user/search_history', mustBeAuthenticated, require('./controllers/user/searchHistory.js')); mustBeAuthenticated,
router.get('/v1/user/requests', mustBeAuthenticated, require('./controllers/user/requests.js')); SettingsController.getSettingsController
router.post('/v1/user/link_plex', mustBeAuthenticated, AuthenticatePlexAccountController.link); );
router.post('/v1/user/unlink_plex', mustBeAuthenticated, AuthenticatePlexAccountController.unlink); router.put(
"/v1/user/settings",
mustBeAuthenticated,
SettingsController.updateSettingsController
);
router.get(
"/v1/user/search_history",
mustBeAuthenticated,
require("./controllers/user/searchHistory.js")
);
router.get(
"/v1/user/requests",
mustBeAuthenticated,
require("./controllers/user/requests.js")
);
router.post(
"/v1/user/link_plex",
mustBeAuthenticated,
AuthenticatePlexAccountController.link
);
router.post(
"/v1/user/unlink_plex",
mustBeAuthenticated,
AuthenticatePlexAccountController.unlink
);
router.get('/v1/user/view_history', mustHaveAccountLinkedToPlex, tautulli.userViewHistoryController); router.get(
router.get('/v1/user/watch_time', mustHaveAccountLinkedToPlex, tautulli.watchTimeStatsController); "/v1/user/view_history",
router.get('/v1/user/plays_by_day', mustHaveAccountLinkedToPlex, tautulli.getPlaysByDaysController); mustHaveAccountLinkedToPlex,
router.get('/v1/user/plays_by_dayofweek', mustHaveAccountLinkedToPlex, tautulli.getPlaysByDayOfWeekController); tautulli.userViewHistoryController
);
router.get(
"/v1/user/watch_time",
mustHaveAccountLinkedToPlex,
tautulli.watchTimeStatsController
);
router.get(
"/v1/user/plays_by_day",
mustHaveAccountLinkedToPlex,
tautulli.getPlaysByDaysController
);
router.get(
"/v1/user/plays_by_dayofweek",
mustHaveAccountLinkedToPlex,
tautulli.getPlaysByDayOfWeekController
);
/** /**
* Seasoned * Seasoned
*/ */
router.get('/v1/seasoned/all', require('./controllers/seasoned/readStrays.js')); router.get("/v1/seasoned/all", require("./controllers/seasoned/readStrays.js"));
router.get('/v1/seasoned/:strayId', require('./controllers/seasoned/strayById.js')); router.get(
router.post('/v1/seasoned/verify/:strayId', require('./controllers/seasoned/verifyStray.js')); "/v1/seasoned/:strayId",
require("./controllers/seasoned/strayById.js")
);
router.post(
"/v1/seasoned/verify/:strayId",
require("./controllers/seasoned/verifyStray.js")
);
router.get('/v2/search/', require('./controllers/search/multiSearch.js')); router.get("/v2/search/", require("./controllers/search/multiSearch.js"));
router.get('/v2/search/movie', require('./controllers/search/movieSearch.js')); router.get("/v2/search/movie", require("./controllers/search/movieSearch.js"));
router.get('/v2/search/show', require('./controllers/search/showSearch.js')); router.get("/v2/search/show", require("./controllers/search/showSearch.js"));
router.get('/v2/search/person', require('./controllers/search/personSearch.js')); router.get(
"/v2/search/person",
require("./controllers/search/personSearch.js")
);
router.get('/v2/movie/now_playing', listController.nowPlayingMovies); router.get("/v2/movie/now_playing", listController.nowPlayingMovies);
router.get('/v2/movie/popular', listController.popularMovies); router.get("/v2/movie/popular", listController.popularMovies);
router.get('/v2/movie/top_rated', listController.topRatedMovies); router.get("/v2/movie/top_rated", listController.topRatedMovies);
router.get('/v2/movie/upcoming', listController.upcomingMovies); router.get("/v2/movie/upcoming", listController.upcomingMovies);
router.get('/v2/show/now_playing', listController.nowPlayingShows); 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/credits", require("./controllers/movie/credits.js"));
router.get('/v2/movie/:id/release_dates', require('./controllers/movie/releaseDates.js')); router.get(
router.get('/v2/show/:id/credits', require('./controllers/show/credits.js')); "/v2/movie/:id/release_dates",
require("./controllers/movie/releaseDates.js")
);
router.get("/v2/show/:id/credits", require("./controllers/show/credits.js"));
router.get('/v2/movie/:id', require('./controllers/movie/info.js')); router.get("/v2/movie/:id", require("./controllers/movie/info.js"));
router.get('/v2/show/:id', require('./controllers/show/info.js')); router.get("/v2/show/:id", require("./controllers/show/info.js"));
router.get('/v2/person/:id', require('./controllers/person/info.js')); router.get("/v2/person/:id", require("./controllers/person/info.js"));
/** /**
* Plex * Plex
*/ */
router.get('/v2/plex/search', require('./controllers/plex/search')); router.get("/v2/plex/search", require("./controllers/plex/search"));
/** /**
* List * List
*/ */
router.get('/v1/plex/search', require('./controllers/plex/searchMedia.js')); router.get("/v1/plex/search", require("./controllers/plex/searchMedia.js"));
router.get('/v1/plex/playing', require('./controllers/plex/plexPlaying.js')); router.get("/v1/plex/playing", require("./controllers/plex/plexPlaying.js"));
router.get('/v1/plex/request', require('./controllers/plex/searchRequest.js')); router.get("/v1/plex/request", require("./controllers/plex/searchRequest.js"));
router.get('/v1/plex/request/:mediaId', require('./controllers/plex/readRequest.js')); router.get(
router.post('/v1/plex/request/:mediaId', require('./controllers/plex/submitRequest.js')); "/v1/plex/request/:mediaId",
router.post('/v1/plex/hook', require('./controllers/plex/hookDump.js')); require("./controllers/plex/readRequest.js")
);
router.post(
"/v1/plex/request/:mediaId",
require("./controllers/plex/submitRequest.js")
);
router.post("/v1/plex/hook", require("./controllers/plex/hookDump.js"));
router.get('/v1/plex/watch-link', mustBeAuthenticated, require('./controllers/plex/watchDirectLink.js')); router.get(
"/v1/plex/watch-link",
mustBeAuthenticated,
require("./controllers/plex/watchDirectLink.js")
);
/** /**
* Requests * Requests
*/ */
router.get('/v2/request', require('./controllers/request/fetchAllRequests.js')); router.get("/v2/request", require("./controllers/request/fetchAllRequests.js"));
router.get('/v2/request/:id', require('./controllers/request/getRequest.js')); router.get("/v2/request/:id", require("./controllers/request/getRequest.js"));
router.post('/v2/request', require('./controllers/request/requestTmdbId.js')); router.post("/v2/request", require("./controllers/request/requestTmdbId.js"));
router.get('/v1/plex/requests/all', require('./controllers/plex/fetchRequested.js')); router.get(
router.put('/v1/plex/request/:requestId', mustBeAuthenticated, require('./controllers/plex/updateRequested.js')); "/v1/plex/requests/all",
require("./controllers/plex/fetchRequested.js")
);
router.put(
"/v1/plex/request/:requestId",
mustBeAuthenticated,
require("./controllers/plex/updateRequested.js")
);
/** /**
* Pirate * Pirate
*/ */
router.get('/v1/pirate/search', mustBeAuthenticated, require('./controllers/pirate/searchTheBay.js')); router.get(
router.post('/v1/pirate/add', mustBeAuthenticated, require('./controllers/pirate/addMagnet.js')); "/v1/pirate/search",
mustBeAuthenticated,
require("./controllers/pirate/searchTheBay.js")
);
router.post(
"/v1/pirate/add",
mustBeAuthenticated,
require("./controllers/pirate/addMagnet.js")
);
/** /**
* git * git
*/ */
router.post('/v1/git/dump', require('./controllers/git/dumpHook.js')); router.post("/v1/git/dump", require("./controllers/git/dumpHook.js"));
/** /**
* misc * misc
*/ */
router.get('/v1/emoji', require('./controllers/misc/emoji.js')); router.get("/v1/emoji", require("./controllers/misc/emoji.js"));
// REGISTER OUR ROUTES ------------------------------- // REGISTER OUR ROUTES -------------------------------
// all of our routes will be prefixed with /api // all of our routes will be prefixed with /api
app.use('/api', router); app.use("/api", router);
module.exports = app; module.exports = app;

View File

@@ -1,16 +1,16 @@
const configuration = require('src/config/configuration').getInstance(); const configuration = require("src/config/configuration").getInstance();
const TMDB = require('src/tmdb/tmdb'); const TMDB = require("src/tmdb/tmdb");
const RequestRepository = require('src/request/request'); const RequestRepository = require("src/request/request");
const tmdb = new TMDB(configuration.get('tmdb', 'apiKey')); const tmdb = new TMDB(configuration.get("tmdb", "apiKey"));
const request = new RequestRepository(); const request = new RequestRepository();
const tmdbMovieInfo = (id) => { const tmdbMovieInfo = id => {
return tmdb.movieInfo(id) return tmdb.movieInfo(id);
} };
const tmdbShowInfo = (id) => { const tmdbShowInfo = id => {
return tmdb.showInfo(id) return tmdb.showInfo(id);
} };
/** /**
* Controller: Request by id with type param * Controller: Request by id with type param
@@ -19,33 +19,45 @@ const tmdbShowInfo = (id) => {
* @returns {Callback} * @returns {Callback}
*/ */
function requestTmdbIdController(req, res) { function requestTmdbIdController(req, res) {
const { id, type } = req.body const { id, type } = req.body;
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; const ip = req.headers["x-forwarded-for"] || req.connection.remoteAddress;
const user_agent = req.headers['user-agent']; const user_agent = req.headers["user-agent"];
const user = req.loggedInUser; const user = req.loggedInUser;
let mediaFunction = undefined let mediaFunction = undefined;
if (id === undefined || type === undefined) { if (id === undefined || type === undefined) {
res.status(422).send({ success: false, message: "'Missing parameteres: 'id' and/or 'type'"}) res
.status(422)
.send({
success: false,
message: "'Missing parameteres: 'id' and/or 'type'"
});
} }
if (type === 'movie') { if (type === "movie") {
mediaFunction = tmdbMovieInfo mediaFunction = tmdbMovieInfo;
} else if (type === 'show') { } else if (type === "show") {
mediaFunction = tmdbShowInfo mediaFunction = tmdbShowInfo;
} else { } else {
res.status(422).send({ success: false, message: 'Incorrect type. Allowed types: "movie" or "show"'}) res
.status(422)
.send({
success: false,
message: 'Incorrect type. Allowed types: "movie" or "show"'
});
} }
mediaFunction(id) mediaFunction(id)
// .catch((error) => { console.error(error); res.status(404).send({ success: false, error: 'Id not found' }) }) // .catch((error) => { console.error(error); res.status(404).send({ success: false, error: 'Id not found' }) })
.then(tmdbMedia => request.requestFromTmdb(tmdbMedia, ip, user_agent, user)) .then(tmdbMedia => request.requestFromTmdb(tmdbMedia, ip, user_agent, user))
.then(() => res.send({success: true, message: 'Request has been submitted.'})) .then(() =>
res.send({ success: true, message: "Request has been submitted." })
)
.catch(error => { .catch(error => {
res.send({ success: false, message: error.message }); res.send({ success: false, message: error.message });
}) });
} }
module.exports = requestTmdbIdController; module.exports = requestTmdbIdController;