From 9cf6793b240d14b5516450a48492fbf3e49fc3be Mon Sep 17 00:00:00 2001 From: Jonathan Wong Date: Sat, 12 Dec 2015 14:28:59 -0800 Subject: [PATCH] Add most concurrent streams home statistic --- data/interfaces/default/home_stats.html | 29 ++++++++++++++++ .../images/home-stat_most-concurrent.png | Bin 0 -> 4864 bytes data/interfaces/default/settings.html | 1 + plexpy/config.py | 3 +- plexpy/datafactory.py | 32 ++++++++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 data/interfaces/default/images/home-stat_most-concurrent.png diff --git a/data/interfaces/default/home_stats.html b/data/interfaces/default/home_stats.html index e3773f3f..e6efb512 100644 --- a/data/interfaces/default/home_stats.html +++ b/data/interfaces/default/home_stats.html @@ -44,6 +44,11 @@ player Returns the player name for the associated stat. == Only if 'stat_id' is 'last_watched' == last_watch Returns the time the media item was last watched. +== Only if 'stat_id' is 'most_concurrent' == +count Returns the count of the most concurrent streams. +started Returns the start time of the most concurrent streams. +stopped Returns the stop time of the most concurrent streams. + DOCUMENTATION :: END @@ -782,6 +787,30 @@ DOCUMENTATION :: END % endif + % elif top_stat['stat_id'] == 'most_concurrent' and top_stat['rows']: +
+
  • +
    +
    +

    Most Concurrent Streams

    +
    +
    +

    + + + +

    +

    ${top_stat['rows'][0]['count']}

    +

    streams

    +
    +
    +
    +
    +
    +
  • +
    % endif % endfor diff --git a/data/interfaces/default/images/home-stat_most-concurrent.png b/data/interfaces/default/images/home-stat_most-concurrent.png new file mode 100644 index 0000000000000000000000000000000000000000..085dc93eb193971cd91cfca0c794b52db91c1260 GIT binary patch literal 4864 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 GhyM)~t94HR literal 0 HcmV?d00001 diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html index 384290f9..ee3643ff 100644 --- a/data/interfaces/default/settings.html +++ b/data/interfaces/default/settings.html @@ -111,6 +111,7 @@ available_notification_agents = sorted(notifiers.available_notification_agents() + diff --git a/plexpy/config.py b/plexpy/config.py index 491f2081..664a69ec 100644 --- a/plexpy/config.py +++ b/plexpy/config.py @@ -98,7 +98,8 @@ _CONFIG_DEFINITIONS = { 'HOME_STATS_LENGTH': (int, 'General', 30), 'HOME_STATS_TYPE': (int, 'General', 0), 'HOME_STATS_COUNT': (int, 'General', 5), - 'HOME_STATS_CARDS': (str, 'General', 'watch_statistics, top_tv, popular_tv, top_movies, popular_movies, top_music, popular_music, top_users, top_platforms, last_watched'), + 'HOME_STATS_CARDS': (str, 'General', 'watch_statistics, top_tv, popular_tv, top_movies, popular_movies, ' \ + 'top_music, popular_music, last_watched, top_users, top_platforms, most_concurrent'), 'HTTPS_CERT': (str, 'General', ''), 'HTTPS_KEY': (str, 'General', ''), 'HTTP_HOST': (str, 'General', '0.0.0.0'), diff --git a/plexpy/datafactory.py b/plexpy/datafactory.py index 8d797fae..d1b656e5 100644 --- a/plexpy/datafactory.py +++ b/plexpy/datafactory.py @@ -589,6 +589,38 @@ class DataFactory(object): home_stats.append({'stat_id': stat, 'rows': last_watched}) + elif stat == 'most_concurrent': + try: + query = 'SELECT started, stopped ' \ + 'FROM session_history ' + result = monitor_db.select(query) + except: + logger.warn("Unable to execute database query for get_home_stats: most_concurrent.") + return None + + times = {} + for item in result: + times.update({str(item['stopped']) + 'A': -1, str(item['started']) + 'B': 1}) + + count = 0 + last_start = 0 + most_concurrent = {'count': count} + + for key in sorted(times): + if times[key] == 1: + count += times[key] + if count >= most_concurrent['count']: + last_start = key + else: + if count >= most_concurrent['count']: + most_concurrent = {'count': count, + 'started': last_start[:-1], + 'stopped': key[:-1]} + count += times[key] + + home_stats.append({'stat_id': stat, + 'rows': [most_concurrent]}) + return home_stats def get_stream_details(self, row_id=None):