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
%def>
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>
+
+<%def name="body()">
+
+
+
+
+
+
+
+
+ |
+ User |
+ Last Seen |
+ Last Known IP |
+ Total Plays |
+
+
+
+
+
+
+
+
+
+
+
+%def>
+
+<%def name="javascriptIncludes()">
+
+
+
+
+
+%def>
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