% else:
-
+
% endif
@@ -809,6 +809,45 @@ DOCUMENTATION :: END
+ % if len(top_stat['rows']) > 1:
+
+
+ % endif
% endif
diff --git a/plexpy/datafactory.py b/plexpy/datafactory.py
index 9f7ca4c7..1ee80435 100644
--- a/plexpy/datafactory.py
+++ b/plexpy/datafactory.py
@@ -570,40 +570,81 @@ class DataFactory(object):
'rows': last_watched})
elif stat == 'most_concurrent':
+
+ def calc_most_concurrent(title, result):
+ '''
+ Function to calculate most concurrent streams
+ Input: Stat title, SQLite query result
+ Output: Dict {title, count, started, stopped}
+ '''
+ times = []
+ for item in result:
+ times.append({'time': str(item['started']) + 'B', 'count': 1})
+ times.append({'time': str(item['stopped']) + 'A', 'count': -1})
+ times = sorted(times, key=lambda k: k['time'])
+
+ count = 0
+ last_count = 0
+ last_start = 0
+ concurrent = {'title': title,
+ 'count': 0,
+ 'started': None,
+ 'stopped': None
+ }
+
+ for d in times:
+ if d['count'] == 1:
+ count += d['count']
+ if count >= last_count:
+ last_start = d['time']
+ else:
+ if count >= last_count:
+ last_count = count
+ concurrent['count'] = count
+ concurrent['started'] = last_start[:-1]
+ concurrent['stopped'] = d['time'][:-1]
+ count += d['count']
+
+ return concurrent
+
+ most_concurrent = []
+
try:
- query = 'SELECT started, stopped ' \
- 'FROM session_history ' \
- 'WHERE datetime(stopped, "unixepoch", "localtime") ' \
- '>= datetime("now", "-%s days", "localtime") ' % time_range
+ base_query = 'SELECT session_history.started, session_history.stopped ' \
+ 'FROM session_history ' \
+ 'JOIN session_history_media_info ON session_history.id = session_history_media_info.id ' \
+ 'WHERE datetime(stopped, "unixepoch", "localtime") ' \
+ '>= datetime("now", "-%s days", "localtime") ' % time_range
+
+ title = 'Concurrent Streams'
+ query = base_query
result = monitor_db.select(query)
+ most_concurrent.append(calc_most_concurrent(title, result))
+
+ title = 'Concurrent Transcodes'
+ query = base_query \
+ + 'AND (session_history_media_info.video_decision = "transcode" ' \
+ 'OR session_history_media_info.audio_decision = "transcode") '
+ result = monitor_db.select(query)
+ most_concurrent.append(calc_most_concurrent(title, result))
+
+ title = 'Concurrent Direct Streams'
+ query = base_query \
+ + 'AND (session_history_media_info.video_decision != "transcode" ' \
+ 'AND session_history_media_info.audio_decision = "copy") '
+ result = monitor_db.select(query)
+ most_concurrent.append(calc_most_concurrent(title, result))
+
+ title = 'Concurrent Direct Plays'
+ query = base_query \
+ + 'AND (session_history_media_info.video_decision = "direct play" ' \
+ 'OR session_history_media_info.audio_decision = "direct play") '
+ result = monitor_db.select(query)
+ most_concurrent.append(calc_most_concurrent(title, result))
except:
logger.warn("Unable to execute database query for get_home_stats: most_concurrent.")
return None
- times = []
- for item in result:
- times.append({'time': str(item['started']) + 'B', 'count': 1})
- times.append({'time': str(item['stopped']) + 'A', 'count': -1})
- times = sorted(times, key=lambda k: k['time'])
-
- count = 0
- last_count = 0
- last_start = 0
- most_concurrent = []
-
- for d in times:
- if d['count'] == 1:
- count += d['count']
- if count >= last_count:
- last_start = d['time']
- else:
- if count >= last_count:
- last_count = count
- most_concurrent = [{'count': count,
- 'started': last_start[:-1],
- 'stopped': d['time'][:-1]}]
- count += d['count']
-
home_stats.append({'stat_id': stat,
'rows': most_concurrent})
diff --git a/plexpy/graphs.py b/plexpy/graphs.py
index 10c49219..cb4e72f5 100644
--- a/plexpy/graphs.py
+++ b/plexpy/graphs.py
@@ -479,14 +479,14 @@ class Graphs(object):
try:
if y_axis == 'plays':
query = 'SELECT date(session_history.started, "unixepoch", "localtime") as date_played, ' \
- 'SUM(case when session_history_media_info.video_decision = "direct play" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "direct play") ' \
+ 'SUM(case when (session_history_media_info.video_decision = "direct play" ' \
+ 'or session_history_media_info.audio_decision = "direct play") ' \
'then 1 else 0 end) as dp_count, ' \
- 'SUM(case when session_history_media_info.video_decision = "copy" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "copy") ' \
+ 'SUM(case when (session_history_media_info.video_decision != "transcode" ' \
+ 'and session_history_media_info.audio_decision = "copy") ' \
'then 1 else 0 end) as ds_count, ' \
- 'SUM(case when session_history_media_info.video_decision = "transcode" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "transcode") ' \
+ 'SUM(case when (session_history_media_info.video_decision = "transcode" ' \
+ 'or session_history_media_info.audio_decision = "transcode") ' \
'then 1 else 0 end) as tc_count ' \
'FROM session_history ' \
'JOIN session_history_media_info ON session_history.id = session_history_media_info.id ' \
@@ -500,15 +500,15 @@ class Graphs(object):
else:
query = 'SELECT date(session_history.started, "unixepoch", "localtime") as date_played, ' \
'SUM(case when (session_history_media_info.video_decision = "direct play" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "direct play")) ' \
+ 'or session_history_media_info.audio_decision = "direct play") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as dp_count, ' \
- 'SUM(case when (session_history_media_info.video_decision = "copy" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "copy")) ' \
+ 'SUM(case when (session_history_media_info.video_decision != "transcode" ' \
+ 'and session_history_media_info.audio_decision = "copy") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as ds_count, ' \
'SUM(case when (session_history_media_info.video_decision = "transcode" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "transcode")) ' \
+ 'or session_history_media_info.audio_decision = "transcode") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as tc_count ' \
'FROM session_history ' \
@@ -574,14 +574,14 @@ class Graphs(object):
if y_axis == 'plays':
query = 'SELECT session_history_media_info.video_resolution AS resolution, ' \
- 'SUM(case when session_history_media_info.video_decision = "direct play" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "direct play") ' \
+ 'SUM(case when (session_history_media_info.video_decision = "direct play" ' \
+ 'or session_history_media_info.audio_decision = "direct play") ' \
'then 1 else 0 end) as dp_count, ' \
- 'SUM(case when session_history_media_info.video_decision = "copy" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "copy") ' \
+ 'SUM(case when (session_history_media_info.video_decision != "transcode" ' \
+ 'and session_history_media_info.audio_decision = "copy") ' \
'then 1 else 0 end) as ds_count, ' \
- 'SUM(case when session_history_media_info.video_decision = "transcode" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "transcode") ' \
+ 'SUM(case when (session_history_media_info.video_decision = "transcode" ' \
+ 'or session_history_media_info.audio_decision = "transcode") ' \
'then 1 else 0 end) as tc_count, ' \
'COUNT(session_history.id) as total_count ' \
'FROM session_history ' \
@@ -597,15 +597,15 @@ class Graphs(object):
else:
query = 'SELECT session_history_media_info.video_resolution AS resolution,' \
'SUM(case when (session_history_media_info.video_decision = "direct play" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "direct play")) ' \
+ 'or session_history_media_info.audio_decision = "direct play") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as dp_count, ' \
- 'SUM(case when (session_history_media_info.video_decision = "copy" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "copy")) ' \
+ 'SUM(case when (session_history_media_info.video_decision != "transcode" ' \
+ 'and session_history_media_info.audio_decision = "copy") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as ds_count, ' \
'SUM(case when (session_history_media_info.video_decision = "transcode" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "transcode")) ' \
+ 'or session_history_media_info.audio_decision = "transcode") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as tc_count, ' \
'SUM(case when stopped > 0 then (stopped - started) ' \
@@ -661,14 +661,14 @@ class Graphs(object):
'when session_history_media_info.transcode_height <= 1440 then "QHD" ' \
'when session_history_media_info.transcode_height <= 2160 then "4K" ' \
'else "unknown" end) else session_history_media_info.video_resolution end) as resolution, ' \
- 'SUM(case when session_history_media_info.video_decision = "direct play" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "direct play") ' \
+ 'SUM(case when (session_history_media_info.video_decision = "direct play" ' \
+ 'or session_history_media_info.audio_decision = "direct play") ' \
'then 1 else 0 end) as dp_count, ' \
- 'SUM(case when session_history_media_info.video_decision = "copy" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "copy") ' \
+ 'SUM(case when (session_history_media_info.video_decision != "transcode" ' \
+ 'and session_history_media_info.audio_decision = "copy") ' \
'then 1 else 0 end) as ds_count, ' \
- 'SUM(case when session_history_media_info.video_decision = "transcode" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "transcode") ' \
+ 'SUM(case when (session_history_media_info.video_decision = "transcode" '\
+ 'or session_history_media_info.audio_decision = "transcode") ' \
'then 1 else 0 end) as tc_count, ' \
'COUNT(session_history.id) as total_count ' \
'FROM session_history ' \
@@ -694,15 +694,15 @@ class Graphs(object):
'when session_history_media_info.transcode_height <= 2160 then "4K" ' \
'else "unknown" end) else session_history_media_info.video_resolution end) as resolution, ' \
'SUM(case when (session_history_media_info.video_decision = "direct play" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "direct play")) ' \
+ 'or session_history_media_info.audio_decision = "direct play") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as dp_count, ' \
- 'SUM(case when (session_history_media_info.video_decision = "copy" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "copy")) ' \
+ 'SUM(case when (session_history_media_info.video_decision != "transcode" ' \
+ 'and session_history_media_info.audio_decision = "copy") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as ds_count, ' \
'SUM(case when (session_history_media_info.video_decision = "transcode" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "transcode")) ' \
+ 'or session_history_media_info.audio_decision = "transcode") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as tc_count, ' \
'SUM(case when stopped > 0 then (stopped - started) ' \
@@ -749,14 +749,14 @@ class Graphs(object):
if y_axis == 'plays':
query = 'SELECT ' \
'session_history.platform as platform, ' \
- 'SUM(case when session_history_media_info.video_decision = "direct play" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "direct play") ' \
+ 'SUM(case when (session_history_media_info.video_decision = "direct play" ' \
+ 'or session_history_media_info.audio_decision = "direct play") ' \
'then 1 else 0 end) as dp_count, ' \
- 'SUM(case when session_history_media_info.video_decision = "copy" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "copy") ' \
+ 'SUM(case when (session_history_media_info.video_decision != "transcode" ' \
+ 'and session_history_media_info.audio_decision = "copy") ' \
'then 1 else 0 end) as ds_count, ' \
- 'SUM(case when session_history_media_info.video_decision = "transcode" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "transcode") ' \
+ 'SUM(case when (session_history_media_info.video_decision = "transcode" ' \
+ 'or session_history_media_info.audio_decision = "transcode") ' \
'then 1 else 0 end) as tc_count, ' \
'COUNT(session_history.id) as total_count ' \
'FROM session_history ' \
@@ -772,15 +772,15 @@ class Graphs(object):
query = 'SELECT ' \
'session_history.platform as platform, ' \
'SUM(case when (session_history_media_info.video_decision = "direct play" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "direct play")) ' \
+ 'or session_history_media_info.audio_decision = "direct play") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as dp_count, ' \
- 'SUM(case when (session_history_media_info.video_decision = "copy" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "copy")) ' \
+ 'SUM(case when (session_history_media_info.video_decision != "transcode" ' \
+ 'and session_history_media_info.audio_decision = "copy") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as ds_count, ' \
'SUM(case when (session_history_media_info.video_decision = "transcode" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "transcode")) ' \
+ 'and session_history_media_info.audio_decision = "transcode") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as tc_count, ' \
'SUM(case when session_history.stopped > 0 ' \
@@ -828,14 +828,14 @@ class Graphs(object):
if y_axis == 'plays':
query = 'SELECT ' \
'CASE WHEN users.friendly_name is null then users.username else users.friendly_name end as username, ' \
- 'SUM(case when session_history_media_info.video_decision = "direct play" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "direct play") ' \
+ 'SUM(case when (session_history_media_info.video_decision = "direct play" ' \
+ 'or session_history_media_info.audio_decision = "direct play") ' \
'then 1 else 0 end) as dp_count, ' \
- 'SUM(case when session_history_media_info.video_decision = "copy" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "copy") ' \
+ 'SUM(case when (session_history_media_info.video_decision != "transcode" ' \
+ 'and session_history_media_info.audio_decision = "copy") ' \
'then 1 else 0 end) as ds_count, ' \
- 'SUM(case when session_history_media_info.video_decision = "transcode" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "transcode") ' \
+ 'SUM(case when (session_history_media_info.video_decision = "transcode" ' \
+ 'or session_history_media_info.audio_decision = "transcode") ' \
'then 1 else 0 end) as tc_count, ' \
'COUNT(session_history.id) as total_count ' \
'FROM session_history ' \
@@ -852,15 +852,15 @@ class Graphs(object):
query = 'SELECT ' \
'CASE WHEN users.friendly_name is null then users.username else users.friendly_name end as username, ' \
'SUM(case when (session_history_media_info.video_decision = "direct play" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "direct play")) ' \
+ 'or session_history_media_info.audio_decision = "direct play") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as dp_count, ' \
- 'SUM(case when (session_history_media_info.video_decision = "copy" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "copy")) ' \
+ 'SUM(case when (session_history_media_info.video_decision != "transcode" ' \
+ 'and session_history_media_info.audio_decision = "copy") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as ds_count, ' \
'SUM(case when (session_history_media_info.video_decision = "transcode" ' \
- 'or (session_history_media_info.video_decision = "" and session_history_media_info.audio_decision = "transcode")) ' \
+ 'and session_history_media_info.audio_decision = "transcode") ' \
'and session_history.stopped > 0 then (session_history.stopped - session_history.started) ' \
' - (case when paused_counter is NULL then 0 else paused_counter end) else 0 end) as tc_count, ' \
'SUM(case when session_history.stopped > 0 ' \