diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html index 2b4a8233..383138f4 100644 --- a/data/interfaces/default/settings.html +++ b/data/interfaces/default/settings.html @@ -642,7 +642,7 @@
- +
@@ -650,29 +650,45 @@

Check this if your Plex Server is not on the same local network as Tautulli.

If you have secure connections enabled on your Plex Server, communicate with it securely.

+
+ +
+
+
+ + + + +
+
+
+

+ The server URL that Tautulli will use to connect to your Plex server. Retrieved automatically. +

+

Use the user defined connection details. Do not retrieve the server connection URL automatically.

- +
-
+
@@ -1573,7 +1589,7 @@ $(document).ready(function() { } function preSaveChecks(_callback) { - if ($("#pms_identifier").val() == "") { + if (serverChanged) { verifyServer(); } verifyPMSWebURL(); @@ -1585,7 +1601,7 @@ $(document).ready(function() { // Alert the user that their changes require a restart. function postSaveChecks() { - if (serverChanged || authChanged || httpChanged || directoryChanged) { + if (authChanged || httpChanged || directoryChanged) { $('#restart-modal').modal('show'); } $("#http_hashed_password").val($("#http_hash_password").is(":checked") ? 1 : 0); @@ -1769,9 +1785,8 @@ $(document).ready(function() { $( ".pms-settings" ).change(function() { serverChanged = true; - $("#pms_identifier").val(""); $("#server_changed").prop('checked', true); - verifyServer(); + $("#pms_verify").hide(); }); $('.checkbox-toggle').click(function () { @@ -1841,6 +1856,7 @@ $(document).ready(function() { $('#pms_ssl').val(ssl !== 'undefined' && ssl === 1 ? 1 : 0); $('#pms_is_cloud').val(is_cloud !== 'undefined' && is_cloud === true ? 1 : 0); $('#pms_url_manual').prop('checked', false); + $('#pms_url').val('Please verify your server above to retrieve the URL'); PMSCloudCheck(); } }); @@ -1906,6 +1922,7 @@ $(document).ready(function() { var pms_identifier = $("#pms_identifier").val(); var pms_ssl = $("#pms_ssl").val(); var pms_is_remote = $("#pms_is_remote").val(); + var pms_url_manual = $("#pms_url_manual").is(':checked') ? 1 : 0; if (($("#pms_ip").val() !== '') || ($("#pms_port").val() !== '')) { $("#pms_verify").html('').fadeIn('fast'); @@ -1916,7 +1933,9 @@ $(document).ready(function() { port: pms_port, identifier: pms_identifier, ssl: pms_ssl, - remote: pms_is_remote + remote: pms_is_remote, + manual: pms_url_manual, + get_url: serverChanged }, cache: true, async: true, @@ -1925,13 +1944,20 @@ $(document).ready(function() { $("#pms_verify").html('').fadeIn('fast'); $("#pms_ip_group").addClass("has-error"); }, - success: function (json) { - var machine_identifier = json; - if (machine_identifier) { - $("#pms_identifier").val(machine_identifier); + success: function(xhr, status) { + var result = xhr; + var identifier = result.identifier; + var url = result.url; + if (identifier) { + $("#pms_identifier").val(identifier); + if (url) { + $("#pms_url").val(url); + } $("#pms_verify").html('').fadeIn('fast'); $("#pms_ip_group").removeClass("has-error"); + serverChanged = false; + if (_callback) { _callback(); } @@ -1950,7 +1976,6 @@ $(document).ready(function() { } $('#verify_server_button').on('click', function(){ - $("#pms_identifier").val(""); verifyServer(); }); @@ -1959,6 +1984,13 @@ $(document).ready(function() { $("#pms_web_url").val(pms_web_url || 'https://app.plex.tv/desktop'); } + $('#test_pms_url_button').on('click', function(){ + var pms_url = $.trim($("#pms_url").val()); + if (pms_url.startsWith('http')) { + window.open(pms_url + '/web', '_blank'); + } + }); + $('#test_pms_web_button').on('click', function(){ var pms_web_url = $.trim($("#pms_web_url").val()); window.open(pms_web_url, '_blank'); diff --git a/data/interfaces/default/welcome.html b/data/interfaces/default/welcome.html index a48516f8..2a7cff1c 100644 --- a/data/interfaces/default/welcome.html +++ b/data/interfaces/default/welcome.html @@ -94,7 +94,7 @@
-
@@ -104,12 +104,12 @@
- +
@@ -117,16 +117,16 @@
- + - + Verify
@@ -419,7 +419,8 @@ $(document).ready(function() { port: pms_port, identifier: pms_identifier, ssl: pms_ssl, - remote: pms_is_remote }, + remote: pms_is_remote + }, cache: true, async: true, timeout: 5000, @@ -427,10 +428,11 @@ $(document).ready(function() { $("#pms-verify-status").html(' This is not a Plex Server!'); $('#pms-verify-status').fadeIn('fast'); }, - success: function (json) { - var machine_identifier = json; - if (machine_identifier) { - $("#pms_identifier").val(machine_identifier); + success: function(xhr, status) { + var result = xhr; + var identifier = result.identifier; + if (identifier) { + $("#pms_identifier").val(identifier); $("#pms-verify-status").html(' Server found!'); $('#pms-verify-status').fadeIn('fast'); pms_verified = true; diff --git a/plexpy/plextv.py b/plexpy/plextv.py index 4bc9771e..a941cb78 100644 --- a/plexpy/plextv.py +++ b/plexpy/plextv.py @@ -29,7 +29,7 @@ import pmsconnect import session -def get_server_resources(return_presence=False): +def get_server_resources(return_presence=False, return_server=False, **kwargs): if not return_presence: logger.info(u"Tautulli PlexTV :: Requesting resources for server...") @@ -42,9 +42,15 @@ def get_server_resources(return_presence=False): 'pms_is_remote': plexpy.CONFIG.PMS_IS_REMOTE, 'pms_is_cloud': plexpy.CONFIG.PMS_IS_CLOUD, 'pms_url': plexpy.CONFIG.PMS_URL, - 'pms_url_manual': plexpy.CONFIG.PMS_URL_MANUAL + 'pms_url_manual': plexpy.CONFIG.PMS_URL_MANUAL, + 'pms_identifier': plexpy.CONFIG.PMS_IDENTIFIER } + if kwargs: + server.update(kwargs) + for k in ['pms_ssl', 'pms_is_remote', 'pms_is_cloud', 'pms_url_manual']: + server[k] = int(server[k]) + if server['pms_url_manual'] and server['pms_ssl'] or server['pms_is_cloud']: scheme = 'https' else: @@ -55,7 +61,7 @@ def get_server_resources(return_presence=False): port=server['pms_port']) plex_tv = PlexTV() - result = plex_tv.get_server_connections(pms_identifier=plexpy.CONFIG.PMS_IDENTIFIER, + result = plex_tv.get_server_connections(pms_identifier=server['pms_identifier'], pms_ip=server['pms_ip'], pms_port=server['pms_port'], include_https=server['pms_ssl']) @@ -103,6 +109,9 @@ def get_server_resources(return_presence=False): server['pms_url'] = fallback_url logger.info(u"Tautulli PlexTV :: Using user-defined URL.") + if return_server: + return server + plexpy.CONFIG.process_kwargs(server) plexpy.CONFIG.write() @@ -645,6 +654,7 @@ class PlexTV(object): 'label': helpers.get_xml_attr(d, 'name'), 'ip': helpers.get_xml_attr(c, 'address'), 'port': helpers.get_xml_attr(c, 'port'), + 'uri': helpers.get_xml_attr(c, 'uri'), 'local': helpers.get_xml_attr(c, 'local'), 'value': helpers.get_xml_attr(c, 'address'), 'is_cloud': is_cloud diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 3229ddb7..85f63804 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -2611,6 +2611,7 @@ class WebInterface(object): "pms_ssl": plexpy.CONFIG.PMS_SSL, "pms_is_remote": plexpy.CONFIG.PMS_IS_REMOTE, "pms_is_cloud": plexpy.CONFIG.PMS_IS_CLOUD, + "pms_url": plexpy.CONFIG.PMS_URL, "pms_url_manual": checked(plexpy.CONFIG.PMS_URL_MANUAL), "pms_uuid": plexpy.CONFIG.PMS_UUID, "pms_web_url": plexpy.CONFIG.PMS_WEB_URL, @@ -2812,6 +2813,12 @@ class WebInterface(object): return {'result': 'success', 'message': 'Settings saved.'} + @cherrypy.expose + @cherrypy.tools.json_out() + @requireAuth(member_of("admin")) + def get_server_resources(self, **kwargs): + return plextv.get_server_resources(return_server=True, **kwargs) + @cherrypy.expose @cherrypy.tools.json_out() @requireAuth(member_of("admin")) @@ -3455,7 +3462,8 @@ class WebInterface(object): @cherrypy.tools.json_out() @requireAuth(member_of("admin")) @addtoapi() - def get_server_id(self, hostname=None, port=None, identifier=None, ssl=0, remote=0, **kwargs): + def get_server_id(self, hostname=None, port=None, identifier=None, ssl=0, remote=0, manual=0, + get_url=False, **kwargs): """ Get the PMS server identifier. ``` @@ -3468,7 +3476,8 @@ class WebInterface(object): remote (int): 0 or 1 Returns: - string: The unique PMS identifier + json: + {'identifier': '08u2phnlkdshf890bhdlksghnljsahgleikjfg9t'} ``` """ # Attempt to get the pms_identifier from plex.tv if the server is published @@ -3499,11 +3508,21 @@ class WebInterface(object): xml_head = request.getElementsByTagName('MediaContainer')[0] identifier = xml_head.getAttribute('machineIdentifier') + result = {'identifier': identifier} + if identifier: - return identifier + if get_url == 'true': + server = self.get_server_resources(pms_ip=hostname, + pms_port=port, + pms_ssl=ssl, + pms_is_remote=remote, + pms_url_manual=manual, + pms_identifier=identifier) + result['url'] = server['pms_url'] + return result else: logger.warn('Unable to retrieve the PMS identifier.') - return None + return result @cherrypy.expose @requireAuth(member_of("admin"))