diff --git a/data/interfaces/default/base.html b/data/interfaces/default/base.html index 96be3871..23c11539 100644 --- a/data/interfaces/default/base.html +++ b/data/interfaces/default/base.html @@ -56,6 +56,11 @@ % else:
  • % endif + % if title=="Users": +
  • + % else: +
  • + % endif % if title=="Log":
  • % else: @@ -83,6 +88,9 @@ $(document).ready(function() { $('#history').tooltip(); }); + $(document).ready(function() { + $('#users').tooltip(); + }); $(document).ready(function() { $('#logs').tooltip(); }); diff --git a/data/interfaces/default/history.html b/data/interfaces/default/history.html index 3556326e..49708b90 100644 --- a/data/interfaces/default/history.html +++ b/data/interfaces/default/history.html @@ -125,7 +125,7 @@ "sPaginationType": "bootstrap", "processing": false, "serverSide": true, - "pageLength": 25, + "pageLength": 10, "order": [ 1, 'desc'], "ajax": { "url": "getHistory.json" diff --git a/data/interfaces/default/info.html b/data/interfaces/default/info.html index eefb9e76..5718317f 100644 --- a/data/interfaces/default/info.html +++ b/data/interfaces/default/info.html @@ -152,11 +152,13 @@ <%def name="javascriptIncludes()"> - % if metadata['type'] == 'movie': - + % if metadata: + % if metadata['type'] == 'movie': + + % endif % endif diff --git a/data/interfaces/default/users.html b/data/interfaces/default/users.html new file mode 100644 index 00000000..910ebbf6 --- /dev/null +++ b/data/interfaces/default/users.html @@ -0,0 +1,125 @@ +<%inherit file="base.html"/> +<%! + from plexpy import helpers +%> + +<%def name="headIncludes()"> + + + +<%def name="body()"> +
    +
    +
    +
    +
    +

    Users

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + +
    User Last Seen Last Known IP Total Plays
    +
    +
    +
    + +
    + + + +<%def name="javascriptIncludes()"> + + + + + + diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 2a4ac52d..03b8001f 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -80,6 +80,105 @@ class WebInterface(object): return serve_template(templatename="history.html", title="History", date_format=date_format, time_format=time_format) + @cherrypy.expose + def users(self): + return serve_template(templatename="users.html", title="Users") + + @cherrypy.expose + def get_user_list(self, start=0, length=100, **kwargs): + start = int(start) + length = int(length) + filtered = [] + totalcount = 0 + search_value = "" + search_regex = "" + order_column = 1 + order_dir = "desc" + + if 'order[0][dir]' in kwargs: + order_dir = kwargs.get('order[0][dir]', "desc") + + if 'order[0][column]' in kwargs: + order_column = kwargs.get('order[0][column]', "1") + + if 'search[value]' in kwargs: + search_value = kwargs.get('search[value]', "") + + if 'search[regex]' in kwargs: + search_regex = kwargs.get('search[regex]', "") + + sortcolumn = 'user' + if order_column == '2': + sortcolumn = 'time' + elif order_column == '3': + sortcolumn = 'ip_address' + elif order_column == '4': + sortcolumn = 'plays' + + myDB = db.DBConnection() + db_table = db.DBConnection().get_history_table_name() + + if search_value == "": + query = 'SELECT COUNT(title) as plays, user, time, \ + SUM(time) as timeTotal, SUM(stopped) as stoppedTotal, \ + SUM(paused_counter) as paused_counterTotal, platform, \ + ip_address, xml \ + from %s GROUP by user ORDER by %s COLLATE NOCASE %s' % (db_table, sortcolumn, order_dir) + filtered = myDB.select(query) + totalcount = len(filtered) + else: + query = 'SELECT COUNT(title) as plays, user, time, \ + SUM(time) as timeTotal, SUM(stopped) as stoppedTotal, \ + SUM(paused_counter) as paused_counterTotal, platform, \ + ip_address, xml \ + from ' + db_table + ' WHERE user LIKE "%' + search_value + '%" \ + GROUP by user' + ' ORDER by %s COLLATE NOCASE %s' % (sortcolumn, order_dir) + filtered = myDB.select(query) + totalcount = myDB.select('SELECT COUNT(*) from %s' % db_table)[0][0] + + users = filtered[start:(start + length)] + rows = [] + for item in users: + row = {"plays": item['plays'], + "time": item['time'], + "user": item["user"], + "timeTotal": item["timeTotal"], + "ip_address": item["ip_address"], + "stoppedTotal": item["stoppedTotal"], + "paused_counterTotal": item["paused_counterTotal"], + "platform": item["platform"] + } + + try: + xml_parse = minidom.parseString(helpers.latinToAscii(item['xml'])) + except IOError, e: + logger.warn("Error parsing XML in PlexWatch db: %s" % e) + + xml_head = xml_parse.getElementsByTagName('User') + if not xml_head: + logger.warn("Error parsing XML in PlexWatch db: %s" % e) + + for s in xml_head: + if s.getAttribute('thumb'): + row['user_thumb'] = s.getAttribute('thumb') + else: + row['user_thumb'] = "" + if s.getAttribute('id'): + row['user_id'] = s.getAttribute('id') + else: + row['user_id'] = "" + + rows.append(row) + + dict = {'recordsFiltered': len(filtered), + 'recordsTotal': totalcount, + 'data': rows, + } + s = json.dumps(dict) + + cherrypy.response.headers['Content-type'] = 'application/json' + return s + @cherrypy.expose def checkGithub(self): from plexpy import versioncheck