103 lines
3.2 KiB
JavaScript
103 lines
3.2 KiB
JavaScript
const convertPlexToSeasoned = require('src/plex/convertPlexToSeasoned');
|
|
const convertPlexToStream = require('src/plex/convertPlexToStream');
|
|
const rp = require('request-promise');
|
|
|
|
class PlexRepository {
|
|
constructor(plexIP) {
|
|
this.plexIP = plexIP;
|
|
}
|
|
|
|
inPlex(tmdbResult) {
|
|
return Promise.resolve()
|
|
.then(() => this.search(tmdbResult.title))
|
|
.then(plexResult => this.compareTmdbToPlex(tmdbResult, plexResult))
|
|
.catch((error) => {
|
|
console.log(error)
|
|
tmdbResult.matchedInPlex = false;
|
|
return tmdbResult;
|
|
});
|
|
}
|
|
|
|
search(query) {
|
|
const queryUri = encodeURIComponent(query)
|
|
const uri = encodeURI(`http://${this.plexIP}:32400/search?query=${queryUri}`)
|
|
const options = {
|
|
uri: uri,
|
|
headers: {
|
|
Accept: 'application/json',
|
|
},
|
|
json: true,
|
|
};
|
|
|
|
return rp(options)
|
|
.catch((error) => {
|
|
console.log(error)
|
|
throw new Error('Unable to search plex.')
|
|
})
|
|
.then(result => this.mapResults(result))
|
|
.then(([mappedResults, resultCount]) => ({ results: mappedResults, total_results: resultCount }));
|
|
}
|
|
|
|
compareTmdbToPlex(tmdb, plexResult) {
|
|
return Promise.resolve()
|
|
.then(() => {
|
|
if (plexResult.results.length === 0) {
|
|
tmdb.matchedInPlex = false
|
|
}
|
|
else {
|
|
// console.log('plex and tmdb:', plexResult, '\n', tmdb)
|
|
plexResult.results.map((plexItem) => {
|
|
if (tmdb.title === plexItem.title && tmdb.year === plexItem.year)
|
|
tmdb.matchedInPlex = true;
|
|
return tmdb;
|
|
});
|
|
}
|
|
return tmdb;
|
|
});
|
|
}
|
|
|
|
mapResults(response) {
|
|
return Promise.resolve()
|
|
.then(() => {
|
|
if (!response.MediaContainer.hasOwnProperty('Metadata')) return [[], 0];
|
|
|
|
const mappedResults = response.MediaContainer.Metadata.filter((element) => {
|
|
return (element.type === 'movie' || element.type === 'show');
|
|
}).map((element) => convertPlexToSeasoned(element));
|
|
return [mappedResults, mappedResults.length];
|
|
})
|
|
.catch((error) => { throw new Error(error); });
|
|
}
|
|
|
|
nowPlaying() {
|
|
const options = {
|
|
uri: `http://${this.plexIP}:32400/status/sessions`,
|
|
headers: {
|
|
Accept: 'application/json',
|
|
},
|
|
json: true,
|
|
};
|
|
|
|
return rp(options)
|
|
.then((result) => {
|
|
if (result.MediaContainer.size > 0) {
|
|
const playing = result.MediaContainer.Metadata.map(convertPlexToStream);
|
|
return { size: Object.keys(playing).length, video: playing };
|
|
}
|
|
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;
|