mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-30 03:28:31 -07:00
add most active libraries and total plays to home
This commit is contained in:
parent
63866e8b52
commit
4e959be84d
5 changed files with 62 additions and 7 deletions
|
@ -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.
|
||||
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_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>
|
||||
% elif stat_id == 'most_concurrent':
|
||||
<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
|
||||
<div class="dashboard-stats-info-container">
|
||||
<div id="stats-title-${stat_id}" class="dashboard-stats-info-title">
|
||||
|
@ -133,7 +135,7 @@ DOCUMENTATION :: END
|
|||
% for row in top_stat['rows']:
|
||||
<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-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-last_watch="${row.get('last_watch')}" data-started="${row.get('started')}" data-live="${row.get('live')}">
|
||||
<div class="sub-list">${loop.index + 1}</div>
|
||||
|
@ -159,6 +161,8 @@ DOCUMENTATION :: END
|
|||
${row['platform']}
|
||||
% elif stat_id == 'most_concurrent':
|
||||
${row['title']}
|
||||
% elif stat_id == 'top_libraries':
|
||||
${row['library_name']}
|
||||
% endif
|
||||
</div>
|
||||
<div class="sub-count">
|
||||
|
|
|
@ -810,6 +810,10 @@
|
|||
$('#stats-background-' + stat_id).removeClass(function (index, className) {
|
||||
return (className.match (/(^|\s)platform-\S+/g) || []).join(' ');
|
||||
}).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 {
|
||||
if (rating_key) {
|
||||
if (live) {
|
||||
|
|
|
@ -19,6 +19,7 @@ thumb Returns the thumb of the library.
|
|||
count Returns the number of top level 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.
|
||||
total_plays Returns the number of total plays of the library.
|
||||
|
||||
DOCUMENTATION :: END
|
||||
</%doc>
|
||||
|
@ -28,9 +29,9 @@ DOCUMENTATION :: END
|
|||
from plexpy.helpers import page
|
||||
|
||||
types = ('movie', 'show', 'artist', 'photo')
|
||||
headers = {'movie': ('Movie Libraries', ('Movies', '', '')),
|
||||
'show': ('TV Show Libraries', ('Shows', 'Seasons', 'Episodes')),
|
||||
'artist': ('Music Libraries', ('Artists', 'Albums', 'Tracks')),
|
||||
headers = {'movie': ('Movie Libraries', ('Movies', '', '', 'Total Plays')),
|
||||
'show': ('TV Show Libraries', ('Shows', 'Seasons', 'Episodes', 'Total Plays')),
|
||||
'artist': ('Music Libraries', ('Artists', 'Albums', 'Tracks', 'Total Plays')),
|
||||
'photo': ('Photo Libraries', ('Albums', 'Photos', 'Videos'))}
|
||||
%>
|
||||
% for section_type in types:
|
||||
|
@ -80,6 +81,12 @@ DOCUMENTATION :: END
|
|||
${section['grandchild_count']}
|
||||
</div>
|
||||
% endif
|
||||
% if headers[section_type][1][3]:
|
||||
<div class="sub-divider"> / </div>
|
||||
<div class="sub-count">
|
||||
${section['total_plays']}
|
||||
</div>
|
||||
% endif
|
||||
</li>
|
||||
% endfor
|
||||
</ul>
|
||||
|
|
|
@ -114,7 +114,7 @@ _CONFIG_DEFINITIONS = {
|
|||
'HOME_SECTIONS': (list, 'General', ['current_activity', 'watch_stats', 'library_stats', 'recently_added']),
|
||||
'HOME_LIBRARY_CARDS': (list, 'General', ['first_run']),
|
||||
'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),
|
||||
'HTTPS_CREATE_CERT': (int, 'General', 1),
|
||||
'HTTPS_CERT': (str, 'General', ''),
|
||||
|
|
|
@ -29,11 +29,13 @@ if plexpy.PYTHON2:
|
|||
import common
|
||||
import database
|
||||
import datatables
|
||||
import libraries
|
||||
import helpers
|
||||
import logger
|
||||
import pmsconnect
|
||||
import session
|
||||
else:
|
||||
from plexpy import libraries
|
||||
from plexpy import common
|
||||
from plexpy import database
|
||||
from plexpy import datatables
|
||||
|
@ -888,6 +890,39 @@ class DataFactory(object):
|
|||
'stat_title': 'Most Concurrent Streams',
|
||||
'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:
|
||||
return home_stats[0]
|
||||
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)
|
||||
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='0')
|
||||
|
||||
if item['custom_thumb'] and item['custom_thumb'] != item['library_thumb']:
|
||||
library_thumb = item['custom_thumb']
|
||||
elif item['library_thumb']:
|
||||
|
@ -935,7 +974,8 @@ class DataFactory(object):
|
|||
'art': library_art,
|
||||
'count': item['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)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue