mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-16 02:02:58 -07:00
Group library statistic cards by library type
This commit is contained in:
parent
b22ae58f79
commit
359273e26e
4 changed files with 83 additions and 81 deletions
|
@ -1188,6 +1188,9 @@ a .dashboard-activity-metadata-user-thumb:hover {
|
|||
-webkit-flex-grow: 1;
|
||||
flex-grow: 1;
|
||||
}
|
||||
.dashboard-stats-info-title.library h4 {
|
||||
flex-basis: 200px;
|
||||
}
|
||||
.dashboard-stats-info-title .dashboard-stats-stats-units {
|
||||
color: #aaa;
|
||||
font-size: 12px;
|
||||
|
@ -1198,6 +1201,9 @@ a .dashboard-activity-metadata-user-thumb:hover {
|
|||
white-space: nowrap;
|
||||
max-width: 125px;
|
||||
}
|
||||
.dashboard-stats-info-title .dashboard-stats-stats-units.library {
|
||||
max-width: 200px;
|
||||
}
|
||||
.dashboard-stats-info-scroller {
|
||||
height: 120px;
|
||||
width: 100%;
|
||||
|
@ -1238,7 +1244,7 @@ a .dashboard-activity-metadata-user-thumb:hover {
|
|||
.dashboard-stats-info-item:last-of-type {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.dashboard-stats-info-item .sub-heading {
|
||||
.dashboard-stats-info-item .sub-list {
|
||||
height: 100%;
|
||||
width: 15px;
|
||||
color: #aaa;
|
||||
|
@ -1269,6 +1275,16 @@ a .dashboard-activity-metadata-user-thumb:hover {
|
|||
-webkit-flex-shrink: 0;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.dashboard-stats-info-item .sub-divider {
|
||||
height: 100%;
|
||||
margin-left: 10px;
|
||||
color: #aaa;
|
||||
font-size: 12px;
|
||||
text-align: left;
|
||||
text-transform: uppercase;
|
||||
-webkit-flex-shrink: 0;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.dashboard-stats-info-item.expanded {
|
||||
padding: 5px 5px;
|
||||
line-height: 20px;
|
||||
|
@ -1282,6 +1298,9 @@ a .dashboard-activity-metadata-user-thumb:hover {
|
|||
.dashboard-stats-info-item.expanded .sub-count {
|
||||
font-size: 16px;
|
||||
}
|
||||
.dashboard-stats-info-item.expanded .sub-divider {
|
||||
font-size: 16px;
|
||||
}
|
||||
.dashboard-stats-info-item:hover {
|
||||
background-color: rgba(255,255,255,0.05);
|
||||
}
|
||||
|
|
|
@ -126,7 +126,7 @@ DOCUMENTATION :: END
|
|||
data-art="${row.get('art')}" data-thumb="${row.get('thumb')}" data-platform="${row.get('platform_type')}"
|
||||
data-user_id="${row.get('user_id')}" data-friendly_name="${row.get('friendly_name')}"
|
||||
data-last_watch="${row.get('last_watch')}" data-started="${row.get('started')}">
|
||||
<div class="sub-heading">${loop.index + 1}</div>
|
||||
<div class="sub-list">${loop.index + 1}</div>
|
||||
<div class="sub-value">
|
||||
% if stat_id in ('top_movies', 'popular_movies', 'top_tv', 'popular_tv', 'top_music', 'popular_music', 'last_watched'):
|
||||
% if top_stat['rows'][loop.index]['rating_key']:
|
||||
|
|
|
@ -24,75 +24,55 @@ DOCUMENTATION :: END
|
|||
</%doc>
|
||||
|
||||
% if data:
|
||||
% for library in data:
|
||||
<%
|
||||
section_id = library['section_id']
|
||||
types = ('movie', 'show', 'artist', 'photo')
|
||||
headers = {'movie': ('Movie Libraries', ('Movies', '', '')),
|
||||
'show': ('TV Show Libraries', ('Shows', 'Seasons', 'Episodes')),
|
||||
'artist': ('Music Libraries', ('Artists', 'Albums', 'Tracks')),
|
||||
'photo': ('Photo Libraries', ('Albums', '', 'Photos'))}
|
||||
%>
|
||||
<div class="dashboard-stats-instance" id="library-stats-instance-${section_id}" data-section_id="${section_id}">
|
||||
% for section_type in types:
|
||||
% if section_type in data:
|
||||
<div class="dashboard-stats-instance" id="library-stats-instance-${section_type}" data-section_type="${section_type}">
|
||||
<div class="dashboard-stats-container">
|
||||
<div class="dashboard-stats-background-overlay">
|
||||
<div id="library-stats-background-${section_id}" class="dashboard-stats-background" style="background-image: url(pms_image_proxy?img=${library['art']}&width=500&height=280&fallback=art);"></div>
|
||||
<a href="library?section_id=${library['section_id']}" title="${library['section_name']}">
|
||||
% if library['thumb'].startswith("http"):
|
||||
<div id="library-stats-thumb-${section_id}" class="dashboard-stats-library hidden-xs" style="background-image: url(${library['thumb']});"></div>
|
||||
% else:
|
||||
<div id="library-stats-thumb-${section_id}" class="dashboard-stats-library hidden-xs" style="background-image: url(pms_image_proxy?img=${library['thumb']}&width=300&height=300&fallback=cover);"></div>
|
||||
% endif
|
||||
</a>
|
||||
<div id="library-stats-background-${section_type}" class="dashboard-stats-background" style="background-image: url(pms_image_proxy?img=/:/resources/${section_type}-fanart.jpg&width=500&height=280&fallback=art);"></div>
|
||||
<div id="library-stats-thumb-${section_type}" class="dashboard-stats-library hidden-xs" style="background-image: url(pms_image_proxy?img=/:/resources/${section_type}.png&width=300&height=300&fallback=cover);"></div>
|
||||
<div class="dashboard-stats-info-container">
|
||||
<div id="library-stats-title-${section_id}" class="dashboard-stats-info-title">
|
||||
<h4>
|
||||
<a href="library?section_id=${library['section_id']}" title="${library['section_name']}">${library['section_name']}</a>
|
||||
</h4>
|
||||
<span class="dashboard-stats-stats-units">items</span>
|
||||
<div id="library-stats-title-${section_type}" class="dashboard-stats-info-title library">
|
||||
<h4>${headers[section_type][0]}</h4>
|
||||
<span class="dashboard-stats-stats-units library">${' / '.join(u for u in headers[section_type][1] if u)}</span>
|
||||
</div>
|
||||
<div class="dashboard-stats-info-scroller scrollbar-macosx">
|
||||
<div class="dashboard-stats-info scoller-content">
|
||||
<ul class="list-unstyled dashboard-stats-info-list">
|
||||
<%
|
||||
h1 = h2 = h3 = ''
|
||||
if library['section_type'] == 'movie':
|
||||
h1 = 'Movies'
|
||||
if library['section_type'] == 'show':
|
||||
h1, h2, h3 = 'Shows', 'Seasons', 'Episodes'
|
||||
elif library['section_type'] == 'artist':
|
||||
h1, h2, h3 = 'Artists', 'Albums', 'Tracks'
|
||||
elif library['section_type'] == 'photo':
|
||||
h1, h3 = 'Albums', 'Photos'
|
||||
%>
|
||||
% if h1:
|
||||
<li class="dashboard-stats-info-item expanded">
|
||||
<div class="sub-heading">•</div>
|
||||
% for section in data[section_type]:
|
||||
<li class="dashboard-stats-info-item ${'expanded' if loop.index == 0 else ''}">
|
||||
<div class="sub-list">${loop.index + 1}</div>
|
||||
<div class="sub-value">
|
||||
${h1}
|
||||
<a href="library?section_id=${section['section_id']}" title="${section['section_name']}">
|
||||
${section['section_name']}
|
||||
</a>
|
||||
</div>
|
||||
% if headers[section_type][1][0]:
|
||||
<div class="sub-count">
|
||||
${library['count']}
|
||||
${section['count']}
|
||||
</div>
|
||||
</li>
|
||||
% endif
|
||||
% if h2:
|
||||
<li class="dashboard-stats-info-item expanded">
|
||||
<div class="sub-heading">•</div>
|
||||
<div class="sub-value">
|
||||
${h2}
|
||||
</div>
|
||||
% if headers[section_type][1][1]:
|
||||
<div class="sub-divider"> / </div>
|
||||
<div class="sub-count">
|
||||
${library['parent_count']}
|
||||
${section['child_count']}
|
||||
</div>
|
||||
</li>
|
||||
% endif
|
||||
% if h3:
|
||||
<li class="dashboard-stats-info-item expanded">
|
||||
<div class="sub-heading">•</div>
|
||||
<div class="sub-value">
|
||||
${h3}
|
||||
</div>
|
||||
% if headers[section_type][1][2]:
|
||||
<div class="sub-divider"> / </div>
|
||||
<div class="sub-count">
|
||||
${library['child_count']}
|
||||
${section['grandchild_count']}
|
||||
</div>
|
||||
</li>
|
||||
% endif
|
||||
</li>
|
||||
% endfor
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -100,6 +80,7 @@ DOCUMENTATION :: END
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
% endif
|
||||
% endfor
|
||||
% else:
|
||||
<div class="text-muted">No stats to show.</div><br>
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
# along with PlexPy. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import json
|
||||
from itertools import groupby
|
||||
|
||||
import plexpy
|
||||
import common
|
||||
|
@ -832,13 +833,12 @@ class DataFactory(object):
|
|||
|
||||
library_stats = []
|
||||
|
||||
for id in library_cards:
|
||||
if id.isdigit():
|
||||
try:
|
||||
query = 'SELECT section_id, section_name, section_type, thumb AS library_thumb, ' \
|
||||
'custom_thumb_url AS custom_thumb, art, count, parent_count, child_count ' \
|
||||
'FROM library_sections ' \
|
||||
'WHERE section_id = %s ' % id
|
||||
'WHERE section_id IN (%s) ' \
|
||||
'ORDER BY section_type, count DESC, parent_count DESC, child_count DESC ' % ','.join(library_cards)
|
||||
result = monitor_db.select(query)
|
||||
except Exception as e:
|
||||
logger.warn(u"PlexPy DataFactory :: Unable to execute database query for get_library_stats: %s." % e)
|
||||
|
@ -858,11 +858,13 @@ class DataFactory(object):
|
|||
'thumb': library_thumb,
|
||||
'art': item['art'],
|
||||
'count': item['count'],
|
||||
'parent_count': item['parent_count'],
|
||||
'child_count': item['child_count']
|
||||
'child_count': item['parent_count'],
|
||||
'grandchild_count': item['child_count']
|
||||
}
|
||||
library_stats.append(library)
|
||||
|
||||
library_stats = {k: list(v) for k, v in groupby(library_stats, key=lambda x: x['section_type'])}
|
||||
|
||||
return library_stats
|
||||
|
||||
def get_stream_details(self, row_id=None, session_key=None):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue