Sign in/Urls: Sign in now adds all servers; however refresh guide/refresh channels must be edited through the json. Now uses local/remote server https url instead of local 34440 port url with no cert. Video Playback: Remove code not enforcing time limit for streams. Make default stream protocol http instread of hls which was used previously. Add option to choose. Add option to specify video codecs (which is prone to user error). Added mpeg2video to default video codecs. Add option to specify direct stream/transcode media buffer size. Not sure how much of a difference this makes. Add in safeguard to ffmpeg's kill so failed streams don't crash the application M3Us: Add group-title="PseudoTV" for easier management in xteve
145 lines
5.7 KiB
JavaScript
145 lines
5.7 KiB
JavaScript
const request = require('request')
|
|
class Plex {
|
|
constructor(opts) {
|
|
this._accessToken = typeof opts.accessToken !== 'undefined' ? opts.accessToken : ''
|
|
this._server = {
|
|
uri: typeof opts.uri !== 'undefined' ? opts.uri : 'http://127.0.0.1:32400',
|
|
host: typeof opts.host !== 'undefined' ? opts.host : '127.0.0.1',
|
|
port: typeof opts.port !== 'undefined' ? opts.port : '32400',
|
|
protocol: typeof opts.protocol !== 'undefined' ? opts.protocol : 'http'
|
|
}
|
|
this._headers = {
|
|
'Accept': 'application/json',
|
|
'X-Plex-Device': 'PseudoTV',
|
|
'X-Plex-Device-Name': 'PseudoTV',
|
|
'X-Plex-Product': 'PseudoTV',
|
|
'X-Plex-Version': '0.1',
|
|
'X-Plex-Client-Identifier': 'rg14zekk3pa5zp4safjwaa8z',
|
|
'X-Plex-Platform': 'Chrome',
|
|
'X-Plex-Platform-Version': '80.0'
|
|
}
|
|
}
|
|
|
|
get URL() { return `${this._server.uri}` }
|
|
|
|
SignIn(username, password) {
|
|
return new Promise((resolve, reject) => {
|
|
if (typeof username === 'undefined' || typeof password === 'undefined')
|
|
reject("Plex 'SignIn' Error - No Username or Password was provided to sign in.")
|
|
var req = {
|
|
method: 'post',
|
|
url: 'https://plex.tv/users/sign_in.json',
|
|
headers: this._headers,
|
|
form: {
|
|
user: {
|
|
login: username,
|
|
password: password
|
|
}
|
|
},
|
|
jar: false
|
|
}
|
|
request(req, (err, res, body) => {
|
|
if (err || res.statusCode !== 201)
|
|
reject("Plex 'SignIn' Error - Username/Email and Password is incorrect!.")
|
|
else {
|
|
this._accessToken = JSON.parse(body).user.authToken
|
|
resolve({ accessToken: this._accessToken })
|
|
}
|
|
})
|
|
})
|
|
}
|
|
Get(path, optionalHeaders = {}) {
|
|
var req = {
|
|
method: 'get',
|
|
url: `${this.URL}${path}`,
|
|
headers: this._headers,
|
|
jar: false
|
|
}
|
|
Object.assign(req, optionalHeaders)
|
|
req.headers['X-Plex-Token'] = this._accessToken
|
|
return new Promise((resolve, reject) => {
|
|
if (this._accessToken === '')
|
|
reject("No Plex token provided. Please use the SignIn method or provide a X-Plex-Token in the Plex constructor.")
|
|
else
|
|
request(req, (err, res) => {
|
|
if (err || res.statusCode !== 200)
|
|
reject(`Plex 'Get' request failed. URL: ${this.URL}${path}`)
|
|
else
|
|
resolve(JSON.parse(res.body).MediaContainer)
|
|
})
|
|
})
|
|
}
|
|
Put(path, query = {}, optionalHeaders = {}) {
|
|
var req = {
|
|
method: 'put',
|
|
url: `${this.URL}${path}`,
|
|
headers: this._headers,
|
|
qs: query,
|
|
jar: false
|
|
}
|
|
Object.assign(req, optionalHeaders)
|
|
req.headers['X-Plex-Token'] = this._accessToken
|
|
return new Promise((resolve, reject) => {
|
|
if (this._accessToken === '')
|
|
reject("No Plex token provided. Please use the SignIn method or provide a X-Plex-Token in the Plex constructor.")
|
|
else
|
|
request(req, (err, res) => {
|
|
if (err || res.statusCode !== 200)
|
|
reject(`Plex 'Put' request failed. URL: ${this.URL}${path}`)
|
|
else
|
|
resolve(res.body)
|
|
})
|
|
})
|
|
}
|
|
Post(path, query = {}, optionalHeaders = {}) {
|
|
var req = {
|
|
method: 'post',
|
|
url: `${this.URL}${path}`,
|
|
headers: this._headers,
|
|
qs: query,
|
|
jar: false
|
|
}
|
|
Object.assign(req, optionalHeaders)
|
|
req.headers['X-Plex-Token'] = this._accessToken
|
|
return new Promise((resolve, reject) => {
|
|
if (this._accessToken === '')
|
|
reject("No Plex token provided. Please use the SignIn method or provide a X-Plex-Token in the Plex constructor.")
|
|
else
|
|
request(req, (err, res) => {
|
|
if (err || res.statusCode !== 200)
|
|
reject(`Plex 'Post' request failed. URL: ${this.URL}${path}`)
|
|
else
|
|
resolve(res.body)
|
|
})
|
|
})
|
|
}
|
|
async GetDVRS() {
|
|
var result = await this.Get('/livetv/dvrs')
|
|
var dvrs = result.Dvr
|
|
dvrs = typeof dvrs === 'undefined' ? [] : dvrs
|
|
return dvrs
|
|
}
|
|
async RefreshGuide(_dvrs) {
|
|
var dvrs = typeof _dvrs !== 'undefined' ? _dvrs : await this.GetDVRS()
|
|
for (var i = 0; i < dvrs.length; i++)
|
|
this.Post(`/livetv/dvrs/${dvrs[i].key}/reloadGuide`).then(() => { }, (err) => { console.log(err) })
|
|
}
|
|
async RefreshChannels(channels, _dvrs) {
|
|
var dvrs = typeof _dvrs !== 'undefined' ? _dvrs : await this.GetDVRS()
|
|
var _channels = []
|
|
let qs = {}
|
|
for (var i = 0; i < channels.length; i++)
|
|
_channels.push(channels[i].number)
|
|
qs.channelsEnabled = _channels.join(',')
|
|
for (var i = 0; i < _channels.length; i++) {
|
|
qs[`channelMapping[${_channels[i]}]`] = _channels[i]
|
|
qs[`channelMappingByKey[${_channels[i]}]`] = _channels[i]
|
|
}
|
|
for (var i = 0; i < dvrs.length; i++)
|
|
for (var y = 0; y < dvrs[i].Device.length; y++)
|
|
this.Put(`/media/grabbers/devices/${dvrs[i].Device[y].key}/channelmap`, qs).then(() => { }, (err) => { console.log(err) })
|
|
}
|
|
}
|
|
|
|
module.exports = Plex
|