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:
Tim 2015-06-24 17:35:41 +02:00
parent c2e9025f9f
commit 838ee5cae9
9 changed files with 28 additions and 78 deletions

View file

@ -184,9 +184,10 @@
<p class="help-block">Full path and file name of your PlexWatch database.</p> <p class="help-block">Full path and file name of your PlexWatch database.</p>
</div> </div>
<div class="checkbox"> <div class="checkbox">
<input type="checkbox" id="grouping_global_history" name="grouping_global_history" value="1" ${config['grouping_global_history']}> Global History <input type="checkbox" id="grouping_global_history" name="grouping_global_history" value="1" ${config['grouping_global_history']}> Enable Grouping
<p class="help-block">Enable global history grouping.</p> <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>
<!--
<div class="checkbox"> <div class="checkbox">
<input type="checkbox" id="grouping_user_history" name="grouping_user_history" value="1" ${config['grouping_user_history']}> User History <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> <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 <input type="checkbox" id="grouping_charts" name="grouping_charts" value="1" ${config['grouping_charts']}> Charts History
<p class="help-block">Enable chart grouping.</p> <p class="help-block">Enable chart grouping.</p>
</div> </div>
-->
</fieldset> </fieldset>
</div> </div>
</div> </div>

View file

@ -85,6 +85,7 @@ from plexpy import helpers
type: 'get', type: 'get',
data: { time_range: '30' }, data: { time_range: '30' },
dataType: "json", dataType: "json",
cache: false,
success: function(data) { success: function(data) {
var dateArray = []; var dateArray = [];
for (var i = 0; i < data.categories.length; i++) { for (var i = 0; i < data.categories.length; i++) {
@ -102,6 +103,7 @@ from plexpy import helpers
type: 'get', type: 'get',
data: { time_range: '30' }, data: { time_range: '30' },
dataType: "json", dataType: "json",
cache: false,
success: function(data) { success: function(data) {
hc_plays_by_dayofweek_options.xAxis.categories = data.categories; hc_plays_by_dayofweek_options.xAxis.categories = data.categories;
hc_plays_by_dayofweek_options.series = data.series; hc_plays_by_dayofweek_options.series = data.series;
@ -114,6 +116,7 @@ from plexpy import helpers
type: 'get', type: 'get',
data: { time_range: '30' }, data: { time_range: '30' },
dataType: "json", dataType: "json",
cache: false,
success: function(data) { success: function(data) {
hc_plays_by_hourofday_options.xAxis.categories = data.categories; hc_plays_by_hourofday_options.xAxis.categories = data.categories;
hc_plays_by_hourofday_options.series = data.series; hc_plays_by_hourofday_options.series = data.series;

View file

@ -40,7 +40,7 @@ var hc_plays_by_day_options = {
}, },
tooltip: { tooltip: {
formatter: function() { formatter: function() {
var monthStr = moment(this.x).format("MMM D"); var monthStr = moment(this.x).format("ddd MMM D");
var s = '<b>'+ monthStr +'</b>'; var s = '<b>'+ monthStr +'</b>';
$.each(this.points, function(i, point) { $.each(this.points, function(i, point) {

View file

@ -298,7 +298,7 @@ def sig_handler(signum=None, frame=None):
def dbcheck(): def dbcheck():
conn = sqlite3.connect(DB_FILE) conn = sqlite3.connect(plexpy.CONFIG.PLEXWATCH_DATABASE)
c = conn.cursor() c = conn.cursor()
conn.commit() conn.commit()
c.close() c.close()

View file

@ -99,10 +99,9 @@ class DataTables(object):
if int(order_column) == parameter['index']: if int(order_column) == parameter['index']:
if parameter['data'] in column_data['column_named'] and parameter['orderable'] == 'true': if parameter['data'] in column_data['column_named'] and parameter['orderable'] == 'true':
order = 'ORDER BY %s COLLATE NOCASE %s' % (parameter['data'], order_dir) order = 'ORDER BY %s COLLATE NOCASE %s' % (parameter['data'], order_dir)
logger.debug(u"order string %s " % order)
else: else:
order = 'ORDER BY %s COLLATE NOCASE %s' % (column_data['column_named'][order_column], order_dir) 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 return order
@staticmethod @staticmethod
@ -115,11 +114,9 @@ class DataTables(object):
for parameter in parameters: for parameter in parameters:
if column in parameter['data']: if column in parameter['data']:
if parameter['searchable'] == 'true': if parameter['searchable'] == 'true':
logger.debug(u"Column %s is searchable." % column)
where += column + ' LIKE "%' + search_value + '%" OR ' where += column + ' LIKE "%' + search_value + '%" OR '
search_skip = True search_skip = True
else: else:
logger.debug(u"Column %s is NOT searchable." % column)
search_skip = True search_skip = True
if not search_skip: if not search_skip:

View file

@ -100,20 +100,6 @@ class DBConnection:
return sqlResult 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): def upsert(self, tableName, valueDict, keyDict):
changesBefore = self.connection.total_changes changesBefore = self.connection.total_changes

View file

@ -13,7 +13,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with PlexPy. If not, see <http://www.gnu.org/licenses/>. # 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 from xml.dom import minidom
import sys import sys
if sys.version_info < (2, 7): if sys.version_info < (2, 7):
@ -22,7 +22,6 @@ else:
from collections import defaultdict, Counter from collections import defaultdict, Counter
import datetime import datetime
import plexpy import plexpy
import json
class PlexWatch(object): class PlexWatch(object):
@ -41,14 +40,6 @@ class PlexWatch(object):
else: else:
return "processed" 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): def get_user_list(self, start='', length='', kwargs=None):
data_tables = datatables.DataTables() data_tables = datatables.DataTables()
@ -78,7 +69,7 @@ class PlexWatch(object):
'ip_address', 'ip_address',
'COUNT(title) as plays'] 'COUNT(title) as plays']
try: 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, columns=columns,
start=start, start=start,
length=length, length=length,
@ -150,7 +141,7 @@ class PlexWatch(object):
] ]
try: 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, columns=columns,
start=start, start=start,
length=length, length=length,
@ -408,11 +399,11 @@ 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 = "%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) xml = myDB.select(query)
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 %s' % \
(self.get_user_table_name(), limit) (self.get_history_table_name(), limit)
xml = myDB.select(query) xml = myDB.select(query)
except: except:
logger.warn("Unable to open PlexWatch database.") logger.warn("Unable to open PlexWatch database.")
@ -467,7 +458,7 @@ class PlexWatch(object):
try: try:
query = 'SELECT (SUM(stopped - time) - SUM(CASE WHEN paused_counter is null THEN 0 ELSE paused_counter END)) as total_time, ' \ 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_user_table_name(), where) 'FROM %s %s' % (self.get_history_table_name(), where)
result = myDB.select(query) result = myDB.select(query)
except: except:
logger.warn("Unable to open PlexWatch database.") logger.warn("Unable to open PlexWatch database.")
@ -501,7 +492,7 @@ class PlexWatch(object):
'FROM %s ' \ 'FROM %s ' \
'WHERE user = "%s" ' \ 'WHERE user = "%s" ' \
'GROUP BY platform ' \ '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) result = myDB.select(query)
except: except:
logger.warn("Unable to open PlexWatch database.") logger.warn("Unable to open PlexWatch database.")
@ -542,7 +533,7 @@ class PlexWatch(object):
query = 'SELECT xml ' \ query = 'SELECT xml ' \
'FROM %s ' \ 'FROM %s ' \
'WHERE user = "%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) result = myDB.select_single(query)
except: except:
logger.warn("Unable to open PlexWatch database.") logger.warn("Unable to open PlexWatch database.")
@ -588,7 +579,7 @@ class PlexWatch(object):
'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_user_table_name(), time_range) 'ORDER BY 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.")
@ -631,7 +622,7 @@ class PlexWatch(object):
'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_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) result = myDB.select(query)
except: except:
logger.warn("Unable to open PlexWatch database.") logger.warn("Unable to open PlexWatch database.")
@ -673,7 +664,7 @@ class PlexWatch(object):
'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 user ' \ '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) result = myDB.select(query)
except: except:
logger.warn("Unable to open PlexWatch database.") logger.warn("Unable to open PlexWatch database.")
@ -699,7 +690,7 @@ class PlexWatch(object):
'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_user_table_name(), time_range) 'ORDER BY total_plays DESC' % (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.")
@ -750,7 +741,7 @@ class PlexWatch(object):
'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 date_played ' \ '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) result = myDB.select(query)
except: except:
@ -808,7 +799,7 @@ class PlexWatch(object):
'when 5 then "Friday" ' \ 'when 5 then "Friday" ' \
'else "Saturday" end as dayofweek, ' \ 'else "Saturday" end as dayofweek, ' \
'COUNT(id) as total_plays ' \ 'COUNT(id) as total_plays ' \
'from ' + self.get_user_table_name() + ' ' + \ 'from ' + self.get_history_table_name() + ' ' + \
'WHERE datetime(stopped, "unixepoch", "localtime") >= ' \ 'WHERE datetime(stopped, "unixepoch", "localtime") >= ' \
'datetime("now", "-' + time_range + ' days", "localtime") ' \ 'datetime("now", "-' + time_range + ' days", "localtime") ' \
'GROUP BY dayofweek ' \ 'GROUP BY dayofweek ' \
@ -849,7 +840,7 @@ class PlexWatch(object):
query = 'select strftime("%H", datetime(time, "unixepoch", "localtime")) as hourofday, ' \ query = 'select strftime("%H", datetime(time, "unixepoch", "localtime")) as hourofday, ' \
'COUNT(id) ' \ 'COUNT(id) ' \
'FROM ' + self.get_user_table_name() + ' ' + \ 'FROM ' + self.get_history_table_name() + ' ' + \
'WHERE datetime(stopped, "unixepoch", "localtime") >= ' \ 'WHERE datetime(stopped, "unixepoch", "localtime") >= ' \
'datetime("now", "-' + time_range + ' days", "localtime") ' \ 'datetime("now", "-' + time_range + ' days", "localtime") ' \
'GROUP BY hourofday ' \ 'GROUP BY hourofday ' \

View file

@ -13,23 +13,13 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with PlexPy. If not, see <http://www.gnu.org/licenses/>. # 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 xml.dom import minidom
from httplib import HTTPSConnection from httplib import HTTPSConnection
from httplib import HTTPConnection 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 plexpy
import os.path
import subprocess
import json
class PmsConnect(object): class PmsConnect(object):
@ -291,11 +281,9 @@ class PmsConnect(object):
if a.getElementsByTagName('Directory'): if a.getElementsByTagName('Directory'):
metadata_main = a.getElementsByTagName('Directory')[0] metadata_main = a.getElementsByTagName('Directory')[0]
metadata_type = self.get_xml_attr(metadata_main, 'type') metadata_type = self.get_xml_attr(metadata_main, 'type')
logger.debug(u"Metadata type: %s" % metadata_type)
elif a.getElementsByTagName('Video'): elif a.getElementsByTagName('Video'):
metadata_main = a.getElementsByTagName('Video')[0] metadata_main = a.getElementsByTagName('Video')[0]
metadata_type = self.get_xml_attr(metadata_main, 'type') metadata_type = self.get_xml_attr(metadata_main, 'type')
logger.debug(u"Metadata type: %s" % metadata_type)
else: else:
logger.debug(u"Metadata failed") logger.debug(u"Metadata failed")
@ -307,22 +295,18 @@ class PmsConnect(object):
if metadata_main.getElementsByTagName('Genre'): if metadata_main.getElementsByTagName('Genre'):
for genre in metadata_main.getElementsByTagName('Genre'): for genre in metadata_main.getElementsByTagName('Genre'):
genres.append(self.get_xml_attr(genre, 'tag')) 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'): if metadata_main.getElementsByTagName('Role'):
for actor in metadata_main.getElementsByTagName('Role'): for actor in metadata_main.getElementsByTagName('Role'):
actors.append(self.get_xml_attr(actor, 'tag')) 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'): if metadata_main.getElementsByTagName('Writer'):
for writer in metadata_main.getElementsByTagName('Writer'): for writer in metadata_main.getElementsByTagName('Writer'):
writers.append(self.get_xml_attr(writer, 'tag')) 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'): if metadata_main.getElementsByTagName('Director'):
for director in metadata_main.getElementsByTagName('Director'): for director in metadata_main.getElementsByTagName('Director'):
directors.append(self.get_xml_attr(director, 'tag')) directors.append(self.get_xml_attr(director, 'tag'))
logger.debug(u"Metadata actor: %s" % self.get_xml_attr(director, 'tag'))
if metadata_type == 'show': if metadata_type == 'show':
metadata = {'type': metadata_type, metadata = {'type': metadata_type,
@ -386,7 +370,6 @@ class PmsConnect(object):
elif metadata_type == 'season': elif metadata_type == 'season':
parent_rating_key = self.get_xml_attr(metadata_main, 'parentRatingKey') parent_rating_key = self.get_xml_attr(metadata_main, 'parentRatingKey')
show_details = self.get_metadata_details(parent_rating_key) show_details = self.get_metadata_details(parent_rating_key)
logger.debug(u"show_details = %r" % show_details)
metadata = {'type': metadata_type, metadata = {'type': metadata_type,
'ratingKey': self.get_xml_attr(metadata_main, 'ratingKey'), 'ratingKey': self.get_xml_attr(metadata_main, 'ratingKey'),
'parentTitle': self.get_xml_attr(metadata_main, 'parentTitle'), 'parentTitle': self.get_xml_attr(metadata_main, 'parentTitle'),
@ -447,7 +430,6 @@ class PmsConnect(object):
for a in xml_head: for a in xml_head:
if a.getAttribute('size'): if a.getAttribute('size'):
if a.getAttribute('size') == '0': if a.getAttribute('size') == '0':
logger.debug(u"No active sessions.")
session_list = {'stream_count': '0', session_list = {'stream_count': '0',
'sessions': [] 'sessions': []
} }
@ -456,14 +438,12 @@ class PmsConnect(object):
if a.getElementsByTagName('Track'): if a.getElementsByTagName('Track'):
session_data = a.getElementsByTagName('Track') session_data = a.getElementsByTagName('Track')
session_type = 'track' session_type = 'track'
logger.debug(u"Track session active.")
for session in session_data: for session in session_data:
session_output = self.get_session_each(session_type, session) session_output = self.get_session_each(session_type, session)
session_list.append(session_output) session_list.append(session_output)
if a.getElementsByTagName('Video'): if a.getElementsByTagName('Video'):
session_data = a.getElementsByTagName('Video') session_data = a.getElementsByTagName('Video')
session_type = 'video' session_type = 'video'
logger.debug(u"Video session active.")
for session in session_data: for session in session_data:
session_output = self.get_session_each(session_type, session) session_output = self.get_session_each(session_type, session)
session_list.append(session_output) session_list.append(session_output)

View file

@ -13,25 +13,17 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with PlexPy. If not, see <http://www.gnu.org/licenses/>. # along with PlexPy. If not, see <http://www.gnu.org/licenses/>.
from plexpy import logger, helpers, notifiers, plextv, pmsconnect, plexwatch from plexpy import logger, notifiers, plextv, pmsconnect, plexwatch
from plexpy.helpers import checked, radio, today, cleanName from plexpy.helpers import checked, radio
from xml.dom import minidom
from mako.lookup import TemplateLookup from mako.lookup import TemplateLookup
from mako import exceptions from mako import exceptions
from operator import itemgetter
import plexpy import plexpy
import threading
import cherrypy import cherrypy
import urllib2
import hashlib import hashlib
import random import random
import urllib
import json import json
import time
import sys
import os import os
try: try:
@ -524,7 +516,6 @@ class WebInterface(object):
try: try:
pms_connect = pmsconnect.PmsConnect() pms_connect = pmsconnect.PmsConnect()
result = pms_connect.get_image(img, width, height) 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] cherrypy.response.headers['Content-type'] = result[0]
return result[1] return result[1]
except: except: