Discover localhost server

This commit is contained in:
JonnyWong16 2018-07-09 19:31:11 -07:00
parent e567134ee1
commit ab5384cfdf
5 changed files with 114 additions and 33 deletions

View file

@ -650,12 +650,20 @@
</div> </div>
<div class="form-group has-feedback" id="pms_ip_group"> <div class="form-group has-feedback" id="pms_ip_group">
<label for="pms_ip">Plex IP Address or Hostname</label> <label for="pms_ip_selectize">Plex IP Address or Hostname</label>
<div class="row"> <div class="row">
<div class="col-md-9" id="selectize-pms-ip-container"> <div class="col-md-9" id="selectize-pms-ip-container">
<div class="input-group"> <div class="input-group">
<select class="form-control pms-settings selectize-pms-ip" id="pms_ip" name="pms_ip" data-parsley-trigger="change" aria-describedby="server-verified" data-parsley-errors-container="#pms_ip_error" required> <select class="form-control pms-settings selectize-pms-ip" id="pms_ip_selectize" data-parsley-trigger="change" aria-describedby="server-verified" data-parsley-errors-container="#pms_ip_error" required>
<option value="${config['pms_ip']}" selected>${config['pms_ip']}</option> <option value="${config['pms_ip']}:${config['pms_port']}"
data-identifier="${config['pms_identifier']}"
data-ip="${config['pms_ip']}"
data-port="${config['pms_port']}"
data-local="${int(not int(config['pms_is_remote']))}"
data-ssl="${config['pms_ssl']}"
data-is_cloud="${config['pms_is_cloud']}"
data-label="${config['pms_name'] or 'Local'}"
selected>${config['pms_ip']}</option>
</select> </select>
<span class="input-group-btn"> <span class="input-group-btn">
<button class="btn btn-form" type="button" id="verify_server_button">Verify Server</button> <button class="btn btn-form" type="button" id="verify_server_button">Verify Server</button>
@ -738,6 +746,7 @@
</p> </p>
</div> </div>
<input type="hidden" id="pms_ip" name="pms_ip" value="${config['pms_ip']}">
<input type="hidden" id="pms_is_cloud" name="pms_is_cloud" value="${config['pms_is_cloud']}"> <input type="hidden" id="pms_is_cloud" name="pms_is_cloud" value="${config['pms_is_cloud']}">
<input type="checkbox" name="server_changed" id="server_changed" value="1" style="display: none;"> <input type="checkbox" name="server_changed" id="server_changed" value="1" style="display: none;">
@ -2053,7 +2062,7 @@ $(document).ready(function() {
} }
}); });
var $select_pms = $('#pms_ip').selectize({ var $select_pms = $('#pms_ip_selectize').selectize({
createOnBlur: true, createOnBlur: true,
openOnFocus: true, openOnFocus: true,
maxItems: 1, maxItems: 1,
@ -2064,13 +2073,19 @@ $(document).ready(function() {
dropdownParent: '#selectize-pms-ip-container', dropdownParent: '#selectize-pms-ip-container',
render: { render: {
item: function (item, escape) { item: function (item, escape) {
if (!item.label) {
$.extend(item,
$(this.revertSettings.$children)
.filter('[value=' + item.value + ']').data()
);
}
var label = item.label || item.value; var label = item.label || item.value;
var caption = item.label ? item.value : null; var caption = item.label ? item.ip : null;
return '<div data-ssl="' + item.httpsRequired + return '<div data-identifier="' + item.clientIdentifier +
'" data-local="' + item.local +
'" data-identifier="' + item.clientIdentifier +
'" data-ip="' + item.ip + '" data-ip="' + item.ip +
'" data-port="' + item.port + '" data-port="' + item.port +
'" data-local="' + item.local +
'" data-ssl="' + item.httpsRequired +
'" data-is_cloud="' + item.is_cloud + '" data-is_cloud="' + item.is_cloud +
'" data-label="' + item.label + '">' + '" data-label="' + item.label + '">' +
'<span class="item-text">' + escape(label) + '</span>' + '<span class="item-text">' + escape(label) + '</span>' +
@ -2080,11 +2095,11 @@ $(document).ready(function() {
option: function (item, escape) { option: function (item, escape) {
var label = item.label || item.value; var label = item.label || item.value;
var caption = item.label ? item.value : null; var caption = item.label ? item.value : null;
return '<div data-ssl="' + item.httpsRequired + return '<div data-identifier="' + item.clientIdentifier +
'" data-local="' + item.local +
'" data-identifier="' + item.clientIdentifier +
'" data-ip="' + item.ip + '" data-ip="' + item.ip +
'" data-port="' + item.port + '" data-port="' + item.port +
'" data-local="' + item.local +
'" data-ssl="' + item.httpsRequired +
'" data-is_cloud="' + item.is_cloud + '" data-is_cloud="' + item.is_cloud +
'" data-label="' + item.label + '">' + '" data-label="' + item.label + '">' +
escape(label) + escape(label) +
@ -2095,15 +2110,24 @@ $(document).ready(function() {
create: function(input) { create: function(input) {
return {label: '', value: input}; return {label: '', value: input};
}, },
onInitialize: function () {
var s = this;
this.revertSettings.$children.each(function () {
$.extend(s.options[this.value], $(this).data());
});
},
onChange: function (item) { onChange: function (item) {
var pms_ip_selected = this.getItem(item)[0]; var pms_ip_selected = this.getItem(item)[0];
var identifier = $(pms_ip_selected).data('identifier'); var identifier = $(pms_ip_selected).data('identifier');
var ip = $(pms_ip_selected).data('ip');
var port = $(pms_ip_selected).data('port'); var port = $(pms_ip_selected).data('port');
var local = $(pms_ip_selected).data('local'); var local = $(pms_ip_selected).data('local');
var ssl = $(pms_ip_selected).data('ssl'); var ssl = $(pms_ip_selected).data('ssl');
var is_cloud = $(pms_ip_selected).data('is_cloud'); var is_cloud = $(pms_ip_selected).data('is_cloud');
var value = $(pms_ip_selected).data('value');
$("#pms_identifier").val(identifier !== 'undefined' ? identifier : ''); $("#pms_identifier").val(identifier !== 'undefined' ? identifier : '');
$('#pms_ip').val(ip !== 'undefined' ? ip : value);
$('#pms_port').val(port !== 'undefined' ? port : 32400); $('#pms_port').val(port !== 'undefined' ? port : 32400);
$('#pms_is_remote_checkbox').prop('checked', (local !== 'undefined' && local === 0)); $('#pms_is_remote_checkbox').prop('checked', (local !== 'undefined' && local === 0));
$('#pms_is_remote').val(local !== 'undefined' && local === 0 ? 1 : 0); $('#pms_is_remote').val(local !== 'undefined' && local === 0 ? 1 : 0);
@ -2128,9 +2152,10 @@ $(document).ready(function() {
}, },
success: function (result) { success: function (result) {
if (result) { if (result) {
var existing_value = $('#pms_ip').val(); var existing_ip = $('#pms_ip').val();
var existing_port = $('#pms_port').val();
result.forEach(function (item) { result.forEach(function (item) {
if (item.value === existing_value) { if (item.ip === existing_ip && item.port === existing_port) {
select_pms.updateOption(item.value, item); select_pms.updateOption(item.value, item);
} else { } else {
select_pms.addOption(item); select_pms.addOption(item);

View file

@ -86,11 +86,19 @@
</p> </p>
</div> </div>
<div class="wizard-input-section"> <div class="wizard-input-section">
<label for="pms_ip">Plex IP or Hostname</label> <label for="pms_ip_selectize">Plex IP Address or Hostname</label>
<div class="row"> <div class="row">
<div class="col-xs-12"> <div class="col-xs-12">
<select class="form-control pms-settings selectize-pms-ip" id="pms_ip" name="pms_ip"> <select class="form-control pms-settings selectize-pms-ip" id="pms_ip_selectize">
<option value="${config['pms_ip']}" selected>${config['pms_ip']}</option> <option value="${config['pms_ip']}:${config['pms_port']}"
data-identifier="${config['pms_identifier']}"
data-ip="${config['pms_ip']}"
data-port="${config['pms_port']}"
data-local="${int(not int(config['pms_is_remote']))}"
data-ssl="${config['pms_ssl']}"
data-is_cloud="${config['pms_is_cloud']}"
data-label="${config['pms_name'] or 'Local'}"
selected>${config['pms_ip']}</option>
</select> </select>
</div> </div>
</div> </div>
@ -120,6 +128,7 @@
</div> </div>
</div> </div>
<input type="hidden" id="pms_valid" data-validate="validatePMSip" value=""> <input type="hidden" id="pms_valid" data-validate="validatePMSip" value="">
<input type="hidden" id="pms_ip" name="pms_ip" value="${config['pms_ip']}">
<input type="hidden" id="pms_is_cloud" name="pms_is_cloud" value="${config['pms_is_cloud']}"> <input type="hidden" id="pms_is_cloud" name="pms_is_cloud" value="${config['pms_is_cloud']}">
<input type="hidden" id="pms_identifier" name="pms_identifier" value="${config['pms_identifier']}"> <input type="hidden" id="pms_identifier" name="pms_identifier" value="${config['pms_identifier']}">
<a class="btn btn-dark" id="verify-plex-server" href="#" role="button">Verify</a> <a class="btn btn-dark" id="verify-plex-server" href="#" role="button">Verify</a>
@ -314,7 +323,7 @@ $(document).ready(function() {
} }
}); });
var $select_pms = $('#pms_ip').selectize({ var $select_pms = $('#pms_ip_selectize').selectize({
createOnBlur: true, createOnBlur: true,
openOnFocus: true, openOnFocus: true,
maxItems: 1, maxItems: 1,
@ -324,13 +333,19 @@ $(document).ready(function() {
inputClass: 'form-control selectize-input', inputClass: 'form-control selectize-input',
render: { render: {
item: function (item, escape) { item: function (item, escape) {
if (!item.label) {
$.extend(item,
$(this.revertSettings.$children)
.filter('[value=' + item.value + ']').data()
);
}
var label = item.label || item.value; var label = item.label || item.value;
var caption = item.label ? item.value : null; var caption = item.label ? item.ip : null;
return '<div data-ssl="' + item.httpsRequired + return '<div data-identifier="' + item.clientIdentifier +
'" data-local="' + item.local +
'" data-identifier="' + item.clientIdentifier +
'" data-ip="' + item.ip + '" data-ip="' + item.ip +
'" data-port="' + item.port + '" data-port="' + item.port +
'" data-local="' + item.local +
'" data-ssl="' + item.httpsRequired +
'" data-is_cloud="' + item.is_cloud + '" data-is_cloud="' + item.is_cloud +
'" data-label="' + item.label + '">' + '" data-label="' + item.label + '">' +
'<span class="item-text">' + escape(label) + '</span>' + '<span class="item-text">' + escape(label) + '</span>' +
@ -340,11 +355,11 @@ $(document).ready(function() {
option: function (item, escape) { option: function (item, escape) {
var label = item.label || item.value; var label = item.label || item.value;
var caption = item.label ? item.value : null; var caption = item.label ? item.value : null;
return '<div data-ssl="' + item.httpsRequired + return '<div data-identifier="' + item.clientIdentifier +
'" data-local="' + item.local +
'" data-identifier="' + item.clientIdentifier +
'" data-ip="' + item.ip + '" data-ip="' + item.ip +
'" data-port="' + item.port + '" data-port="' + item.port +
'" data-local="' + item.local +
'" data-ssl="' + item.httpsRequired +
'" data-is_cloud="' + item.is_cloud + '" data-is_cloud="' + item.is_cloud +
'" data-label="' + item.label + '">' + '" data-label="' + item.label + '">' +
escape(label) + escape(label) +
@ -355,18 +370,27 @@ $(document).ready(function() {
create: function(input) { create: function(input) {
return {label: '', value: input}; return {label: '', value: input};
}, },
onInitialize: function () {
var s = this;
this.revertSettings.$children.each(function () {
$.extend(s.options[this.value], $(this).data());
});
},
onChange: function (item) { onChange: function (item) {
var pms_ip_selected = this.getItem(item)[0]; var pms_ip_selected = this.getItem(item)[0];
var identifier = $(pms_ip_selected).data('identifier'); var identifier = $(pms_ip_selected).data('identifier');
var ip = $(pms_ip_selected).data('ip');
var port = $(pms_ip_selected).data('port'); var port = $(pms_ip_selected).data('port');
var local = $(pms_ip_selected).data('local'); var local = $(pms_ip_selected).data('local');
var ssl = $(pms_ip_selected).data('ssl'); var ssl = $(pms_ip_selected).data('ssl');
var is_cloud = $(pms_ip_selected).data('is_cloud'); var is_cloud = $(pms_ip_selected).data('is_cloud');
var value = $(pms_ip_selected).data('value');
$("#pms_valid").val(identifier !== 'undefined' ? 'valid' : ''); $("#pms_valid").val(identifier !== 'undefined' ? 'valid' : '');
$("#pms-verify-status").html(identifier !== 'undefined' ? '<i class="fa fa-check"></i>&nbsp; Server found!' : '').fadeIn('fast'); $("#pms-verify-status").html(identifier !== 'undefined' ? '<i class="fa fa-check"></i>&nbsp; Server found!' : '').fadeIn('fast');
$("#pms_identifier").val(identifier !== 'undefined' ? identifier : ''); $("#pms_identifier").val(identifier !== 'undefined' ? identifier : '');
$('#pms_ip').val(ip !== 'undefined' ? ip : value);
$('#pms_port').val(port !== 'undefined' ? port : 32400); $('#pms_port').val(port !== 'undefined' ? port : 32400);
$('#pms_is_remote_checkbox').prop('checked', (local !== 'undefined' && local === 0)); $('#pms_is_remote_checkbox').prop('checked', (local !== 'undefined' && local === 0));
$('#pms_is_remote').val(local !== 'undefined' && local === 0 ? 1 : 0); $('#pms_is_remote').val(local !== 'undefined' && local === 0 ? 1 : 0);
@ -399,9 +423,10 @@ $(document).ready(function() {
}, },
success: function (result) { success: function (result) {
if (result) { if (result) {
var existing_value = $('#pms_ip').val(); var existing_ip = $('#pms_ip').val();
var existing_port = $('#pms_port').val();
result.forEach(function (item) { result.forEach(function (item) {
if (item.value === existing_value) { if (item.ip === existing_ip && item.port === existing_port) {
select_pms.updateOption(item.value, item); select_pms.updateOption(item.value, item);
} else { } else {
select_pms.addOption(item); select_pms.addOption(item);

View file

@ -685,6 +685,23 @@ class PlexTV(object):
def discover(self, include_cloud=True, all_servers=False): def discover(self, include_cloud=True, all_servers=False):
""" Query plex for all servers online. Returns the ones you own in a selectize format """ """ Query plex for all servers online. Returns the ones you own in a selectize format """
# Try to discover localhost server
pms_connect = pmsconnect.PmsConnect(url='http://127.0.0.1:32400')
pms_connect.request_handler.timeout = 1
identity = pms_connect.get_server_identity(log=False)
local_machine_identifier = identity.get('machine_identifier')
local_server = {'httpsRequired': '0',
'clientIdentifier': local_machine_identifier,
'label': 'Local',
'ip': '127.0.0.1',
'port': '32400',
'uri': 'http://127.0.0.1:32400',
'local': '1',
'value': '127.0.0.1:32400',
'is_cloud': False
}
servers = self.get_plextv_resources(include_https=True, output_format='xml') servers = self.get_plextv_resources(include_https=True, output_format='xml')
clean_servers = [] clean_servers = []
@ -725,6 +742,12 @@ class PlexTV(object):
helpers.get_xml_attr(c, 'local') == '0': helpers.get_xml_attr(c, 'local') == '0':
continue continue
if helpers.get_xml_attr(d, 'clientIdentifier') == local_machine_identifier:
local_server['httpsRequired'] = helpers.get_xml_attr(d, 'httpsRequired')
local_server['label'] = helpers.get_xml_attr(d, 'name')
clean_servers.append(local_server)
local_machine_identifier = None
server = {'httpsRequired': '1' if is_cloud else helpers.get_xml_attr(d, 'httpsRequired'), server = {'httpsRequired': '1' if is_cloud else helpers.get_xml_attr(d, 'httpsRequired'),
'clientIdentifier': helpers.get_xml_attr(d, 'clientIdentifier'), 'clientIdentifier': helpers.get_xml_attr(d, 'clientIdentifier'),
'label': helpers.get_xml_attr(d, 'name'), 'label': helpers.get_xml_attr(d, 'name'),
@ -732,11 +755,16 @@ class PlexTV(object):
'port': helpers.get_xml_attr(c, 'port'), 'port': helpers.get_xml_attr(c, 'port'),
'uri': helpers.get_xml_attr(c, 'uri'), 'uri': helpers.get_xml_attr(c, 'uri'),
'local': helpers.get_xml_attr(c, 'local'), 'local': helpers.get_xml_attr(c, 'local'),
'value': helpers.get_xml_attr(c, 'address'), 'value': helpers.get_xml_attr(c, 'address') + ':' + helpers.get_xml_attr(c, 'port'),
'is_cloud': is_cloud 'is_cloud': is_cloud
} }
clean_servers.append(server) clean_servers.append(server)
if local_machine_identifier:
clean_servers.append(local_server)
clean_servers.sort(key=lambda s: (s['label'], -int(s['local']), s['ip']))
return clean_servers return clean_servers
def get_plex_downloads(self): def get_plex_downloads(self):

View file

@ -2193,7 +2193,7 @@ class PmsConnect(object):
return server_info return server_info
def get_server_identity(self): def get_server_identity(self, log=True):
""" """
Return the local machine identity. Return the local machine identity.
@ -2204,6 +2204,7 @@ class PmsConnect(object):
try: try:
xml_head = identity.getElementsByTagName('MediaContainer') xml_head = identity.getElementsByTagName('MediaContainer')
except Exception as e: except Exception as e:
if log:
logger.warn(u"Tautulli Pmsconnect :: Unable to parse XML for get_local_server_identity: %s." % e) logger.warn(u"Tautulli Pmsconnect :: Unable to parse XML for get_local_server_identity: %s." % e)
return {} return {}

View file

@ -110,6 +110,7 @@ class WebInterface(object):
"pms_is_cloud": plexpy.CONFIG.PMS_IS_CLOUD, "pms_is_cloud": plexpy.CONFIG.PMS_IS_CLOUD,
"pms_token": plexpy.CONFIG.PMS_TOKEN, "pms_token": plexpy.CONFIG.PMS_TOKEN,
"pms_uuid": plexpy.CONFIG.PMS_UUID, "pms_uuid": plexpy.CONFIG.PMS_UUID,
"pms_name": plexpy.CONFIG.PMS_NAME,
"logging_ignore_interval": plexpy.CONFIG.LOGGING_IGNORE_INTERVAL "logging_ignore_interval": plexpy.CONFIG.LOGGING_IGNORE_INTERVAL
} }
@ -2802,6 +2803,7 @@ class WebInterface(object):
"pms_url_manual": checked(plexpy.CONFIG.PMS_URL_MANUAL), "pms_url_manual": checked(plexpy.CONFIG.PMS_URL_MANUAL),
"pms_uuid": plexpy.CONFIG.PMS_UUID, "pms_uuid": plexpy.CONFIG.PMS_UUID,
"pms_web_url": plexpy.CONFIG.PMS_WEB_URL, "pms_web_url": plexpy.CONFIG.PMS_WEB_URL,
"pms_name": plexpy.CONFIG.PMS_NAME,
"date_format": plexpy.CONFIG.DATE_FORMAT, "date_format": plexpy.CONFIG.DATE_FORMAT,
"time_format": plexpy.CONFIG.TIME_FORMAT, "time_format": plexpy.CONFIG.TIME_FORMAT,
"week_start_monday": checked(plexpy.CONFIG.WEEK_START_MONDAY), "week_start_monday": checked(plexpy.CONFIG.WEEK_START_MONDAY),