add most active libraries and total plays to home

This commit is contained in:
herby2212 2021-03-01 21:54:14 +01:00
parent 63866e8b52
commit 4e959be84d
5 changed files with 62 additions and 7 deletions

View file

@ -25,7 +25,7 @@ grandparent_thumb Returns location of the item's thumbnail. Use with pms_i
rating_key Returns the unique identifier for the media item. rating_key Returns the unique identifier for the media item.
title Returns the title for the associated stat. title Returns the title for the associated stat.
== Only if 'stat_id' is 'top_tv' or 'top_movies' or 'top_music' or 'top_user' or 'top_platform' == == Only if 'stat_id' is 'top_tv' or 'top_movies' or 'top_music' or 'top_user' or 'top_platform' or 'top_libraries' ==
total_plays Returns the count for the associated stat. total_plays Returns the count for the associated stat.
total_duration Returns the total duration for the associated stat. total_duration Returns the total duration for the associated stat.
@ -111,6 +111,8 @@ DOCUMENTATION :: END
<div id="stats-thumb-${stat_id}" class="dashboard-stats-flat svg-icon platform-${row0['platform_name']} transparent hidden-xs"></div> <div id="stats-thumb-${stat_id}" class="dashboard-stats-flat svg-icon platform-${row0['platform_name']} transparent hidden-xs"></div>
% elif stat_id == 'most_concurrent': % elif stat_id == 'most_concurrent':
<div id="stats-thumb-${stat_id}" class="dashboard-stats-flat svg-icon stats-${stat_id} transparent hidden-xs"></div> <div id="stats-thumb-${stat_id}" class="dashboard-stats-flat svg-icon stats-${stat_id} transparent hidden-xs"></div>
% elif stat_id == 'top_libraries':
<div id="stats-thumb-${stat_id}" class="dashboard-stats-flat svg-icon library-${row0['type']} hidden-xs"></div>
% endif % endif
<div class="dashboard-stats-info-container"> <div class="dashboard-stats-info-container">
<div id="stats-title-${stat_id}" class="dashboard-stats-info-title"> <div id="stats-title-${stat_id}" class="dashboard-stats-info-title">
@ -133,7 +135,7 @@ DOCUMENTATION :: END
% for row in top_stat['rows']: % for row in top_stat['rows']:
<li class="dashboard-stats-info-item ${'expanded' if loop.index == 0 else ''}" data-stat_id="${stat_id}" <li class="dashboard-stats-info-item ${'expanded' if loop.index == 0 else ''}" data-stat_id="${stat_id}"
data-rating_key="${row.get('rating_key')}" data-guid="${row.get('guid')}" data-title="${row.get('title')}" data-rating_key="${row.get('rating_key')}" data-guid="${row.get('guid')}" data-title="${row.get('title')}"
data-art="${row.get('art')}" data-thumb="${row.get('thumb')}" data-platform="${row.get('platform_name')}" data-art="${row.get('art')}" data-thumb="${row.get('thumb')}" data-platform="${row.get('platform_name')}" data-library-type="${row.get('type')}"
data-user_id="${row.get('user_id')}" data-user="${row.get('user')}" data-friendly_name="${row.get('friendly_name')}" data-user_thumb="${row.get('user_thumb')}" data-user_id="${row.get('user_id')}" data-user="${row.get('user')}" data-friendly_name="${row.get('friendly_name')}" data-user_thumb="${row.get('user_thumb')}"
data-last_watch="${row.get('last_watch')}" data-started="${row.get('started')}" data-live="${row.get('live')}"> data-last_watch="${row.get('last_watch')}" data-started="${row.get('started')}" data-live="${row.get('live')}">
<div class="sub-list">${loop.index + 1}</div> <div class="sub-list">${loop.index + 1}</div>
@ -159,6 +161,8 @@ DOCUMENTATION :: END
${row['platform']} ${row['platform']}
% elif stat_id == 'most_concurrent': % elif stat_id == 'most_concurrent':
${row['title']} ${row['title']}
% elif stat_id == 'top_libraries':
${row['library_name']}
% endif % endif
</div> </div>
<div class="sub-count"> <div class="sub-count">

View file

@ -810,6 +810,10 @@
$('#stats-background-' + stat_id).removeClass(function (index, className) { $('#stats-background-' + stat_id).removeClass(function (index, className) {
return (className.match (/(^|\s)platform-\S+/g) || []).join(' '); return (className.match (/(^|\s)platform-\S+/g) || []).join(' ');
}).addClass('platform-' + $(elem).data('platform') + '-rgba'); }).addClass('platform-' + $(elem).data('platform') + '-rgba');
} else if (stat_id == 'top_libraries') {
$('#stats-thumb-' + stat_id).removeClass(function (index, className) {
return (className.match (/(^|\s)library-\S+/g) || []).join(' ');
}).addClass('library-' + $(elem).data('library-type'));
} else { } else {
if (rating_key) { if (rating_key) {
if (live) { if (live) {

View file

@ -19,6 +19,7 @@ thumb Returns the thumb of the library.
count Returns the number of top level items in the library. count Returns the number of top level items in the library.
parent_count Returns the number of parent items in the library. parent_count Returns the number of parent items in the library.
child_count Returns the number of child items in the library. child_count Returns the number of child items in the library.
total_plays Returns the number of total plays of the library.
DOCUMENTATION :: END DOCUMENTATION :: END
</%doc> </%doc>
@ -28,9 +29,9 @@ DOCUMENTATION :: END
from plexpy.helpers import page from plexpy.helpers import page
types = ('movie', 'show', 'artist', 'photo') types = ('movie', 'show', 'artist', 'photo')
headers = {'movie': ('Movie Libraries', ('Movies', '', '')), headers = {'movie': ('Movie Libraries', ('Movies', '', '', 'Total Plays')),
'show': ('TV Show Libraries', ('Shows', 'Seasons', 'Episodes')), 'show': ('TV Show Libraries', ('Shows', 'Seasons', 'Episodes', 'Total Plays')),
'artist': ('Music Libraries', ('Artists', 'Albums', 'Tracks')), 'artist': ('Music Libraries', ('Artists', 'Albums', 'Tracks', 'Total Plays')),
'photo': ('Photo Libraries', ('Albums', 'Photos', 'Videos'))} 'photo': ('Photo Libraries', ('Albums', 'Photos', 'Videos'))}
%> %>
% for section_type in types: % for section_type in types:
@ -80,6 +81,12 @@ DOCUMENTATION :: END
${section['grandchild_count']} ${section['grandchild_count']}
</div> </div>
% endif % endif
% if headers[section_type][1][3]:
<div class="sub-divider"> / </div>
<div class="sub-count">
${section['total_plays']}
</div>
% endif
</li> </li>
% endfor % endfor
</ul> </ul>

View file

@ -114,7 +114,7 @@ _CONFIG_DEFINITIONS = {
'HOME_SECTIONS': (list, 'General', ['current_activity', 'watch_stats', 'library_stats', 'recently_added']), 'HOME_SECTIONS': (list, 'General', ['current_activity', 'watch_stats', 'library_stats', 'recently_added']),
'HOME_LIBRARY_CARDS': (list, 'General', ['first_run']), 'HOME_LIBRARY_CARDS': (list, 'General', ['first_run']),
'HOME_STATS_CARDS': (list, 'General', ['top_movies', 'popular_movies', 'top_tv', 'popular_tv', 'top_music', 'HOME_STATS_CARDS': (list, 'General', ['top_movies', 'popular_movies', 'top_tv', 'popular_tv', 'top_music',
'popular_music', 'last_watched', 'top_users', 'top_platforms', 'most_concurrent']), 'popular_music', 'last_watched', 'top_users', 'top_platforms', 'most_concurrent', 'top_libraries']),
'HOME_REFRESH_INTERVAL': (int, 'General', 10), 'HOME_REFRESH_INTERVAL': (int, 'General', 10),
'HTTPS_CREATE_CERT': (int, 'General', 1), 'HTTPS_CREATE_CERT': (int, 'General', 1),
'HTTPS_CERT': (str, 'General', ''), 'HTTPS_CERT': (str, 'General', ''),

View file

@ -29,11 +29,13 @@ if plexpy.PYTHON2:
import common import common
import database import database
import datatables import datatables
import libraries
import helpers import helpers
import logger import logger
import pmsconnect import pmsconnect
import session import session
else: else:
from plexpy import libraries
from plexpy import common from plexpy import common
from plexpy import database from plexpy import database
from plexpy import datatables from plexpy import datatables
@ -888,6 +890,39 @@ class DataFactory(object):
'stat_title': 'Most Concurrent Streams', 'stat_title': 'Most Concurrent Streams',
'rows': most_concurrent}) 'rows': most_concurrent})
elif stat == 'top_libraries':
top_libraries = []
try:
query = 'SELECT section_id, section_name, section_type ' \
'FROM library_sections'
result = monitor_db.select(query)
except Exception as e:
logger.warn("Tautulli DataFactory :: Unable to execute database query for get_home_stats: top_libraries: %s." % e)
return None
library_data = libraries.Libraries()
for item in result:
library_item = library_data.get_watch_time_stats(section_id=item['section_id'], grouping=None , query_days=time_range)
row = {
'total_plays': library_item[0]['total_plays'],
'total_duration': library_item[0]['total_time'],
'type': item['section_type'],
'library_name': item['section_name']
}
top_libraries.append(row)
home_stats.append({
'stat_id': stat,
'stat_type': sort_type,
'stat_title': 'Most Active Libraries',
'rows': session.mask_session_info(sorted(top_libraries, key=lambda k: k[sort_type], reverse=True), mask_metadata=False)
})
if stat_id and home_stats: if stat_id and home_stats:
return home_stats[0] return home_stats[0]
return home_stats return home_stats
@ -915,7 +950,11 @@ class DataFactory(object):
logger.warn("Tautulli DataFactory :: Unable to execute database query for get_library_stats: %s." % e) logger.warn("Tautulli DataFactory :: Unable to execute database query for get_library_stats: %s." % e)
return None return None
library_data = libraries.Libraries()
for item in result: for item in result:
library_item = library_data.get_watch_time_stats(section_id=item['section_id'], grouping=None , query_days='0')
if item['custom_thumb'] and item['custom_thumb'] != item['library_thumb']: if item['custom_thumb'] and item['custom_thumb'] != item['library_thumb']:
library_thumb = item['custom_thumb'] library_thumb = item['custom_thumb']
elif item['library_thumb']: elif item['library_thumb']:
@ -935,7 +974,8 @@ class DataFactory(object):
'art': library_art, 'art': library_art,
'count': item['count'], 'count': item['count'],
'child_count': item['parent_count'], 'child_count': item['parent_count'],
'grandchild_count': item['child_count'] 'grandchild_count': item['child_count'],
'total_plays': library_item[0]['total_plays']
} }
library_stats.append(library) library_stats.append(library)