mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-12 16:22:57 -07:00
Add total duration to libraries and users tables
This commit is contained in:
parent
6ebfc516a6
commit
71131c699e
8 changed files with 82 additions and 7 deletions
|
@ -2180,6 +2180,10 @@ a .home-platforms-instance-list-oval:hover,
|
||||||
.refresh-libraries-button {
|
.refresh-libraries-button {
|
||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
.refresh-users-button,
|
||||||
|
.refresh-libraries-button {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
.nav-settings,
|
.nav-settings,
|
||||||
.nav-settings ul {
|
.nav-settings ul {
|
||||||
margin: 0px 0px 20px 0px;
|
margin: 0px 0px 20px 0px;
|
||||||
|
|
|
@ -252,13 +252,13 @@ function isPrivateIP(ip_address) {
|
||||||
|
|
||||||
function humanTime(seconds) {
|
function humanTime(seconds) {
|
||||||
if (seconds >= 86400) {
|
if (seconds >= 86400) {
|
||||||
text = '<h3>' + Math.floor(moment.duration(seconds, 'seconds').asDays()) +
|
text = '<h3>' + Math.floor(moment.duration(seconds, 'seconds').asDays()) + '</h3><p> days</p>' +
|
||||||
'</h3><p> days </p><h3>' + Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) +
|
'<h3>' + Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) + '</h3><p> hrs</p>' +
|
||||||
'</h3><p> hrs</p><h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>';
|
'<h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>';
|
||||||
return text;
|
return text;
|
||||||
} else if (seconds >= 3600) {
|
} else if (seconds >= 3600) {
|
||||||
text = '<h3>' + Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) +
|
text = '<h3>' + Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) + '</h3><p> hrs</p>' +
|
||||||
'</h3><p>hrs</p><h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>';
|
'<h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>';
|
||||||
return text;
|
return text;
|
||||||
} else if (seconds >= 60) {
|
} else if (seconds >= 60) {
|
||||||
text = '<h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>';
|
text = '<h3>' + Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + '</h3><p> mins</p>';
|
||||||
|
@ -269,6 +269,25 @@ function humanTime(seconds) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function humanTimeClean(seconds) {
|
||||||
|
if (seconds >= 86400) {
|
||||||
|
text = Math.floor(moment.duration(seconds, 'seconds').asDays()) + ' days ' +
|
||||||
|
Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) + ' hrs ' +
|
||||||
|
Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + ' mins';
|
||||||
|
return text;
|
||||||
|
} else if (seconds >= 3600) {
|
||||||
|
text = Math.floor(moment.duration((seconds % 86400), 'seconds').asHours()) + ' hrs ' +
|
||||||
|
Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + ' mins';
|
||||||
|
return text;
|
||||||
|
} else if (seconds >= 60) {
|
||||||
|
text = Math.floor(moment.duration(((seconds % 86400) % 3600), 'seconds').asMinutes()) + ' mins';
|
||||||
|
return text;
|
||||||
|
} else {
|
||||||
|
text = '0';
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
String.prototype.toProperCase = function () {
|
String.prototype.toProperCase = function () {
|
||||||
return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
|
return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
|
||||||
};
|
};
|
||||||
|
|
|
@ -161,12 +161,28 @@ libraries_list_table_options = {
|
||||||
$(td).html('n/a');
|
$(td).html('n/a');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"width": "25%",
|
"width": "18%",
|
||||||
"className": "hidden-sm hidden-xs"
|
"className": "hidden-sm hidden-xs"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"targets": [9],
|
"targets": [9],
|
||||||
"data": "plays",
|
"data": "plays",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== null && cellData !== '') {
|
||||||
|
$(td).html(cellData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"searchable": false,
|
||||||
|
"width": "7%"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targets": [10],
|
||||||
|
"data": "duration",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== null && cellData !== '') {
|
||||||
|
$(td).html(humanTimeClean(cellData));
|
||||||
|
}
|
||||||
|
},
|
||||||
"searchable": false,
|
"searchable": false,
|
||||||
"width": "10%"
|
"width": "10%"
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,12 +165,28 @@ users_list_table_options = {
|
||||||
$(td).html('n/a');
|
$(td).html('n/a');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"width": "30%",
|
"width": "23%",
|
||||||
"className": "hidden-sm hidden-xs"
|
"className": "hidden-sm hidden-xs"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"targets": [8],
|
"targets": [8],
|
||||||
"data": "plays",
|
"data": "plays",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== null && cellData !== '') {
|
||||||
|
$(td).html(cellData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"searchable": false,
|
||||||
|
"width": "7%"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targets": [9],
|
||||||
|
"data": "duration",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== null && cellData !== '') {
|
||||||
|
$(td).html(humanTimeClean(cellData));
|
||||||
|
}
|
||||||
|
},
|
||||||
"searchable": false,
|
"searchable": false,
|
||||||
"width": "10%"
|
"width": "10%"
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
<%def name="headIncludes()">
|
<%def name="headIncludes()">
|
||||||
<link rel="stylesheet" href="interfaces/default/css/dataTables.bootstrap.css">
|
<link rel="stylesheet" href="interfaces/default/css/dataTables.bootstrap.css">
|
||||||
|
<link rel="stylesheet" href="interfaces/default/css/dataTables.colVis.css">
|
||||||
<link rel="stylesheet" href="interfaces/default/css/plexpy-dataTables.css">
|
<link rel="stylesheet" href="interfaces/default/css/plexpy-dataTables.css">
|
||||||
</%def>
|
</%def>
|
||||||
|
|
||||||
|
@ -23,6 +24,7 @@
|
||||||
<span><i class="fa fa-book"></i> All Libraries</span>
|
<span><i class="fa fa-book"></i> All Libraries</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="button-bar">
|
<div class="button-bar">
|
||||||
|
<div class="colvis-button-bar hidden-xs"></div>
|
||||||
% if config['update_section_ids'] == -1:
|
% if config['update_section_ids'] == -1:
|
||||||
<button class="btn btn-dark refresh-libraries-button" id="refresh-libraries-list" disabled><i class="fa fa-refresh"></i> Refresh libraries</button>
|
<button class="btn btn-dark refresh-libraries-button" id="refresh-libraries-list" disabled><i class="fa fa-refresh"></i> Refresh libraries</button>
|
||||||
% else:
|
% else:
|
||||||
|
@ -48,6 +50,7 @@
|
||||||
<th align="left" id="last_accessed">Last Accessed</th>
|
<th align="left" id="last_accessed">Last Accessed</th>
|
||||||
<th align="left" id="last_played">Last Played</th>
|
<th align="left" id="last_played">Last Played</th>
|
||||||
<th align="left" id="total_plays">Total Plays</th>
|
<th align="left" id="total_plays">Total Plays</th>
|
||||||
|
<th align="left" id="total_duration">Total Duration</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
@ -79,6 +82,7 @@
|
||||||
|
|
||||||
<%def name="javascriptIncludes()">
|
<%def name="javascriptIncludes()">
|
||||||
<script src="interfaces/default/js/jquery.dataTables.min.js"></script>
|
<script src="interfaces/default/js/jquery.dataTables.min.js"></script>
|
||||||
|
<script src="interfaces/default/js/dataTables.colVis.js"></script>
|
||||||
<script src="interfaces/default/js/dataTables.bootstrap.min.js"></script>
|
<script src="interfaces/default/js/dataTables.bootstrap.min.js"></script>
|
||||||
<script src="interfaces/default/js/dataTables.bootstrap.pagination.js"></script>
|
<script src="interfaces/default/js/dataTables.bootstrap.pagination.js"></script>
|
||||||
<script src="interfaces/default/js/moment-with-locale.js"></script>
|
<script src="interfaces/default/js/moment-with-locale.js"></script>
|
||||||
|
@ -96,6 +100,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
libraries_list_table = $('#libraries_list_table').DataTable(libraries_list_table_options);
|
libraries_list_table = $('#libraries_list_table').DataTable(libraries_list_table_options);
|
||||||
|
var colvis = new $.fn.dataTable.ColVis(libraries_list_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark', exclude: [0, 1] });
|
||||||
|
$(colvis.button()).appendTo('div.colvis-button-bar');
|
||||||
|
|
||||||
clearSearchButton('libraries_list_table', libraries_list_table);
|
clearSearchButton('libraries_list_table', libraries_list_table);
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
<%def name="headIncludes()">
|
<%def name="headIncludes()">
|
||||||
<link rel="stylesheet" href="interfaces/default/css/dataTables.bootstrap.css">
|
<link rel="stylesheet" href="interfaces/default/css/dataTables.bootstrap.css">
|
||||||
|
<link rel="stylesheet" href="interfaces/default/css/dataTables.colVis.css">
|
||||||
<link rel="stylesheet" href="interfaces/default/css/plexpy-dataTables.css">
|
<link rel="stylesheet" href="interfaces/default/css/plexpy-dataTables.css">
|
||||||
</%def>
|
</%def>
|
||||||
|
|
||||||
|
@ -12,6 +13,7 @@
|
||||||
<span><i class="fa fa-group"></i> All Users</span>
|
<span><i class="fa fa-group"></i> All Users</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="button-bar">
|
<div class="button-bar">
|
||||||
|
<div class="colvis-button-bar hidden-xs"></div>
|
||||||
<button class="btn btn-dark refresh-users-button" id="refresh-users-list"><i class="fa fa-refresh"></i> Refresh users</button>
|
<button class="btn btn-dark refresh-users-button" id="refresh-users-list"><i class="fa fa-refresh"></i> Refresh users</button>
|
||||||
<button class="btn btn-danger btn-edit" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode">
|
<button class="btn btn-danger btn-edit" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode">
|
||||||
<i class="fa fa-pencil"></i> Edit mode
|
<i class="fa fa-pencil"></i> Edit mode
|
||||||
|
@ -32,6 +34,7 @@
|
||||||
<th align="left" id="last_player">Last Player</th>
|
<th align="left" id="last_player">Last Player</th>
|
||||||
<th align="left" id="last_played">Last Played</th>
|
<th align="left" id="last_played">Last Played</th>
|
||||||
<th align="left" id="total_plays">Total Plays</th>
|
<th align="left" id="total_plays">Total Plays</th>
|
||||||
|
<th align="left" id="total_duration">Total Duration</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
@ -67,6 +70,7 @@
|
||||||
|
|
||||||
<%def name="javascriptIncludes()">
|
<%def name="javascriptIncludes()">
|
||||||
<script src="interfaces/default/js/jquery.dataTables.min.js"></script>
|
<script src="interfaces/default/js/jquery.dataTables.min.js"></script>
|
||||||
|
<script src="interfaces/default/js/dataTables.colVis.js"></script>
|
||||||
<script src="interfaces/default/js/dataTables.bootstrap.min.js"></script>
|
<script src="interfaces/default/js/dataTables.bootstrap.min.js"></script>
|
||||||
<script src="interfaces/default/js/dataTables.bootstrap.pagination.js"></script>
|
<script src="interfaces/default/js/dataTables.bootstrap.pagination.js"></script>
|
||||||
<script src="interfaces/default/js/moment-with-locale.js"></script>
|
<script src="interfaces/default/js/moment-with-locale.js"></script>
|
||||||
|
@ -84,6 +88,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
users_list_table = $('#users_list_table').DataTable(users_list_table_options);
|
users_list_table = $('#users_list_table').DataTable(users_list_table_options);
|
||||||
|
var colvis = new $.fn.dataTable.ColVis(users_list_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark', exclude: [0, 1] });
|
||||||
|
$(colvis.button()).appendTo('div.colvis-button-bar');
|
||||||
|
|
||||||
clearSearchButton('users_list_table', users_list_table);
|
clearSearchButton('users_list_table', users_list_table);
|
||||||
|
|
||||||
|
|
|
@ -133,6 +133,9 @@ class Libraries(object):
|
||||||
'library_sections.custom_thumb_url AS custom_thumb',
|
'library_sections.custom_thumb_url AS custom_thumb',
|
||||||
'library_sections.art',
|
'library_sections.art',
|
||||||
'COUNT(session_history.id) AS plays',
|
'COUNT(session_history.id) AS plays',
|
||||||
|
'SUM(CASE WHEN session_history.stopped > 0 THEN (session_history.stopped - session_history.started) \
|
||||||
|
ELSE 0 END) - SUM(CASE WHEN session_history.paused_counter IS NULL THEN 0 ELSE \
|
||||||
|
session_history.paused_counter END) AS duration',
|
||||||
'MAX(session_history.started) AS last_accessed',
|
'MAX(session_history.started) AS last_accessed',
|
||||||
'MAX(session_history.id) AS id',
|
'MAX(session_history.id) AS id',
|
||||||
'session_history_metadata.full_title AS last_played',
|
'session_history_metadata.full_title AS last_played',
|
||||||
|
@ -200,6 +203,7 @@ class Libraries(object):
|
||||||
'library_thumb': library_thumb,
|
'library_thumb': library_thumb,
|
||||||
'library_art': item['art'],
|
'library_art': item['art'],
|
||||||
'plays': item['plays'],
|
'plays': item['plays'],
|
||||||
|
'duration': item['duration'],
|
||||||
'last_accessed': item['last_accessed'],
|
'last_accessed': item['last_accessed'],
|
||||||
'id': item['id'],
|
'id': item['id'],
|
||||||
'last_played': item['last_played'],
|
'last_played': item['last_played'],
|
||||||
|
|
|
@ -32,6 +32,9 @@ class Users(object):
|
||||||
'users.thumb AS user_thumb',
|
'users.thumb AS user_thumb',
|
||||||
'users.custom_avatar_url AS custom_thumb',
|
'users.custom_avatar_url AS custom_thumb',
|
||||||
'COUNT(session_history.id) AS plays',
|
'COUNT(session_history.id) AS plays',
|
||||||
|
'SUM(CASE WHEN session_history.stopped > 0 THEN (session_history.stopped - session_history.started) \
|
||||||
|
ELSE 0 END) - SUM(CASE WHEN session_history.paused_counter IS NULL THEN 0 ELSE \
|
||||||
|
session_history.paused_counter END) AS duration',
|
||||||
'MAX(session_history.started) AS last_seen',
|
'MAX(session_history.started) AS last_seen',
|
||||||
'MAX(session_history.id) AS id',
|
'MAX(session_history.id) AS id',
|
||||||
'session_history_metadata.full_title AS last_played',
|
'session_history_metadata.full_title AS last_played',
|
||||||
|
@ -100,6 +103,7 @@ class Users(object):
|
||||||
'friendly_name': item['friendly_name'],
|
'friendly_name': item['friendly_name'],
|
||||||
'user_thumb': user_thumb,
|
'user_thumb': user_thumb,
|
||||||
'plays': item['plays'],
|
'plays': item['plays'],
|
||||||
|
'duration': item['duration'],
|
||||||
'last_seen': item['last_seen'],
|
'last_seen': item['last_seen'],
|
||||||
'last_played': item['last_played'],
|
'last_played': item['last_played'],
|
||||||
'id': item['id'],
|
'id': item['id'],
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue