mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-11 15:56:07 -07:00
Try to write the plex_users table during config save.
Only load tables on user info page if we need to. Make sure we don't pass user definable input directly into our queries. Neaten some code.
This commit is contained in:
parent
0a170c20e6
commit
12331e1c4c
3 changed files with 82 additions and 55 deletions
|
@ -42,7 +42,7 @@ from plexpy import helpers
|
||||||
<ul class="user-info-nav">
|
<ul class="user-info-nav">
|
||||||
<li class="active"><a href="#profile" data-toggle="tab">Profile</a></li>
|
<li class="active"><a href="#profile" data-toggle="tab">Profile</a></li>
|
||||||
<li><a id="ip-tab-btn" href="#userAddresses" data-toggle="tab">IP Addresses</a></li>
|
<li><a id="ip-tab-btn" href="#userAddresses" data-toggle="tab">IP Addresses</a></li>
|
||||||
<li><a href="#userHistory" data-toggle="tab">History</a></li>
|
<li><a id="history-tab-btn" href="#userHistory" data-toggle="tab">History</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -246,6 +246,7 @@ from plexpy import helpers
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$( "#history-tab-btn" ).one( "click", function() {
|
||||||
// Build watch history table
|
// Build watch history table
|
||||||
history_table_options.ajax = {
|
history_table_options.ajax = {
|
||||||
"url": "get_history",
|
"url": "get_history",
|
||||||
|
@ -255,7 +256,9 @@ from plexpy import helpers
|
||||||
}
|
}
|
||||||
history_table = $('#history_table').DataTable(history_table_options);
|
history_table = $('#history_table').DataTable(history_table_options);
|
||||||
history_table.column(2).visible(false); // Hide the title column
|
history_table.column(2).visible(false); // Hide the title column
|
||||||
|
});
|
||||||
|
|
||||||
|
$( "#ip-tab-btn" ).one( "click", function() {
|
||||||
// Build user IP table
|
// Build user IP table
|
||||||
user_ip_table_options.ajax = {
|
user_ip_table_options.ajax = {
|
||||||
"url": "get_user_ips",
|
"url": "get_user_ips",
|
||||||
|
@ -264,6 +267,7 @@ from plexpy import helpers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
user_ip_table = $('#user_ip_table').DataTable(user_ip_table_options);
|
user_ip_table = $('#user_ip_table').DataTable(user_ip_table_options);
|
||||||
|
});
|
||||||
|
|
||||||
// Load user gravatar image
|
// Load user gravatar image
|
||||||
$.ajax({
|
$.ajax({
|
||||||
|
|
|
@ -67,7 +67,8 @@ class PlexWatch(object):
|
||||||
t = self.get_history_table_name()
|
t = self.get_history_table_name()
|
||||||
|
|
||||||
columns = [t + '.id',
|
columns = [t + '.id',
|
||||||
'(case when plexpy_users.friendly_name is null then ' + t + '.user else plexpy_users.friendly_name end) as friendly_name',
|
'(case when plexpy_users.friendly_name is null then ' + t +
|
||||||
|
'.user else plexpy_users.friendly_name end) as friendly_name',
|
||||||
t + '.time',
|
t + '.time',
|
||||||
t + '.ip_address',
|
t + '.ip_address',
|
||||||
'COUNT(' + t + '.title) as plays',
|
'COUNT(' + t + '.title) as plays',
|
||||||
|
@ -219,7 +220,8 @@ class PlexWatch(object):
|
||||||
|
|
||||||
columns = [t + '.id',
|
columns = [t + '.id',
|
||||||
t + '.time as date',
|
t + '.time as date',
|
||||||
'(case when plexpy_users.friendly_name is null then ' + t + '.user else plexpy_users.friendly_name end) as friendly_name',
|
'(case when plexpy_users.friendly_name is null then ' + t +
|
||||||
|
'.user else plexpy_users.friendly_name end) as friendly_name',
|
||||||
t + '.platform',
|
t + '.platform',
|
||||||
t + '.ip_address',
|
t + '.ip_address',
|
||||||
t + '.title',
|
t + '.title',
|
||||||
|
@ -338,8 +340,8 @@ class PlexWatch(object):
|
||||||
myDB = db.DBConnection()
|
myDB = db.DBConnection()
|
||||||
|
|
||||||
if row_id:
|
if row_id:
|
||||||
query = 'SELECT xml from %s where id = %s' % (self.get_history_table_name(), row_id)
|
query = 'SELECT xml from %s where id = ?' % (self.get_history_table_name())
|
||||||
xml = myDB.select_single(query)
|
xml = myDB.select_single(query, args=[row_id])
|
||||||
xml_data = helpers.latinToAscii(xml)
|
xml_data = helpers.latinToAscii(xml)
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
@ -419,13 +421,13 @@ class PlexWatch(object):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if user:
|
if user:
|
||||||
query = 'SELECT time, user, xml FROM %s WHERE user = "%s" ORDER BY time DESC LIMIT %s' % \
|
query = 'SELECT time, user, xml FROM %s WHERE user = ? ORDER BY time DESC LIMIT ?' % \
|
||||||
(self.get_history_table_name(), user, limit)
|
(self.get_history_table_name())
|
||||||
xml = myDB.select(query)
|
xml = myDB.select(query, args=[user, limit])
|
||||||
else:
|
else:
|
||||||
query = 'SELECT time, user, xml FROM %s ORDER BY time DESC LIMIT %s' % \
|
query = 'SELECT time, user, xml FROM %s ORDER BY time DESC LIMIT ?' % \
|
||||||
(self.get_history_table_name(), limit)
|
(self.get_history_table_name())
|
||||||
xml = myDB.select(query)
|
xml = myDB.select(query, args=[limit])
|
||||||
except:
|
except:
|
||||||
logger.warn("Unable to open PlexWatch database.")
|
logger.warn("Unable to open PlexWatch database.")
|
||||||
return None
|
return None
|
||||||
|
@ -471,19 +473,20 @@ class PlexWatch(object):
|
||||||
|
|
||||||
for days in time_queries:
|
for days in time_queries:
|
||||||
if days > 0:
|
if days > 0:
|
||||||
where = 'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-%s days", "localtime") ' \
|
query = 'SELECT (SUM(stopped - time) - ' \
|
||||||
'AND user = "%s"' % (days, user)
|
'SUM(CASE WHEN paused_counter is null THEN 0 ELSE paused_counter END)) as total_time, ' \
|
||||||
else:
|
|
||||||
where = 'WHERE user = "%s"' % user
|
|
||||||
|
|
||||||
try:
|
|
||||||
query = 'SELECT (SUM(stopped - time) - SUM(CASE WHEN paused_counter is null THEN 0 ELSE paused_counter END)) as total_time, ' \
|
|
||||||
'COUNT(id) AS total_plays ' \
|
'COUNT(id) AS total_plays ' \
|
||||||
'FROM %s %s' % (self.get_history_table_name(), where)
|
'FROM %s ' \
|
||||||
result = myDB.select(query)
|
'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-%s days", "localtime") ' \
|
||||||
except:
|
'AND user = ?' % (self.get_history_table_name(), days)
|
||||||
logger.warn("Unable to open PlexWatch database.")
|
result = myDB.select(query, args=[user])
|
||||||
return None
|
else:
|
||||||
|
query = 'SELECT (SUM(stopped - time) - ' \
|
||||||
|
'SUM(CASE WHEN paused_counter is null THEN 0 ELSE paused_counter END)) as total_time, ' \
|
||||||
|
'COUNT(id) AS total_plays ' \
|
||||||
|
'FROM %s ' \
|
||||||
|
'WHERE user = ?' % self.get_history_table_name()
|
||||||
|
result = myDB.select(query, args=[user])
|
||||||
|
|
||||||
for item in result:
|
for item in result:
|
||||||
if item[0]:
|
if item[0]:
|
||||||
|
@ -510,11 +513,11 @@ class PlexWatch(object):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
query = 'SELECT platform, COUNT(platform) as platform_count, xml ' \
|
query = 'SELECT platform, COUNT(platform) as platform_count, xml ' \
|
||||||
'FROM %s ' \
|
'FROM grouped ' \
|
||||||
'WHERE user = "%s" ' \
|
'WHERE user = ? ' \
|
||||||
'GROUP BY platform ' \
|
'GROUP BY platform ' \
|
||||||
'ORDER BY platform_count DESC' % (self.get_history_table_name(), user)
|
'ORDER BY platform_count DESC'
|
||||||
result = myDB.select(query)
|
result = myDB.select(query, args=[user])
|
||||||
except:
|
except:
|
||||||
logger.warn("Unable to open PlexWatch database.")
|
logger.warn("Unable to open PlexWatch database.")
|
||||||
return None
|
return None
|
||||||
|
@ -553,9 +556,9 @@ class PlexWatch(object):
|
||||||
try:
|
try:
|
||||||
query = 'SELECT xml ' \
|
query = 'SELECT xml ' \
|
||||||
'FROM %s ' \
|
'FROM %s ' \
|
||||||
'WHERE user = "%s" ' \
|
'WHERE user = ? ' \
|
||||||
'ORDER BY id DESC LIMIT 1' % (self.get_history_table_name(), user)
|
'ORDER BY id DESC LIMIT 1' % self.get_history_table_name()
|
||||||
result = myDB.select_single(query)
|
result = myDB.select_single(query, args=[user])
|
||||||
except:
|
except:
|
||||||
logger.warn("Unable to open PlexWatch database.")
|
logger.warn("Unable to open PlexWatch database.")
|
||||||
return None
|
return None
|
||||||
|
@ -595,9 +598,11 @@ class PlexWatch(object):
|
||||||
if 'top_tv' in stat:
|
if 'top_tv' in stat:
|
||||||
top_tv = []
|
top_tv = []
|
||||||
try:
|
try:
|
||||||
query = 'SELECT orig_title, COUNT(orig_title) as total_plays, grandparentRatingKey, MAX(time) as last_watch, xml ' \
|
query = 'SELECT orig_title, COUNT(orig_title) as total_plays, ' \
|
||||||
|
'grandparentRatingKey, MAX(time) as last_watch, xml ' \
|
||||||
'FROM %s ' \
|
'FROM %s ' \
|
||||||
'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-%s days", "localtime") ' \
|
'WHERE datetime(stopped, "unixepoch", "localtime") ' \
|
||||||
|
'>= datetime("now", "-%s days", "localtime") ' \
|
||||||
'AND episode != "" ' \
|
'AND episode != "" ' \
|
||||||
'GROUP BY orig_title ' \
|
'GROUP BY orig_title ' \
|
||||||
'ORDER BY total_plays DESC LIMIT 10' % (self.get_history_table_name(), time_range)
|
'ORDER BY total_plays DESC LIMIT 10' % (self.get_history_table_name(), time_range)
|
||||||
|
@ -640,10 +645,12 @@ class PlexWatch(object):
|
||||||
query = 'SELECT orig_title, COUNT(DISTINCT user) as users_watched, grandparentRatingKey, ' \
|
query = 'SELECT orig_title, COUNT(DISTINCT user) as users_watched, grandparentRatingKey, ' \
|
||||||
'MAX(time) as last_watch, xml, COUNT(id) as total_plays ' \
|
'MAX(time) as last_watch, xml, COUNT(id) as total_plays ' \
|
||||||
'FROM %s ' \
|
'FROM %s ' \
|
||||||
'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-%s days", "localtime") ' \
|
'WHERE datetime(stopped, "unixepoch", "localtime") ' \
|
||||||
|
'>= datetime("now", "-%s days", "localtime") ' \
|
||||||
'AND episode != "" ' \
|
'AND episode != "" ' \
|
||||||
'GROUP BY orig_title ' \
|
'GROUP BY orig_title ' \
|
||||||
'ORDER BY users_watched DESC, total_plays DESC LIMIT 10' % (self.get_history_table_name(), time_range)
|
'ORDER BY users_watched DESC, total_plays DESC ' \
|
||||||
|
'LIMIT 10' % (self.get_history_table_name(), time_range)
|
||||||
result = myDB.select(query)
|
result = myDB.select(query)
|
||||||
except:
|
except:
|
||||||
logger.warn("Unable to open PlexWatch database.")
|
logger.warn("Unable to open PlexWatch database.")
|
||||||
|
@ -682,11 +689,13 @@ class PlexWatch(object):
|
||||||
top_users = []
|
top_users = []
|
||||||
try:
|
try:
|
||||||
s = self.get_history_table_name()
|
s = self.get_history_table_name()
|
||||||
query = 'SELECT user, (case when friendly_name is null then user else friendly_name end) as friendly_name,' \
|
query = 'SELECT user, ' \
|
||||||
|
'(case when friendly_name is null then user else friendly_name end) as friendly_name,' \
|
||||||
'COUNT(' + s + '.id) as total_plays, MAX(time) as last_watch ' \
|
'COUNT(' + s + '.id) as total_plays, MAX(time) as last_watch ' \
|
||||||
'FROM ' + s + ' ' \
|
'FROM ' + s + ' ' \
|
||||||
'LEFT OUTER JOIN plexpy_users ON ' + s + '.user = plexpy_users.username ' \
|
'LEFT OUTER JOIN plexpy_users ON ' + s + '.user = plexpy_users.username ' \
|
||||||
'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-' + time_range + ' days", "localtime") '\
|
'WHERE datetime(stopped, "unixepoch", "localtime") >= ' \
|
||||||
|
'datetime("now", "-' + time_range + ' days", "localtime") '\
|
||||||
'GROUP BY ' + s + '.user ' \
|
'GROUP BY ' + s + '.user ' \
|
||||||
'ORDER BY total_plays DESC LIMIT 10'
|
'ORDER BY total_plays DESC LIMIT 10'
|
||||||
result = myDB.select(query)
|
result = myDB.select(query)
|
||||||
|
@ -713,7 +722,8 @@ class PlexWatch(object):
|
||||||
try:
|
try:
|
||||||
query = 'SELECT platform, COUNT(id) as total_plays, MAX(time) as last_watch, xml ' \
|
query = 'SELECT platform, COUNT(id) as total_plays, MAX(time) as last_watch, xml ' \
|
||||||
'FROM %s ' \
|
'FROM %s ' \
|
||||||
'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-%s days", "localtime") ' \
|
'WHERE datetime(stopped, "unixepoch", "localtime") ' \
|
||||||
|
'>= datetime("now", "-%s days", "localtime") ' \
|
||||||
'GROUP BY platform ' \
|
'GROUP BY platform ' \
|
||||||
'ORDER BY total_plays DESC' % (self.get_history_table_name(), time_range)
|
'ORDER BY total_plays DESC' % (self.get_history_table_name(), time_range)
|
||||||
result = myDB.select(query)
|
result = myDB.select(query)
|
||||||
|
@ -913,8 +923,8 @@ class PlexWatch(object):
|
||||||
if user:
|
if user:
|
||||||
try:
|
try:
|
||||||
myDB = db.DBConnection()
|
myDB = db.DBConnection()
|
||||||
query = 'select friendly_name FROM plexpy_users WHERE username = "%s"' % user
|
query = 'select friendly_name FROM plexpy_users WHERE username = ?'
|
||||||
result = myDB.select_single(query)
|
result = myDB.select_single(query, args=[user])
|
||||||
return result
|
return result
|
||||||
except:
|
except:
|
||||||
return user
|
return user
|
||||||
|
@ -940,3 +950,13 @@ class PlexWatch(object):
|
||||||
new_dataset.sort(key=lambda item: item[sort_by_key], reverse=True)
|
new_dataset.sort(key=lambda item: item[sort_by_key], reverse=True)
|
||||||
|
|
||||||
return new_dataset
|
return new_dataset
|
||||||
|
|
||||||
|
|
||||||
|
def check_db_tables():
|
||||||
|
try:
|
||||||
|
myDB = db.DBConnection()
|
||||||
|
query = 'CREATE TABLE IF NOT EXISTS plexpy_users (id INTEGER PRIMARY KEY AUTOINCREMENT, ' \
|
||||||
|
'username TEXT NOT NULL UNIQUE, friendly_name TEXT)'
|
||||||
|
result = myDB.action(query)
|
||||||
|
except:
|
||||||
|
logger.debug(u"Unable to create users table.")
|
||||||
|
|
|
@ -352,6 +352,9 @@ class WebInterface(object):
|
||||||
# Write the config
|
# Write the config
|
||||||
plexpy.CONFIG.write()
|
plexpy.CONFIG.write()
|
||||||
|
|
||||||
|
# Check if we have our users table
|
||||||
|
plexwatch.check_db_tables()
|
||||||
|
|
||||||
# Reconfigure scheduler
|
# Reconfigure scheduler
|
||||||
plexpy.initialize_scheduler()
|
plexpy.initialize_scheduler()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue