Linted all plex scripts.

This commit is contained in:
2018-02-07 13:50:05 +01:00
parent 97217a2826
commit dda1db6c5f
9 changed files with 220 additions and 251 deletions

View File

@@ -5,15 +5,15 @@ const convertStreamToUser = require('src/plex/stream/convertStreamToUser');
const ConvertStreamToPlayback = require('src/plex/stream/convertStreamToPlayback'); const ConvertStreamToPlayback = require('src/plex/stream/convertStreamToPlayback');
function convertPlexToStream(plexStream) { function convertPlexToStream(plexStream) {
const stream = convertPlexToSeasoned(plexStream) const stream = convertPlexToSeasoned(plexStream);
const plexStreamMedia = plexStream.Media[0] const plexStreamMedia = plexStream.Media[0];
stream.mediaInfo = convertStreamToMediaInfo(plexStreamMedia); stream.mediaInfo = convertStreamToMediaInfo(plexStreamMedia);
stream.player = convertStreamToPlayer(plexStream.Player); stream.player = convertStreamToPlayer(plexStream.Player);
stream.user = convertStreamToUser(plexStream.User); stream.user = convertStreamToUser(plexStream.User);
stream.playback = new ConvertStreamToPlayback(plexStreamMedia.Part[0]); stream.playback = new ConvertStreamToPlayback(plexStreamMedia.Part[0]);
return stream; return stream;
} }
module.exports = convertPlexToStream; module.exports = convertPlexToStream;

View File

@@ -1,22 +1,22 @@
const MediaInfo = require('src/media_classes/mediaInfo'); const MediaInfo = require('src/media_classes/mediaInfo');
function convertStreamToMediaInfo(plexStream) { function convertStreamToMediaInfo(plexStream) {
const mediaInfo = new MediaInfo(); const mediaInfo = new MediaInfo();
mediaInfo.duration = plexStream.duration;
mediaInfo.height = plexStream.height;
mediaInfo.width = plexStream.width;
if (plexStream.bitrate) { mediaInfo.duration = plexStream.duration;
mediaInfo.bitrate = plexStream.bitrate; mediaInfo.height = plexStream.height;
} mediaInfo.width = plexStream.width;
mediaInfo.resolution = plexStream.videoResolution;
mediaInfo.framerate = plexStream.videoFrameRate;
mediaInfo.protocol = plexStream.protocol;
mediaInfo.container = plexStream.container;
mediaInfo.audioCodec = plexStream.audioCodec;
return mediaInfo; if (plexStream.bitrate) {
mediaInfo.bitrate = plexStream.bitrate;
}
mediaInfo.resolution = plexStream.videoResolution;
mediaInfo.framerate = plexStream.videoFrameRate;
mediaInfo.protocol = plexStream.protocol;
mediaInfo.container = plexStream.container;
mediaInfo.audioCodec = plexStream.audioCodec;
return mediaInfo;
} }
module.exports = convertStreamToMediaInfo; module.exports = convertStreamToMediaInfo;

View File

@@ -1,14 +1,7 @@
/*
* @Author: KevinMidboe
* @Date: 2017-05-03 23:26:46
* @Last Modified by: KevinMidboe
* @Last Modified time: 2017-05-03 23:27:59
*/
const configuration = require('src/config/configuration').getInstance(); const configuration = require('src/config/configuration').getInstance();
function hookDumpController(req, res) { function hookDumpController(req, res) {
console.log(req); console.log(req);
} }
module.exports = hookDumpController; module.exports = hookDumpController;

View File

@@ -1,26 +1,25 @@
class mailTemplate { class mailTemplate {
constructor(mediaItem) {
constructor(mediaItem) { this.mediaItem = mediaItem;
this.mediaItem = mediaItem; this.posterURL = 'https://image.tmdb.org/t/p/w600';
this.posterURL = 'https://image.tmdb.org/t/p/w600'; }
}
toText() { toText() {
return this.mediaItem.title + ' (' + this.mediaItem.year + ')'; // plain text body return `${this.mediaItem.title} (${this.mediaItem.year})`; // plain text body
} }
toHTML() { toHTML() {
const info = { const info = {
name: this.mediaItem.title, name: this.mediaItem.title,
year: '(' + this.mediaItem.year + ')', year: `(${this.mediaItem.year})`,
poster: this.posterURL + this.mediaItem.poster poster: this.posterURL + this.mediaItem.poster,
} };
return ` return `
<h1>${info.name} ${info.year}</h1> <h1>${info.name} ${info.year}</h1>
<img src="${info.poster}"> <img src="${info.poster}">
` `;
} }
} }
module.exports = mailTemplate; module.exports = mailTemplate;

View File

@@ -1,87 +1,80 @@
const assert = require('assert');
const convertPlexToSeasoned = require('src/plex/convertPlexToSeasoned'); const convertPlexToSeasoned = require('src/plex/convertPlexToSeasoned');
const convertPlexToStream = require('src/plex/convertPlexToStream'); const convertPlexToStream = require('src/plex/convertPlexToStream');
var rp = require('request-promise'); const rp = require('request-promise');
const PLEX_METHODS = ['lookup', 'playing']
class PlexRepository { class PlexRepository {
inPlex(tmdbResult) {
return Promise.resolve()
.then(() => this.search(tmdbResult.title))
.then(plexResult => this.compareTmdbToPlex(tmdbResult, plexResult));
}
search(query, callback) { search(query) {
var options = { const options = {
uri: 'http://10.0.0.44:32400/search?query=' + query, uri: `http://10.0.0.44:32400/search?query=${query}`,
headers: { headers: {
'Accept': 'application/json' Accept: 'application/json',
}, },
json: true json: true,
} };
return rp(options) return rp(options)
.then((result) => this.mapResults(result)) .then(result => this.mapResults(result))
.then(([mappedResults, resultCount]) => { .then(([mappedResults, resultCount]) => ({ results: mappedResults, total_results: resultCount }));
return { 'results': mappedResults, 'total_results': resultCount } }
})
}
compareTmdbToPlex(tmdb, plexResult) { static compareTmdbToPlex(tmdb, plexResult) {
return Promise.resolve() return Promise.resolve()
.then(() => { .then(() => {
plexResult.results.map((plexItem) => { plexResult.results.map((plexItem) => {
if (tmdb.title === plexItem.title && tmdb.year === plexItem.year) if (tmdb.title === plexItem.title && tmdb.year === plexItem.year) { tmdb.matchedInPlex = true; }
tmdb.matchedInPlex = true; return tmdb;
}) });
return tmdb return tmdb;
}) });
} }
inPlex(tmdbResult) { static mapResults(response) {
return Promise.resolve() return Promise.resolve()
.then(() => this.search(tmdbResult.title)) .then(() => {
.then((plexResult) => this.compareTmdbToPlex(tmdbResult, plexResult)) if (!response.MediaContainer.hasOwnProperty('Metadata')) return [[], 0];
}
mapResults(response) { const mappedResults = response.MediaContainer.Metadata.filter((element) => {
return Promise.resolve() return (element.type === 'movie' || element.type === 'show');
.then(() => { }).map((element) => convertPlexToSeasoned(element));
if (! response.MediaContainer.hasOwnProperty('Metadata')) return [[], 0] return [mappedResults, mappedResults.length];
})
.catch((error) => { throw new Error(error); });
}
const mappedResults = response.MediaContainer.Metadata.filter((element) => { nowPlaying() {
return (element.type === 'movie' || element.type === 'show') const options = {
}).map((element) => convertPlexToSeasoned(element)) uri: 'http://10.0.0.44:32400/status/sessions',
return [mappedResults, mappedResults.length] headers: {
}) Accept: 'application/json',
.catch((error) => {throw new Error(error)}) },
} json: true,
};
nowPlaying() { return rp(options)
var options = { .then((result) => {
uri: 'http://10.0.0.44:32400/status/sessions', if (result.MediaContainer.size > 0) {
headers: { const playing = result.MediaContainer.Video.map(convertPlexToStream);
'Accept': 'application/json' return { size: Object.keys(playing).length, video: playing };
}, }
json: true return { size: 0, video: [] };
} })
.catch((err) => {
throw new Error(`Error handling plex playing. Error: ${err}`);
});
}
return rp(options) // multipleInPlex(tmdbResults) {
.then((result) => { // const results = tmdbResults.results.map(async (tmdb) => {
if (result.MediaContainer.size > 0) { // return this.inPlex(tmdb)
var playing = result.MediaContainer.Video.map(convertPlexToStream); // })
return {'size': Object.keys(playing).length, 'video': playing }; // return Promise.all(results)
} else { // }
return { 'size': 0, 'video': [] };
}
})
.catch((err) => {
throw new Error('Error handling plex playing. Error: ' + err);
})
}
// multipleInPlex(tmdbResults) {
// const results = tmdbResults.results.map(async (tmdb) => {
// return this.inPlex(tmdb)
// })
// return Promise.all(results)
// }
} }
module.exports = PlexRepository; module.exports = PlexRepository;

View File

@@ -1,132 +1,117 @@
const assert = require('assert');
const PlexRepository = require('src/plex/plexRepository'); const PlexRepository = require('src/plex/plexRepository');
const plexRepository = new PlexRepository();
const configuration = require('src/config/configuration').getInstance();
const Cache = require('src/tmdb/cache'); const Cache = require('src/tmdb/cache');
const configuration = require('src/config/configuration').getInstance();
const TMDB = require('src/tmdb/tmdb'); const TMDB = require('src/tmdb/tmdb');
const cache = new Cache();
const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey'));
var Promise = require('bluebird');
var rp = require('request-promise');
const establishedDatabase = require('src/database/database'); const establishedDatabase = require('src/database/database');
const MailTemplate = require('src/plex/mailTemplate') const plexRepository = new PlexRepository();
const cache = new Cache();
const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey'));
var pythonShell = require('python-shell'); const MailTemplate = require('src/plex/mailTemplate');
const nodemailer = require('nodemailer'); const nodemailer = require('nodemailer');
class RequestRepository { class RequestRepository {
constructor(cache, database) {
this.database = database || establishedDatabase;
this.queries = {
insertRequest: "INSERT INTO requests VALUES (?, ?, ?, ?, ?, ?, ?, CURRENT_DATE, 'requested', ?, ?)",
fetchRequstedItems: 'SELECT * FROM requests',
updateRequestedById: 'UPDATE requests SET status = ? WHERE id is ? AND type is ?',
checkIfIdRequested: 'SELECT * FROM requests WHERE id IS ? AND type IS ?',
};
}
constructor(cache, database) { search(query, type, page) {
this.database = database || establishedDatabase; return Promise.resolve()
this.queries = { .then(() => tmdb.search(query, type, page))
'insertRequest': "INSERT INTO requests VALUES (?, ?, ?, ?, ?, ?, ?, CURRENT_DATE, 'requested', ?, ?)", // .then((tmdbResult) => plexRepository.multipleInPlex(tmdbResult))
'fetchRequstedItems': "SELECT * FROM requests", .then(result => result)
'updateRequestedById': "UPDATE requests SET status = ? WHERE id is ? AND type is ?", .catch(error => `error in the house${error}`);
'checkIfIdRequested': "SELECT * FROM requests WHERE id IS ? AND type IS ?", }
}
}
search(query, type, page) { lookup(identifier, type = 'movie') {
return Promise.resolve() return Promise.resolve()
.then(() => tmdb.search(query, type, page)) .then(() => tmdb.lookup(identifier, type))
// .then((tmdbResult) => plexRepository.multipleInPlex(tmdbResult)) .then(tmdbMovie => this.checkID(tmdbMovie))
.then((result) => { .then(tmdbMovie => plexRepository.inPlex(tmdbMovie))
return result .catch((error) => {
}) throw new Error(error);
.catch((error) => {return 'error in the house' + error}) });
} }
lookup(identifier, type = 'movie') { checkID(tmdbMovie) {
return Promise.resolve() return Promise.resolve()
.then(() => tmdb.lookup(identifier, type)) .then(() => this.database.get(this.queries.checkIfIdRequested, [tmdbMovie.id, tmdbMovie.type]))
.then((tmdbMovie) => this.checkID(tmdbMovie)) .then((result, error) => {
.then((tmdbMovie) => plexRepository.inPlex(tmdbMovie)) if (error) { throw new Error(error); }
.catch((error) => { let already_requested = false;
console.log(error) if (result) { already_requested = true; }
})
}
checkID(tmdbMovie) { tmdbMovie.requested = already_requested;
return Promise.resolve() return tmdbMovie;
.then(() => this.database.get(this.queries.checkIfIdRequested, [tmdbMovie.id, tmdbMovie.type])) });
.then((result, error) => { }
let already_requested = false;
if (result)
already_requested = true
tmdbMovie.requested = already_requested; /**
return tmdbMovie; * Send request for given media id.
}) * @param {identifier, type} the id of the media object and type of media must be defined
* @returns {Promise} If nothing has gone wrong.
} */
sendRequest(identifier, type, ip, user_agent, user) {
/** tmdb.lookup(identifier, type).then((movie) => {
* Send request for given media id. if (user === 'false') { user = 'NULL'; }
* @param {identifier, type} the id of the media object and type of media must be defined // Add request to database
* @returns {Promise} If nothing has gone wrong. this.database.run(this.queries.insertRequest, [movie.id, movie.title, movie.year, movie.poster_path, movie.background_path, user, ip, user_agent, movie.type]);
*/
sendRequest(identifier, type, ip, user_agent, user) {
tmdb.lookup(identifier, type).then(movie => {
if (user === 'false')
user = 'NULL';
console.log(user)
// Add request to database
this.database.run(this.queries.insertRequest, [movie.id, movie.title, movie.year, movie.poster_path, movie.background_path, user, ip, user_agent, movie.type])
// create reusable transporter object using the default SMTP transport // create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({ const transporter = nodemailer.createTransport({
service: 'gmail', service: 'gmail',
auth: { auth: {
user: configuration.get('mail', 'user_pi'), user: configuration.get('mail', 'user_pi'),
pass: configuration.get('mail', 'password_pi') pass: configuration.get('mail', 'password_pi'),
} },
// host: configuration.get('mail', 'host'), // host: configuration.get('mail', 'host'),
// port: 26, // port: 26,
// ignoreTLS: true, // ignoreTLS: true,
// tls :{rejectUnauthorized: false}, // tls :{rejectUnauthorized: false},
// secure: false, // secure:true for port 465, secure:false for port 587 // secure: false, // secure:true for port 465, secure:false for port 587
}); });
const mailTemplate = new MailTemplate(movie) const mailTemplate = new MailTemplate(movie);
// setup email data with unicode symbols // setup email data with unicode symbols
let mailOptions = { const mailOptions = {
// TODO get the mail adr from global location (easy to add) // TODO get the mail adr from global location (easy to add)
from: 'MovieRequester <pi.midboe@gmail.com>', // sender address from: 'MovieRequester <pi.midboe@gmail.com>', // sender address
to: 'kevin.midboe@gmail.com', // list of receivers to: 'kevin.midboe@gmail.com', // list of receivers
subject: 'Download request', // Subject line subject: 'Download request', // Subject line
text: mailTemplate.toText(), text: mailTemplate.toText(),
html: mailTemplate.toHTML() html: mailTemplate.toHTML(),
}; };
// send mail with defined transport object // send mail with defined transport object
transporter.sendMail(mailOptions, (error, info) => { transporter.sendMail(mailOptions, (error, info) => {
if (error) { if (error) {
return console.log(error); return console.log(error);
} }
console.log('Message %s sent: %s', info.messageId, info.response); console.log('Message %s sent: %s', info.messageId, info.response);
}); });
});
}) // TODO add better response when done.
return Promise.resolve();
}
// TODO add better response when done. fetchRequested() {
return Promise.resolve(); return this.database.all(this.queries.fetchRequstedItems);
}
}
fetchRequested() {
return this.database.all(this.queries.fetchRequstedItems);
}
updateRequestedById(id, type, status) {
return this.database.run(this.queries.updateRequestedById, [status, id, type]);
}
updateRequestedById(id, type, status) {
return this.database.run(this.queries.updateRequestedById, [status, id, type]);
}
} }
module.exports = RequestRepository; module.exports = RequestRepository;

View File

@@ -1,15 +1,14 @@
class convertStreamToPlayback { class convertStreamToPlayback {
constructor(plexStream) { constructor(plexStream) {
this.bitrate = plexStream.bitrate; this.bitrate = plexStream.bitrate;
this.width = plexStream.width; this.width = plexStream.width;
this.height = plexStream.height; this.height = plexStream.height;
this.decision = plexStream.decision; this.decision = plexStream.decision;
this.audioProfile = plexStream.audioProfile; this.audioProfile = plexStream.audioProfile;
this.videoProfile = plexStream.videoProfile; this.videoProfile = plexStream.videoProfile;
this.duration = plexStream.duration; this.duration = plexStream.duration;
this.container = plexStream.container; this.container = plexStream.container;
}
}
} }
module.exports = convertStreamToPlayback; module.exports = convertStreamToPlayback;

View File

@@ -1,13 +1,13 @@
const Player = require('src/media_classes/player'); const Player = require('src/media_classes/player');
function convertStreamToPlayer(plexStream) { function convertStreamToPlayer(plexStream) {
const player = new Player(plexStream.device, plexStream.address); const player = new Player(plexStream.device, plexStream.address);
player.platform = plexStream.platform; player.platform = plexStream.platform;
player.product = plexStream.product; player.product = plexStream.product;
player.title = plexStream.title; player.title = plexStream.title;
player.state = plexStream.state; player.state = plexStream.state;
return player; return player;
} }
module.exports = convertStreamToPlayer; module.exports = convertStreamToPlayer;

View File

@@ -1,7 +1,7 @@
const User = require('src/media_classes/user'); const User = require('src/media_classes/user');
function convertStreamToUser(plexStream) { function convertStreamToUser(plexStream) {
return new User(plexStream.id, plexStream.title); return new User(plexStream.id, plexStream.title);
} }
module.exports = convertStreamToUser; module.exports = convertStreamToUser;