Fix buggy behaviour if user sets friendly name as blank.

Hide "clear logs" button when viewing PMS logs (it has no impact on those).
Start major clean up of classes.
Initial work to allow SSL communication to Plex servers.
This commit is contained in:
Tim 2015-07-04 23:18:06 +02:00
parent 6ecfb9c963
commit e1e3659eb3
6 changed files with 202 additions and 242 deletions

View file

@ -47,8 +47,10 @@ DOCUMENTATION :: END
async: true, async: true,
success: function(data) { success: function(data) {
$("#edit-user-status-message").html(data); $("#edit-user-status-message").html(data);
if ($.trim(friendly_name) !== '') {
$(".set-username").html(friendly_name); $(".set-username").html(friendly_name);
} }
}
}); });
}); });
</script> </script>

View file

@ -22,7 +22,7 @@ from plexpy import helpers
<div class="dashboard-wellheader-no-chevron"> <div class="dashboard-wellheader-no-chevron">
<div class="span9"><h2><i class="fa fa-book"></i> Logs</h2></div> <div class="span9"><h2><i class="fa fa-book"></i> Logs</h2></div>
<div class="span3"> <div class="span3">
<div class="pull-right"> <div class="pull-right" id="clear-logs">
<h5><a id="menu_link_edit" href="clearLogs"><i class="fa fa-trash-o"></i> Clear log</a></h5> <h5><a id="menu_link_edit" href="clearLogs"><i class="fa fa-trash-o"></i> Clear log</a></h5>
</div> </div>
</div> </div>
@ -118,11 +118,12 @@ from plexpy import helpers
} }
$("#plexpy-logs-btn").click(function() { $("#plexpy-logs-btn").click(function() {
$("#clear-logs").show();
LoadPlexPyLogs(); LoadPlexPyLogs();
}); });
$("#plex-logs-btn").click(function() { $("#plex-logs-btn").click(function() {
console.log('clicked da button'); $("#clear-logs").hide();
LoadPlexLogs(); LoadPlexLogs();
}); });

View file

@ -325,7 +325,7 @@ from plexpy import helpers
// Load edit user modal // Load edit user modal
$("#toggle-edit-user-modal").click(function() { $("#toggle-edit-user-modal").click(function() {
$.ajax({ $.ajax({
url: 'edit_user', url: 'edit_user_dialog',
data: {user: '${data['username']}'}, data: {user: '${data['username']}'},
cache: false, cache: false,
async: true, async: true,

View file

@ -946,7 +946,10 @@ class PlexWatch(object):
return output return output
def set_user_friendly_name(self, user=None, friendly_name=None): def set_user_friendly_name(self, user=None, friendly_name=None):
if user and friendly_name: if user:
if friendly_name.strip() == '':
friendly_name = None
myDB = db.DBConnection() myDB = db.DBConnection()
control_value_dict = {"username": user} control_value_dict = {"username": user}

View file

@ -31,6 +31,7 @@ class PmsConnect(object):
self.host = plexpy.CONFIG.PMS_IP self.host = plexpy.CONFIG.PMS_IP
self.port = str(plexpy.CONFIG.PMS_PORT) self.port = str(plexpy.CONFIG.PMS_PORT)
self.token = plexpy.CONFIG.PMS_TOKEN self.token = plexpy.CONFIG.PMS_TOKEN
self.protocol = 'HTTP'
""" """
Return base url of Plex Server. Return base url of Plex Server.
@ -39,11 +40,77 @@ class PmsConnect(object):
""" """
def get_base_url(self): def get_base_url(self):
if self.host != '' and self.port != '': if self.host != '' and self.port != '':
base_url = 'http://' + self.host + ':' + self.port base_url = self.protocol + self.host + ':' + self.port
return base_url return base_url
else: else:
return False return False
"""
Handle the HTTP requests.
Output: object
"""
def make_request(self, uri=None, proto='HTTP', request_type='GET', output_format='xml'):
valid_request_types = ['GET', 'POST', 'PUT', 'DELETE']
if request_type.upper() not in valid_request_types:
logger.debug(u"HTTP request made but unsupported request type given.")
return None
if uri:
if proto.upper() == 'HTTPS':
handler = HTTPSConnection(self.host, self.port, timeout=10)
else:
handler = HTTPConnection(self.host, self.port, timeout=10)
if uri.find('?') > 0:
token_string = '&X-Plex-Token=' + self.token
else:
token_string = '?X-Plex-Token=' + self.token
try:
handler.request(request_type, uri + token_string)
response = handler.getresponse()
request_status = response.status
request_content = response.read()
except IOError, e:
logger.warn(u"Failed to access uri endpoint %s with error %s" % (uri, e))
return None
if request_status == 200:
if output_format == 'dict':
output = helpers.convert_xml_to_dict(request_content)
elif output_format == 'json':
output = helpers.convert_xml_to_json(request_content)
elif output_format == 'xml':
output = self.parse_xml(request_content)
else:
output = request_content
return output
else:
logger.warn(u"Failed to access uri endpoint %s. Status code %r" % (uri, request_status))
return []
else:
logger.debug(u"HTTP request made but no enpoint given.")
return None
def parse_xml(self, unparsed=None):
if unparsed:
try:
xml_parse = minidom.parseString(unparsed)
return xml_parse
except Exception, e:
logger.warn("Error parsing XML for Plex recently added: %s" % e)
return []
except:
logger.warn("Error parsing XML for Plex recently added.")
return []
else:
logger.warn("XML parse request made but no data received.")
return []
""" """
Return current sessions. Return current sessions.
@ -52,30 +119,13 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_sessions(self, output_format=''): def get_sessions(self, output_format=''):
url_command = '/status/sessions' uri = '/status/sessions'
http_handler = HTTPConnection(self.host, self.port, timeout=10) request = self.make_request(uri=uri,
proto=self.protocol,
request_type='GET',
output_format=output_format)
try: return request
http_handler.request("GET", url_command + '?X-Plex-Token=' + self.token)
response = http_handler.getresponse()
request_status = response.status
request_content = response.read()
except IOError, e:
logger.warn(u"Failed to access sessions. %s" % e)
return None
if request_status == 200:
if output_format == 'dict':
output = helpers.convert_xml_to_dict(request_content)
elif output_format == 'json':
output = helpers.convert_xml_to_json(request_content)
else:
output = request_content
else:
logger.warn(u"Failed to access sessions. Status code %r" % request_status)
return None
return output
""" """
Return metadata for request item. Return metadata for request item.
@ -86,30 +136,13 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_metadata(self, rating_key='', output_format=''): def get_metadata(self, rating_key='', output_format=''):
url_command = '/library/metadata/' + rating_key uri = '/library/metadata/' + rating_key
http_handler = HTTPConnection(self.host, self.port, timeout=10) request = self.make_request(uri=uri,
proto=self.protocol,
request_type='GET',
output_format=output_format)
try: return request
http_handler.request("GET", url_command + '?X-Plex-Token=' + self.token)
response = http_handler.getresponse()
request_status = response.status
request_content = response.read()
except IOError, e:
logger.warn(u"Failed to access metadata. %s" % e)
return None
if request_status == 200:
if output_format == 'dict':
output = helpers.convert_xml_to_dict(request_content)
elif output_format == 'json':
output = helpers.convert_xml_to_json(request_content)
else:
output = request_content
else:
logger.warn(u"Failed to access metadata. Status code %r" % request_status)
return None
return output
""" """
Return list of recently added items. Return list of recently added items.
@ -120,30 +153,13 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_recently_added(self, count='0', output_format=''): def get_recently_added(self, count='0', output_format=''):
url_command = '/library/recentlyAdded?X-Plex-Container-Start=0&X-Plex-Container-Size=' + count uri = '/library/recentlyAdded?X-Plex-Container-Start=0&X-Plex-Container-Size=' + count
http_handler = HTTPConnection(self.host, self.port, timeout=10) request = self.make_request(uri=uri,
proto=self.protocol,
request_type='GET',
output_format=output_format)
try: return request
http_handler.request("GET", url_command + '&X-Plex-Token=' + self.token)
response = http_handler.getresponse()
request_status = response.status
request_content = response.read()
except IOError, e:
logger.warn(u"Failed to access recently added items. %s" % e)
return None
if request_status == 200:
if output_format == 'dict':
output = helpers.convert_xml_to_dict(request_content)
elif output_format == 'json':
output = helpers.convert_xml_to_json(request_content)
else:
output = request_content
else:
logger.warn(u"Failed to access recently added. Status code %r" % request_status)
return None
return output
""" """
Return list of episodes in requested season. Return list of episodes in requested season.
@ -154,30 +170,13 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_episode_list(self, rating_key='', output_format=''): def get_episode_list(self, rating_key='', output_format=''):
url_command = '/library/metadata/' + rating_key + '/children' uri = '/library/metadata/' + rating_key + '/children'
http_handler = HTTPConnection(self.host, self.port, timeout=10) request = self.make_request(uri=uri,
proto=self.protocol,
request_type='GET',
output_format=output_format)
try: return request
http_handler.request("GET", url_command + '?X-Plex-Token=' + self.token)
response = http_handler.getresponse()
request_status = response.status
request_content = response.read()
except IOError, e:
logger.warn(u"Failed to access metadata. %s" % e)
return None
if request_status == 200:
if output_format == 'dict':
output = helpers.convert_xml_to_dict(request_content)
elif output_format == 'json':
output = helpers.convert_xml_to_json(request_content)
else:
output = request_content
else:
logger.warn(u"Failed to access metadata. Status code %r" % request_status)
return None
return output
""" """
Return list of local servers. Return list of local servers.
@ -187,30 +186,13 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_server_list(self, output_format=''): def get_server_list(self, output_format=''):
url_command = '/servers' uri = '/servers'
http_handler = HTTPConnection(self.host, self.port, timeout=10) request = self.make_request(uri=uri,
proto=self.protocol,
request_type='GET',
output_format=output_format)
try: return request
http_handler.request("GET", url_command + '?X-Plex-Token=' + self.token)
response = http_handler.getresponse()
request_status = response.status
request_content = response.read()
except IOError, e:
logger.warn(u"Failed to access metadata. %s" % e)
return None
if request_status == 200:
if output_format == 'dict':
output = helpers.convert_xml_to_dict(request_content)
elif output_format == 'json':
output = helpers.convert_xml_to_json(request_content)
else:
output = request_content
else:
logger.warn(u"Failed to access metadata. Status code %r" % request_status)
return None
return output
""" """
Return the local servers preferences. Return the local servers preferences.
@ -220,30 +202,13 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_server_prefs(self, output_format=''): def get_server_prefs(self, output_format=''):
url_command = '/:/prefs' uri = '/:/prefs'
http_handler = HTTPConnection(self.host, self.port, timeout=10) request = self.make_request(uri=uri,
proto=self.protocol,
request_type='GET',
output_format=output_format)
try: return request
http_handler.request("GET", url_command + '?X-Plex-Token=' + self.token)
response = http_handler.getresponse()
request_status = response.status
request_content = response.read()
except IOError, e:
logger.warn(u"Failed to access metadata. %s" % e)
return None
if request_status == 200:
if output_format == 'dict':
output = helpers.convert_xml_to_dict(request_content)
elif output_format == 'json':
output = helpers.convert_xml_to_json(request_content)
else:
output = request_content
else:
logger.warn(u"Failed to access metadata. Status code %r" % request_status)
return None
return output
""" """
Return the local server identity. Return the local server identity.
@ -253,30 +218,46 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_local_server_identity(self, output_format=''): def get_local_server_identity(self, output_format=''):
url_command = '/identity' uri = '/identity'
http_handler = HTTPConnection(self.host, self.port, timeout=10) request = self.make_request(uri=uri,
proto=self.protocol,
request_type='GET',
output_format=output_format)
try: return request
http_handler.request("GET", url_command + '?X-Plex-Token=' + self.token)
response = http_handler.getresponse()
request_status = response.status
request_content = response.read()
except IOError, e:
logger.warn(u"Failed to access Plex server identity. %s" % e)
return None
if request_status == 200: """
if output_format == 'dict': Return sync item details.
output = helpers.convert_xml_to_dict(request_content)
elif output_format == 'json':
output = helpers.convert_xml_to_json(request_content)
else:
output = request_content
else:
logger.warn(u"Failed to access Plex server identity. Status code %r" % request_status)
return None
return output Parameters required: sync_id { unique sync id for item }
Optional parameters: output_format { dict, json }
Output: array
"""
def get_sync_item(self, sync_id=None, output_format=''):
uri = '/sync/items/' + sync_id
request = self.make_request(uri=uri,
proto=self.protocol,
request_type='GET',
output_format=output_format)
return request
"""
Return sync transcode queue.
Optional parameters: output_format { dict, json }
Output: array
"""
def get_sync_transcode_queue(self, output_format=''):
uri = '/sync/transcodeQueue'
request = self.make_request(uri=uri,
proto=self.protocol,
request_type='GET',
output_format=output_format)
return request
""" """
Return processed and validated list of recently added items. Return processed and validated list of recently added items.
@ -286,19 +267,10 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_recently_added_details(self, count='0'): def get_recently_added_details(self, count='0'):
recent = self.get_recently_added(count) recent = self.get_recently_added(count, output_format='xml')
recents_list = [] recents_list = []
try: xml_head = recent.getElementsByTagName('MediaContainer')
xml_parse = minidom.parseString(recent)
except Exception, e:
logger.warn("Error parsing XML for Plex recently added: %s" % e)
return None
except:
logger.warn("Error parsing XML for Plex recently added.")
return None
xml_head = xml_parse.getElementsByTagName('MediaContainer')
if not xml_head: if not xml_head:
logger.warn("Error parsing XML for Plex recently added.") logger.warn("Error parsing XML for Plex recently added.")
return None return None
@ -354,19 +326,10 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_metadata_details(self, rating_key=''): def get_metadata_details(self, rating_key=''):
metadata = self.get_metadata(rating_key) metadata = self.get_metadata(rating_key, output_format='xml')
metadata_list = [] metadata_list = []
try: xml_head = metadata.getElementsByTagName('MediaContainer')
xml_parse = minidom.parseString(metadata)
except Exception, e:
logger.warn("Error parsing XML for Plex metadata: %s" % e)
return None
except:
logger.warn("Error parsing XML for Plex metadata.")
return None
xml_head = xml_parse.getElementsByTagName('MediaContainer')
if not xml_head: if not xml_head:
logger.warn("Error parsing XML for Plex metadata.") logger.warn("Error parsing XML for Plex metadata.")
return None return None
@ -532,19 +495,10 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_current_activity(self): def get_current_activity(self):
session_data = self.get_sessions() session_data = self.get_sessions(output_format='xml')
session_list = [] session_list = []
try: xml_head = session_data.getElementsByTagName('MediaContainer')
xml_parse = minidom.parseString(session_data)
except Exception, e:
logger.warn("Error parsing XML for Plex session data: %s" % e)
return None
except:
logger.warn("Error parsing XML for Plex session data.")
return None
xml_head = xml_parse.getElementsByTagName('MediaContainer')
if not xml_head: if not xml_head:
logger.warn("Error parsing XML for Plex session data.") logger.warn("Error parsing XML for Plex session data.")
return None return None
@ -764,19 +718,10 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_season_children(self, rating_key=''): def get_season_children(self, rating_key=''):
episode_data = self.get_episode_list(rating_key) episode_data = self.get_episode_list(rating_key, output_format='xml')
episode_list = [] episode_list = []
try: xml_head = episode_data.getElementsByTagName('MediaContainer')
xml_parse = minidom.parseString(episode_data)
except Exception, e:
logger.warn("Error parsing XML for Plex session data: %s" % e)
return None
except:
logger.warn("Error parsing XML for Plex session data.")
return None
xml_head = xml_parse.getElementsByTagName('MediaContainer')
if not xml_head: if not xml_head:
logger.warn("Error parsing XML for Plex session data.") logger.warn("Error parsing XML for Plex session data.")
return None return None
@ -813,18 +758,9 @@ class PmsConnect(object):
Output: array Output: array
""" """
def get_servers_info(self): def get_servers_info(self):
recent = self.get_server_list() recent = self.get_server_list(output_format='xml')
try: xml_head = recent.getElementsByTagName('Server')
xml_parse = minidom.parseString(recent)
except Exception, e:
logger.warn("Error parsing XML for Plex server prefs: %s" % e)
return None
except:
logger.warn("Error parsing XML for Plex server prefs.")
return None
xml_head = xml_parse.getElementsByTagName('Server')
if not xml_head: if not xml_head:
logger.warn("Error parsing XML for Plex server prefs.") logger.warn("Error parsing XML for Plex server prefs.")
return None return None
@ -848,18 +784,9 @@ class PmsConnect(object):
Output: dict Output: dict
""" """
def get_server_identity(self): def get_server_identity(self):
identity = self.get_local_server_identity() identity = self.get_local_server_identity(output_format='xml')
try: xml_head = identity.getElementsByTagName('MediaContainer')
xml_parse = minidom.parseString(identity)
except Exception, e:
logger.warn("Error parsing XML for Plex server identity: %s" % e)
return None
except:
logger.warn("Error parsing XML for Plex server identity.")
return None
xml_head = xml_parse.getElementsByTagName('MediaContainer')
if not xml_head: if not xml_head:
logger.warn("Error parsing XML for Plex server identity.") logger.warn("Error parsing XML for Plex server identity.")
return None return None

View file

@ -116,17 +116,8 @@ class WebInterface(object):
return serve_template(templatename="user.html", title="User", data=user_details) return serve_template(templatename="user.html", title="User", data=user_details)
@cherrypy.expose @cherrypy.expose
def edit_user(self, user=None, friendly_name=None, **kwargs): def edit_user_dialog(self, user=None, **kwargs):
if user and friendly_name: if user:
try:
plex_watch = plexwatch.PlexWatch()
plex_watch.set_user_friendly_name(user, friendly_name)
status_message = "Successfully updated user."
return status_message
except:
status_message = "Failed to updated user."
return status_message
elif user and not friendly_name:
try: try:
plex_watch = plexwatch.PlexWatch() plex_watch = plexwatch.PlexWatch()
result = {'user': user, result = {'user': user,
@ -143,6 +134,18 @@ class WebInterface(object):
else: else:
return serve_template(templatename="edit_user.html", title="Edit User", data=user, status_message='Unknown error.') return serve_template(templatename="edit_user.html", title="Edit User", data=user, status_message='Unknown error.')
@cherrypy.expose
def edit_user(self, user=None, friendly_name=None, **kwargs):
if user:
try:
plex_watch = plexwatch.PlexWatch()
plex_watch.set_user_friendly_name(user, friendly_name)
status_message = "Successfully updated user."
return status_message
except:
status_message = "Failed to update user."
return status_message
@cherrypy.expose @cherrypy.expose
def get_stream_data(self, row_id=None, user=None, **kwargs): def get_stream_data(self, row_id=None, user=None, **kwargs):
@ -926,3 +929,27 @@ class WebInterface(object):
cherrypy.response.headers['Content-type'] = 'application/json' cherrypy.response.headers['Content-type'] = 'application/json'
return json.dumps(output) return json.dumps(output)
@cherrypy.expose
def get_sync_item(self, sync_id, **kwargs):
pms_connect = pmsconnect.PmsConnect()
result = pms_connect.get_sync_item(sync_id, output_format='json')
if result:
cherrypy.response.headers['Content-type'] = 'application/json'
return result
else:
logger.warn('Unable to retrieve data.')
@cherrypy.expose
def get_sync_transcode_queue(self, **kwargs):
pms_connect = pmsconnect.PmsConnect()
result = pms_connect.get_sync_transcode_queue(output_format='json')
if result:
cherrypy.response.headers['Content-type'] = 'application/json'
return result
else:
logger.warn('Unable to retrieve data.')