mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-07 05:31:15 -07:00
Improve graph tooltip
One checkbox to group them all Do not cache graph data Fix variable for db in init test Remove superfluous includes Remove superfluous debug logging
This commit is contained in:
parent
c2e9025f9f
commit
838ee5cae9
9 changed files with 28 additions and 78 deletions
|
@ -184,9 +184,10 @@
|
|||
<p class="help-block">Full path and file name of your PlexWatch database.</p>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" id="grouping_global_history" name="grouping_global_history" value="1" ${config['grouping_global_history']}> Global History
|
||||
<p class="help-block">Enable global history grouping.</p>
|
||||
<input type="checkbox" id="grouping_global_history" name="grouping_global_history" value="1" ${config['grouping_global_history']}> Enable Grouping
|
||||
<p class="help-block">Show grouped history data. <a target="_blank" href="https://github.com/ljunkie/plexWatch#list-watched-shows-option---nogrouping-vs-default">More info.</a></p>
|
||||
</div>
|
||||
<!--
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" id="grouping_user_history" name="grouping_user_history" value="1" ${config['grouping_user_history']}> User History
|
||||
<p class="help-block">Enable user history grouping.</p>
|
||||
|
@ -195,6 +196,7 @@
|
|||
<input type="checkbox" id="grouping_charts" name="grouping_charts" value="1" ${config['grouping_charts']}> Charts History
|
||||
<p class="help-block">Enable chart grouping.</p>
|
||||
</div>
|
||||
-->
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -85,6 +85,7 @@ from plexpy import helpers
|
|||
type: 'get',
|
||||
data: { time_range: '30' },
|
||||
dataType: "json",
|
||||
cache: false,
|
||||
success: function(data) {
|
||||
var dateArray = [];
|
||||
for (var i = 0; i < data.categories.length; i++) {
|
||||
|
@ -102,6 +103,7 @@ from plexpy import helpers
|
|||
type: 'get',
|
||||
data: { time_range: '30' },
|
||||
dataType: "json",
|
||||
cache: false,
|
||||
success: function(data) {
|
||||
hc_plays_by_dayofweek_options.xAxis.categories = data.categories;
|
||||
hc_plays_by_dayofweek_options.series = data.series;
|
||||
|
@ -114,6 +116,7 @@ from plexpy import helpers
|
|||
type: 'get',
|
||||
data: { time_range: '30' },
|
||||
dataType: "json",
|
||||
cache: false,
|
||||
success: function(data) {
|
||||
hc_plays_by_hourofday_options.xAxis.categories = data.categories;
|
||||
hc_plays_by_hourofday_options.series = data.series;
|
||||
|
|
|
@ -40,7 +40,7 @@ var hc_plays_by_day_options = {
|
|||
},
|
||||
tooltip: {
|
||||
formatter: function() {
|
||||
var monthStr = moment(this.x).format("MMM D");
|
||||
var monthStr = moment(this.x).format("ddd MMM D");
|
||||
var s = '<b>'+ monthStr +'</b>';
|
||||
|
||||
$.each(this.points, function(i, point) {
|
||||
|
|
|
@ -298,7 +298,7 @@ def sig_handler(signum=None, frame=None):
|
|||
|
||||
|
||||
def dbcheck():
|
||||
conn = sqlite3.connect(DB_FILE)
|
||||
conn = sqlite3.connect(plexpy.CONFIG.PLEXWATCH_DATABASE)
|
||||
c = conn.cursor()
|
||||
conn.commit()
|
||||
c.close()
|
||||
|
|
|
@ -99,10 +99,9 @@ class DataTables(object):
|
|||
if int(order_column) == parameter['index']:
|
||||
if parameter['data'] in column_data['column_named'] and parameter['orderable'] == 'true':
|
||||
order = 'ORDER BY %s COLLATE NOCASE %s' % (parameter['data'], order_dir)
|
||||
logger.debug(u"order string %s " % order)
|
||||
else:
|
||||
order = 'ORDER BY %s COLLATE NOCASE %s' % (column_data['column_named'][order_column], order_dir)
|
||||
logger.debug(u"order string (NO param received) %s " % order)
|
||||
|
||||
return order
|
||||
|
||||
@staticmethod
|
||||
|
@ -115,11 +114,9 @@ class DataTables(object):
|
|||
for parameter in parameters:
|
||||
if column in parameter['data']:
|
||||
if parameter['searchable'] == 'true':
|
||||
logger.debug(u"Column %s is searchable." % column)
|
||||
where += column + ' LIKE "%' + search_value + '%" OR '
|
||||
search_skip = True
|
||||
else:
|
||||
logger.debug(u"Column %s is NOT searchable." % column)
|
||||
search_skip = True
|
||||
|
||||
if not search_skip:
|
||||
|
|
14
plexpy/db.py
14
plexpy/db.py
|
@ -100,20 +100,6 @@ class DBConnection:
|
|||
|
||||
return sqlResult
|
||||
|
||||
def get_history_table_name(self):
|
||||
|
||||
if plexpy.CONFIG.GROUPING_GLOBAL_HISTORY:
|
||||
return "grouped"
|
||||
else:
|
||||
return "processed"
|
||||
|
||||
def get_user_table_name(self):
|
||||
|
||||
if plexpy.CONFIG.GROUPING_USER_HISTORY:
|
||||
return "grouped"
|
||||
else:
|
||||
return "processed"
|
||||
|
||||
def upsert(self, tableName, valueDict, keyDict):
|
||||
|
||||
changesBefore = self.connection.total_changes
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with PlexPy. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from plexpy import logger, helpers, request, datatables, config, db
|
||||
from plexpy import logger, helpers, datatables, db
|
||||
from xml.dom import minidom
|
||||
import sys
|
||||
if sys.version_info < (2, 7):
|
||||
|
@ -22,7 +22,6 @@ else:
|
|||
from collections import defaultdict, Counter
|
||||
import datetime
|
||||
import plexpy
|
||||
import json
|
||||
|
||||
|
||||
class PlexWatch(object):
|
||||
|
@ -41,14 +40,6 @@ class PlexWatch(object):
|
|||
else:
|
||||
return "processed"
|
||||
|
||||
@staticmethod
|
||||
def get_user_table_name():
|
||||
|
||||
if plexpy.CONFIG.GROUPING_USER_HISTORY:
|
||||
return "grouped"
|
||||
else:
|
||||
return "processed"
|
||||
|
||||
def get_user_list(self, start='', length='', kwargs=None):
|
||||
data_tables = datatables.DataTables()
|
||||
|
||||
|
@ -78,7 +69,7 @@ class PlexWatch(object):
|
|||
'ip_address',
|
||||
'COUNT(title) as plays']
|
||||
try:
|
||||
query = data_tables.ssp_query(table_name=self.get_user_table_name(),
|
||||
query = data_tables.ssp_query(table_name=self.get_history_table_name(),
|
||||
columns=columns,
|
||||
start=start,
|
||||
length=length,
|
||||
|
@ -150,7 +141,7 @@ class PlexWatch(object):
|
|||
]
|
||||
|
||||
try:
|
||||
query = data_tables.ssp_query(table_name=self.get_user_table_name(),
|
||||
query = data_tables.ssp_query(table_name=self.get_history_table_name(),
|
||||
columns=columns,
|
||||
start=start,
|
||||
length=length,
|
||||
|
@ -408,11 +399,11 @@ class PlexWatch(object):
|
|||
try:
|
||||
if user:
|
||||
query = 'SELECT time, user, xml FROM %s WHERE user = "%s" ORDER BY time DESC LIMIT %s' % \
|
||||
(self.get_user_table_name(), user, limit)
|
||||
(self.get_history_table_name(), user, limit)
|
||||
xml = myDB.select(query)
|
||||
else:
|
||||
query = 'SELECT time, user, xml FROM %s ORDER BY time DESC LIMIT %s' % \
|
||||
(self.get_user_table_name(), limit)
|
||||
(self.get_history_table_name(), limit)
|
||||
xml = myDB.select(query)
|
||||
except:
|
||||
logger.warn("Unable to open PlexWatch database.")
|
||||
|
@ -467,7 +458,7 @@ class PlexWatch(object):
|
|||
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 ' \
|
||||
'FROM %s %s' % (self.get_user_table_name(), where)
|
||||
'FROM %s %s' % (self.get_history_table_name(), where)
|
||||
result = myDB.select(query)
|
||||
except:
|
||||
logger.warn("Unable to open PlexWatch database.")
|
||||
|
@ -501,7 +492,7 @@ class PlexWatch(object):
|
|||
'FROM %s ' \
|
||||
'WHERE user = "%s" ' \
|
||||
'GROUP BY platform ' \
|
||||
'ORDER BY platform_count DESC' % (self.get_user_table_name(), user)
|
||||
'ORDER BY platform_count DESC' % (self.get_history_table_name(), user)
|
||||
result = myDB.select(query)
|
||||
except:
|
||||
logger.warn("Unable to open PlexWatch database.")
|
||||
|
@ -542,7 +533,7 @@ class PlexWatch(object):
|
|||
query = 'SELECT xml ' \
|
||||
'FROM %s ' \
|
||||
'WHERE user = "%s" ' \
|
||||
'ORDER BY id DESC LIMIT 1' % (self.get_user_table_name(), user)
|
||||
'ORDER BY id DESC LIMIT 1' % (self.get_history_table_name(), user)
|
||||
result = myDB.select_single(query)
|
||||
except:
|
||||
logger.warn("Unable to open PlexWatch database.")
|
||||
|
@ -588,7 +579,7 @@ class PlexWatch(object):
|
|||
'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-%s days", "localtime") ' \
|
||||
'AND episode != "" ' \
|
||||
'GROUP BY orig_title ' \
|
||||
'ORDER BY total_plays DESC LIMIT 10' % (self.get_user_table_name(), time_range)
|
||||
'ORDER BY total_plays DESC LIMIT 10' % (self.get_history_table_name(), time_range)
|
||||
result = myDB.select(query)
|
||||
except:
|
||||
logger.warn("Unable to open PlexWatch database.")
|
||||
|
@ -631,7 +622,7 @@ class PlexWatch(object):
|
|||
'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-%s days", "localtime") ' \
|
||||
'AND episode != "" ' \
|
||||
'GROUP BY orig_title ' \
|
||||
'ORDER BY users_watched DESC, total_plays DESC LIMIT 10' % (self.get_user_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)
|
||||
except:
|
||||
logger.warn("Unable to open PlexWatch database.")
|
||||
|
@ -673,7 +664,7 @@ class PlexWatch(object):
|
|||
'FROM %s ' \
|
||||
'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-%s days", "localtime") ' \
|
||||
'GROUP BY user ' \
|
||||
'ORDER BY total_plays DESC LIMIT 10' % (self.get_user_table_name(), time_range)
|
||||
'ORDER BY total_plays DESC LIMIT 10' % (self.get_history_table_name(), time_range)
|
||||
result = myDB.select(query)
|
||||
except:
|
||||
logger.warn("Unable to open PlexWatch database.")
|
||||
|
@ -699,7 +690,7 @@ class PlexWatch(object):
|
|||
'FROM %s ' \
|
||||
'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-%s days", "localtime") ' \
|
||||
'GROUP BY platform ' \
|
||||
'ORDER BY total_plays DESC' % (self.get_user_table_name(), time_range)
|
||||
'ORDER BY total_plays DESC' % (self.get_history_table_name(), time_range)
|
||||
result = myDB.select(query)
|
||||
except:
|
||||
logger.warn("Unable to open PlexWatch database.")
|
||||
|
@ -750,7 +741,7 @@ class PlexWatch(object):
|
|||
'FROM %s ' \
|
||||
'WHERE datetime(stopped, "unixepoch", "localtime") >= datetime("now", "-%s days", "localtime") ' \
|
||||
'GROUP BY date_played ' \
|
||||
'ORDER BY time ASC' % (self.get_user_table_name(), time_range)
|
||||
'ORDER BY time ASC' % (self.get_history_table_name(), time_range)
|
||||
|
||||
result = myDB.select(query)
|
||||
except:
|
||||
|
@ -808,7 +799,7 @@ class PlexWatch(object):
|
|||
'when 5 then "Friday" ' \
|
||||
'else "Saturday" end as dayofweek, ' \
|
||||
'COUNT(id) as total_plays ' \
|
||||
'from ' + self.get_user_table_name() + ' ' + \
|
||||
'from ' + self.get_history_table_name() + ' ' + \
|
||||
'WHERE datetime(stopped, "unixepoch", "localtime") >= ' \
|
||||
'datetime("now", "-' + time_range + ' days", "localtime") ' \
|
||||
'GROUP BY dayofweek ' \
|
||||
|
@ -849,7 +840,7 @@ class PlexWatch(object):
|
|||
|
||||
query = 'select strftime("%H", datetime(time, "unixepoch", "localtime")) as hourofday, ' \
|
||||
'COUNT(id) ' \
|
||||
'FROM ' + self.get_user_table_name() + ' ' + \
|
||||
'FROM ' + self.get_history_table_name() + ' ' + \
|
||||
'WHERE datetime(stopped, "unixepoch", "localtime") >= ' \
|
||||
'datetime("now", "-' + time_range + ' days", "localtime") ' \
|
||||
'GROUP BY hourofday ' \
|
||||
|
|
|
@ -13,23 +13,13 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with PlexPy. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from plexpy import logger, helpers, common, request
|
||||
from plexpy import logger, helpers
|
||||
|
||||
from xml.dom import minidom
|
||||
from httplib import HTTPSConnection
|
||||
from httplib import HTTPConnection
|
||||
from urlparse import parse_qsl
|
||||
from urllib import urlencode
|
||||
from pynma import pynma
|
||||
|
||||
import base64
|
||||
import cherrypy
|
||||
import urllib
|
||||
import urllib2
|
||||
import plexpy
|
||||
import os.path
|
||||
import subprocess
|
||||
import json
|
||||
|
||||
|
||||
class PmsConnect(object):
|
||||
|
@ -291,11 +281,9 @@ class PmsConnect(object):
|
|||
if a.getElementsByTagName('Directory'):
|
||||
metadata_main = a.getElementsByTagName('Directory')[0]
|
||||
metadata_type = self.get_xml_attr(metadata_main, 'type')
|
||||
logger.debug(u"Metadata type: %s" % metadata_type)
|
||||
elif a.getElementsByTagName('Video'):
|
||||
metadata_main = a.getElementsByTagName('Video')[0]
|
||||
metadata_type = self.get_xml_attr(metadata_main, 'type')
|
||||
logger.debug(u"Metadata type: %s" % metadata_type)
|
||||
else:
|
||||
logger.debug(u"Metadata failed")
|
||||
|
||||
|
@ -307,22 +295,18 @@ class PmsConnect(object):
|
|||
if metadata_main.getElementsByTagName('Genre'):
|
||||
for genre in metadata_main.getElementsByTagName('Genre'):
|
||||
genres.append(self.get_xml_attr(genre, 'tag'))
|
||||
logger.debug(u"Metadata genre: %s" % self.get_xml_attr(genre, 'tag'))
|
||||
|
||||
if metadata_main.getElementsByTagName('Role'):
|
||||
for actor in metadata_main.getElementsByTagName('Role'):
|
||||
actors.append(self.get_xml_attr(actor, 'tag'))
|
||||
logger.debug(u"Metadata actor: %s" % self.get_xml_attr(actor, 'tag'))
|
||||
|
||||
if metadata_main.getElementsByTagName('Writer'):
|
||||
for writer in metadata_main.getElementsByTagName('Writer'):
|
||||
writers.append(self.get_xml_attr(writer, 'tag'))
|
||||
logger.debug(u"Metadata genre: %s" % self.get_xml_attr(writer, 'tag'))
|
||||
|
||||
if metadata_main.getElementsByTagName('Director'):
|
||||
for director in metadata_main.getElementsByTagName('Director'):
|
||||
directors.append(self.get_xml_attr(director, 'tag'))
|
||||
logger.debug(u"Metadata actor: %s" % self.get_xml_attr(director, 'tag'))
|
||||
|
||||
if metadata_type == 'show':
|
||||
metadata = {'type': metadata_type,
|
||||
|
@ -386,7 +370,6 @@ class PmsConnect(object):
|
|||
elif metadata_type == 'season':
|
||||
parent_rating_key = self.get_xml_attr(metadata_main, 'parentRatingKey')
|
||||
show_details = self.get_metadata_details(parent_rating_key)
|
||||
logger.debug(u"show_details = %r" % show_details)
|
||||
metadata = {'type': metadata_type,
|
||||
'ratingKey': self.get_xml_attr(metadata_main, 'ratingKey'),
|
||||
'parentTitle': self.get_xml_attr(metadata_main, 'parentTitle'),
|
||||
|
@ -447,7 +430,6 @@ class PmsConnect(object):
|
|||
for a in xml_head:
|
||||
if a.getAttribute('size'):
|
||||
if a.getAttribute('size') == '0':
|
||||
logger.debug(u"No active sessions.")
|
||||
session_list = {'stream_count': '0',
|
||||
'sessions': []
|
||||
}
|
||||
|
@ -456,14 +438,12 @@ class PmsConnect(object):
|
|||
if a.getElementsByTagName('Track'):
|
||||
session_data = a.getElementsByTagName('Track')
|
||||
session_type = 'track'
|
||||
logger.debug(u"Track session active.")
|
||||
for session in session_data:
|
||||
session_output = self.get_session_each(session_type, session)
|
||||
session_list.append(session_output)
|
||||
if a.getElementsByTagName('Video'):
|
||||
session_data = a.getElementsByTagName('Video')
|
||||
session_type = 'video'
|
||||
logger.debug(u"Video session active.")
|
||||
for session in session_data:
|
||||
session_output = self.get_session_each(session_type, session)
|
||||
session_list.append(session_output)
|
||||
|
|
|
@ -13,25 +13,17 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with PlexPy. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from plexpy import logger, helpers, notifiers, plextv, pmsconnect, plexwatch
|
||||
from plexpy.helpers import checked, radio, today, cleanName
|
||||
from xml.dom import minidom
|
||||
from plexpy import logger, notifiers, plextv, pmsconnect, plexwatch
|
||||
from plexpy.helpers import checked, radio
|
||||
|
||||
from mako.lookup import TemplateLookup
|
||||
from mako import exceptions
|
||||
|
||||
from operator import itemgetter
|
||||
|
||||
import plexpy
|
||||
import threading
|
||||
import cherrypy
|
||||
import urllib2
|
||||
import hashlib
|
||||
import random
|
||||
import urllib
|
||||
import json
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
try:
|
||||
|
@ -524,7 +516,6 @@ class WebInterface(object):
|
|||
try:
|
||||
pms_connect = pmsconnect.PmsConnect()
|
||||
result = pms_connect.get_image(img, width, height)
|
||||
logger.debug(u'Image proxy queried. Content type is %s' % result[0])
|
||||
cherrypy.response.headers['Content-type'] = result[0]
|
||||
return result[1]
|
||||
except:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue