mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-14 09:12:58 -07:00
Initial collections and playlists table to library page
This commit is contained in:
parent
b568af0a90
commit
84207effab
5 changed files with 514 additions and 1 deletions
78
data/interfaces/default/js/tables/collections_table.js
Normal file
78
data/interfaces/default/js/tables/collections_table.js
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
collections_table_options = {
|
||||||
|
"destroy": true,
|
||||||
|
"language": {
|
||||||
|
"search": "Search: ",
|
||||||
|
"lengthMenu": "Show _MENU_ entries per page",
|
||||||
|
"info": "Showing _START_ to _END_ of _TOTAL_ export items",
|
||||||
|
"infoEmpty": "Showing 0 to 0 of 0 entries",
|
||||||
|
"infoFiltered": "<span class='hidden-md hidden-sm hidden-xs'>(filtered from _MAX_ total entries)</span>",
|
||||||
|
"emptyTable": "No data in table",
|
||||||
|
"loadingRecords": '<i class="fa fa-refresh fa-spin"></i> Loading items...</div>'
|
||||||
|
},
|
||||||
|
"pagingType": "full_numbers",
|
||||||
|
"stateSave": true,
|
||||||
|
"stateDuration": 0,
|
||||||
|
"processing": false,
|
||||||
|
"serverSide": true,
|
||||||
|
"pageLength": 25,
|
||||||
|
"order": [0, 'asc'],
|
||||||
|
"autoWidth": false,
|
||||||
|
"scrollX": true,
|
||||||
|
"columnDefs": [
|
||||||
|
{
|
||||||
|
"targets": [0],
|
||||||
|
"data": "title",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== '') {
|
||||||
|
$(td).html('<a href="' + page('info', rowData['ratingKey']) + '">' + cellData + '</a>');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"width": "50%",
|
||||||
|
"className": "no-wrap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targets": [1],
|
||||||
|
"data": "collectionMode",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== '') {
|
||||||
|
$(td).html(cellData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"width": "20%",
|
||||||
|
"className": "no-wrap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targets": [2],
|
||||||
|
"data": "collectionSort",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== '') {
|
||||||
|
$(td).html(cellData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"width": "20%",
|
||||||
|
"className": "no-wrap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targets": [3],
|
||||||
|
"data": "childCount",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== '') {
|
||||||
|
$(td).html(cellData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"width": "10%",
|
||||||
|
"className": "no-wrap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"drawCallback": function (settings) {
|
||||||
|
// Jump to top of page
|
||||||
|
//$('html,body').scrollTop(0);
|
||||||
|
$('#ajaxMsg').fadeOut();
|
||||||
|
},
|
||||||
|
"preDrawCallback": function(settings) {
|
||||||
|
var msg = "<i class='fa fa-refresh fa-spin'></i> Fetching rows...";
|
||||||
|
showMsg(msg, false, false, 0);
|
||||||
|
},
|
||||||
|
"rowCallback": function (row, rowData, rowIndex) {
|
||||||
|
}
|
||||||
|
};
|
78
data/interfaces/default/js/tables/playlists_table.js
Normal file
78
data/interfaces/default/js/tables/playlists_table.js
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
playlists_table_options = {
|
||||||
|
"destroy": true,
|
||||||
|
"language": {
|
||||||
|
"search": "Search: ",
|
||||||
|
"lengthMenu": "Show _MENU_ entries per page",
|
||||||
|
"info": "Showing _START_ to _END_ of _TOTAL_ export items",
|
||||||
|
"infoEmpty": "Showing 0 to 0 of 0 entries",
|
||||||
|
"infoFiltered": "<span class='hidden-md hidden-sm hidden-xs'>(filtered from _MAX_ total entries)</span>",
|
||||||
|
"emptyTable": "No data in table",
|
||||||
|
"loadingRecords": '<i class="fa fa-refresh fa-spin"></i> Loading items...</div>'
|
||||||
|
},
|
||||||
|
"pagingType": "full_numbers",
|
||||||
|
"stateSave": true,
|
||||||
|
"stateDuration": 0,
|
||||||
|
"processing": false,
|
||||||
|
"serverSide": true,
|
||||||
|
"pageLength": 25,
|
||||||
|
"order": [0, 'asc'],
|
||||||
|
"autoWidth": false,
|
||||||
|
"scrollX": true,
|
||||||
|
"columnDefs": [
|
||||||
|
{
|
||||||
|
"targets": [0],
|
||||||
|
"data": "title",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== '') {
|
||||||
|
$(td).html('<a href="' + page('info', rowData['ratingKey']) + '">' + cellData + '</a>');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"width": "50%",
|
||||||
|
"className": "no-wrap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targets": [1],
|
||||||
|
"data": "leafCount",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== '') {
|
||||||
|
$(td).html(cellData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"width": "20%",
|
||||||
|
"className": "no-wrap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targets": [2],
|
||||||
|
"data": "duration",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== '') {
|
||||||
|
$(td).html(humanDuration(cellData, 'dhm'));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"width": "20%",
|
||||||
|
"className": "no-wrap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targets": [3],
|
||||||
|
"data": "smart",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== '') {
|
||||||
|
$(td).html(cellData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"width": "10%",
|
||||||
|
"className": "no-wrap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"drawCallback": function (settings) {
|
||||||
|
// Jump to top of page
|
||||||
|
//$('html,body').scrollTop(0);
|
||||||
|
$('#ajaxMsg').fadeOut();
|
||||||
|
},
|
||||||
|
"preDrawCallback": function(settings) {
|
||||||
|
var msg = "<i class='fa fa-refresh fa-spin'></i> Fetching rows...";
|
||||||
|
showMsg(msg, false, false, 0);
|
||||||
|
},
|
||||||
|
"rowCallback": function (row, rowData, rowIndex) {
|
||||||
|
}
|
||||||
|
};
|
|
@ -93,6 +93,8 @@ DOCUMENTATION :: END
|
||||||
% if _session['user_group'] == 'admin':
|
% if _session['user_group'] == 'admin':
|
||||||
% if data['section_id'] != LIVE_TV_SECTION_ID:
|
% if data['section_id'] != LIVE_TV_SECTION_ID:
|
||||||
<li><a id="media-info-tab-btn" href="#tabs-mediainfo" role="tab" data-toggle="tab">Media Info</a></li>
|
<li><a id="media-info-tab-btn" href="#tabs-mediainfo" role="tab" data-toggle="tab">Media Info</a></li>
|
||||||
|
<li><a id="collections-tab-btn" href="#tabs-collections" role="tab" data-toggle="tab">Collections</a></li>
|
||||||
|
<li><a id="playlists-tab-btn" href="#tabs-playlists" role="tab" data-toggle="tab">Playlists</a></li>
|
||||||
<li><a id="export-tab-btn" href="#tabs-export" role="tab" data-toggle="tab">Export</a></li>
|
<li><a id="export-tab-btn" href="#tabs-export" role="tab" data-toggle="tab">Export</a></li>
|
||||||
% endif
|
% endif
|
||||||
% endif
|
% endif
|
||||||
|
@ -259,7 +261,7 @@ DOCUMENTATION :: END
|
||||||
<div class='table-card-header'>
|
<div class='table-card-header'>
|
||||||
<div class="header-bar">
|
<div class="header-bar">
|
||||||
<span>
|
<span>
|
||||||
<i class="fa fa-history"></i> Media Info for <strong>
|
<i class="fa fa-info-circle"></i> Media Info for <strong>
|
||||||
<span class="set-username">${data['section_name']}</span>
|
<span class="set-username">${data['section_name']}</span>
|
||||||
</strong>
|
</strong>
|
||||||
</span>
|
</span>
|
||||||
|
@ -306,6 +308,86 @@ DOCUMENTATION :: END
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane" id="tabs-collections">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class='table-card-header'>
|
||||||
|
<div class="header-bar">
|
||||||
|
<span>
|
||||||
|
<i class="fa fa-folder-open"></i> Collections for <strong>
|
||||||
|
<span class="set-username">${data['section_name']}</span>
|
||||||
|
</strong>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="button-bar">
|
||||||
|
% if _session['user_group'] == 'admin':
|
||||||
|
<div class="btn-group">
|
||||||
|
<button class="btn btn-dark refresh-collections-table-button" id="refresh-collections-table">
|
||||||
|
<i class="fa fa-refresh"></i> Refresh collections
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
% endif
|
||||||
|
<div class="btn-group colvis-button-bar" id="button-bar-collections"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="table-card-back">
|
||||||
|
<table class="display collections_table" id="collections_table-SID-${data['section_id']}" width="100%">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th align="left" id="title">Title</th>
|
||||||
|
<th align="left" id="collectionMode">Collection Mode</th>
|
||||||
|
<th align="left" id="collectionSort">Collection Sort</th>
|
||||||
|
<th align="left" id="items">Items</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody></tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane" id="tabs-playlists">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class='table-card-header'>
|
||||||
|
<div class="header-bar">
|
||||||
|
<span>
|
||||||
|
<i class="fa fa-list-alt"></i> Playlists for <strong>
|
||||||
|
<span class="set-username">${data['section_name']}</span>
|
||||||
|
</strong>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="button-bar">
|
||||||
|
% if _session['user_group'] == 'admin':
|
||||||
|
<div class="btn-group">
|
||||||
|
<button class="btn btn-dark refresh-playlists-table-button" id="refresh-playlists-table">
|
||||||
|
<i class="fa fa-refresh"></i> Refresh playlists
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
% endif
|
||||||
|
<div class="btn-group colvis-button-bar" id="button-bar-playlists"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="table-card-back">
|
||||||
|
<table class="display playlists_table" id="playlists_table-SID-${data['section_id']}" width="100%">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th align="left" id="title">Title</th>
|
||||||
|
<th align="left" id="leafCount">Items</th>
|
||||||
|
<th align="left" id="duration">Duration</th>
|
||||||
|
<th align="left" id="smart">Smart</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody></tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div role="tabpanel" class="tab-pane" id="tabs-export">
|
<div role="tabpanel" class="tab-pane" id="tabs-export">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -442,6 +524,8 @@ DOCUMENTATION :: END
|
||||||
<script src="${http_root}js/tables/history_table.js${cache_param}"></script>
|
<script src="${http_root}js/tables/history_table.js${cache_param}"></script>
|
||||||
<script src="${http_root}js/tables/media_info_table.js${cache_param}"></script>
|
<script src="${http_root}js/tables/media_info_table.js${cache_param}"></script>
|
||||||
<script src="${http_root}js/tables/export_table.js${cache_param}"></script>
|
<script src="${http_root}js/tables/export_table.js${cache_param}"></script>
|
||||||
|
<script src="${http_root}js/tables/collections_table.js${cache_param}"></script>
|
||||||
|
<script src="${http_root}js/tables/playlists_table.js${cache_param}"></script>
|
||||||
<script>
|
<script>
|
||||||
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
|
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
|
||||||
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
|
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
|
||||||
|
@ -516,6 +600,66 @@ DOCUMENTATION :: END
|
||||||
refresh_table = false;
|
refresh_table = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function loadCollectionsTable() {
|
||||||
|
// Build collections table
|
||||||
|
collections_table_options.ajax = {
|
||||||
|
url: 'get_collections_list',
|
||||||
|
type: 'POST',
|
||||||
|
data: function ( d ) {
|
||||||
|
return {
|
||||||
|
json_data: JSON.stringify( d ),
|
||||||
|
section_id: section_id
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
collections_table = $('#collections_table-SID-${data["section_id"]}').DataTable(collections_table_options);
|
||||||
|
|
||||||
|
var colvis = new $.fn.dataTable.ColVis(collections_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark' });
|
||||||
|
$(colvis.button()).appendTo('#button-bar-collections');
|
||||||
|
|
||||||
|
clearSearchButton('collections_table-SID-${data["section_id"]}', collections_table);
|
||||||
|
}
|
||||||
|
|
||||||
|
$('a[href="#tabs-collections"]').on('shown.bs.tab', function() {
|
||||||
|
if (typeof(collections_table) === 'undefined') {
|
||||||
|
loadCollectionsTable();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#refresh-collections-table").click(function () {
|
||||||
|
collections_table.draw();
|
||||||
|
});
|
||||||
|
|
||||||
|
function loadPlaylistsTable() {
|
||||||
|
// Build playlists table
|
||||||
|
playlists_table_options.ajax = {
|
||||||
|
url: 'get_playlists_list',
|
||||||
|
type: 'POST',
|
||||||
|
data: function ( d ) {
|
||||||
|
return {
|
||||||
|
json_data: JSON.stringify( d ),
|
||||||
|
section_id: section_id
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
playlists_table = $('#playlists_table-SID-${data["section_id"]}').DataTable(playlists_table_options);
|
||||||
|
|
||||||
|
var colvis = new $.fn.dataTable.ColVis(playlists_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark' });
|
||||||
|
$(colvis.button()).appendTo('#button-bar-playlists');
|
||||||
|
|
||||||
|
clearSearchButton('playlists_table-SID-${data["section_id"]}', playlists_table);
|
||||||
|
}
|
||||||
|
|
||||||
|
$('a[href="#tabs-playlists"]').on('shown.bs.tab', function() {
|
||||||
|
if (typeof(playlists_table) === 'undefined') {
|
||||||
|
loadPlaylistsTable();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#refresh-playlists-table").click(function () {
|
||||||
|
playlists_table.draw();
|
||||||
|
});
|
||||||
|
|
||||||
function loadExportTable() {
|
function loadExportTable() {
|
||||||
// Build export table
|
// Build export table
|
||||||
export_table_options.ajax = {
|
export_table_options.ajax = {
|
||||||
|
|
|
@ -33,6 +33,7 @@ if plexpy.PYTHON2:
|
||||||
import plextv
|
import plextv
|
||||||
import pmsconnect
|
import pmsconnect
|
||||||
import session
|
import session
|
||||||
|
from plex import Plex
|
||||||
else:
|
else:
|
||||||
from plexpy import common
|
from plexpy import common
|
||||||
from plexpy import database
|
from plexpy import database
|
||||||
|
@ -42,6 +43,7 @@ else:
|
||||||
from plexpy import plextv
|
from plexpy import plextv
|
||||||
from plexpy import pmsconnect
|
from plexpy import pmsconnect
|
||||||
from plexpy import session
|
from plexpy import session
|
||||||
|
from plexpy.plex import Plex
|
||||||
|
|
||||||
|
|
||||||
def refresh_libraries():
|
def refresh_libraries():
|
||||||
|
@ -140,6 +142,117 @@ def has_library_type(section_type):
|
||||||
return bool(result)
|
return bool(result)
|
||||||
|
|
||||||
|
|
||||||
|
def get_collections(section_id):
|
||||||
|
plex = Plex(plexpy.CONFIG.PMS_URL, plexpy.CONFIG.PMS_TOKEN)
|
||||||
|
library = plex.get_library(section_id)
|
||||||
|
|
||||||
|
if library.type not in ('movie', 'show', 'artist'):
|
||||||
|
return []
|
||||||
|
|
||||||
|
collections = library.collection()
|
||||||
|
|
||||||
|
collections_list = []
|
||||||
|
for collection in collections:
|
||||||
|
collection_dict = {
|
||||||
|
'addedAt': helpers.datetime_to_iso(collection.addedAt),
|
||||||
|
'art': collection.art,
|
||||||
|
'childCount': collection.childCount,
|
||||||
|
'collectionMode': collection.collectionMode,
|
||||||
|
'collectionSort': collection.collectionSort,
|
||||||
|
'contentRating': collection.contentRating,
|
||||||
|
'guid': collection.guid,
|
||||||
|
'librarySectionID': collection.librarySectionID,
|
||||||
|
'librarySectionTitle': collection.librarySectionTitle,
|
||||||
|
'maxYear': collection.maxYear,
|
||||||
|
'minYear': collection.minYear,
|
||||||
|
'ratingKey': collection.ratingKey,
|
||||||
|
'subtype': collection.subtype,
|
||||||
|
'summary': collection.summary,
|
||||||
|
'thumb': collection.thumb,
|
||||||
|
'title': collection.title,
|
||||||
|
'titleSort': collection.titleSort,
|
||||||
|
'type': collection.type,
|
||||||
|
'updatedAt': helpers.datetime_to_iso(collection.updatedAt)
|
||||||
|
}
|
||||||
|
collections_list.append(collection_dict)
|
||||||
|
|
||||||
|
return collections_list
|
||||||
|
|
||||||
|
|
||||||
|
def get_collections_list(section_id=None, **kwargs):
|
||||||
|
if not section_id:
|
||||||
|
default_return = {'recordsTotal': 0,
|
||||||
|
'draw': 0,
|
||||||
|
'data': 'null',
|
||||||
|
'error': 'Unable to execute database query.'}
|
||||||
|
return default_return
|
||||||
|
|
||||||
|
collections = get_collections(section_id)
|
||||||
|
|
||||||
|
data = {'recordsTotal': len(collections),
|
||||||
|
'data': collections,
|
||||||
|
'draw': kwargs.get('draw', 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def get_playlists(section_id):
|
||||||
|
plex = Plex(plexpy.CONFIG.PMS_URL, plexpy.CONFIG.PMS_TOKEN)
|
||||||
|
|
||||||
|
library = Libraries().get_details(section_id=section_id)
|
||||||
|
|
||||||
|
if library['section_type'] == 'artist':
|
||||||
|
playlist_type = 'audio'
|
||||||
|
elif library['section_type'] == 'photo':
|
||||||
|
playlist_type = 'photo'
|
||||||
|
else:
|
||||||
|
playlist_type = 'video'
|
||||||
|
|
||||||
|
playlists = plex.plex.fetchItems(
|
||||||
|
'/playlists?type=15&playlistType={}§ionID={}'.format(playlist_type, section_id))
|
||||||
|
|
||||||
|
playlists_list = []
|
||||||
|
for playlist in playlists:
|
||||||
|
playlist_dict = {
|
||||||
|
'addedAt': helpers.datetime_to_iso(playlist.addedAt),
|
||||||
|
'composite': playlist.composite,
|
||||||
|
'duration': playlist.duration,
|
||||||
|
'guid': playlist.guid,
|
||||||
|
'leafCount': playlist.leafCount,
|
||||||
|
'librarySectionID': section_id,
|
||||||
|
'librarySectionTitle': library['section_name'],
|
||||||
|
'playlistType': playlist.playlistType,
|
||||||
|
'ratingKey': playlist.ratingKey,
|
||||||
|
'smart': playlist.smart,
|
||||||
|
'summary': playlist.summary,
|
||||||
|
'title': playlist.title,
|
||||||
|
'type': playlist.type,
|
||||||
|
'updatedAt': helpers.datetime_to_iso(playlist.updatedAt)
|
||||||
|
}
|
||||||
|
playlists_list.append(playlist_dict)
|
||||||
|
|
||||||
|
return playlists_list
|
||||||
|
|
||||||
|
|
||||||
|
def get_playlists_list(section_id=None, **kwargs):
|
||||||
|
if not section_id:
|
||||||
|
default_return = {'recordsTotal': 0,
|
||||||
|
'draw': 0,
|
||||||
|
'data': 'null',
|
||||||
|
'error': 'Unable to execute database query.'}
|
||||||
|
return default_return
|
||||||
|
|
||||||
|
playlists = get_playlists(section_id)
|
||||||
|
|
||||||
|
data = {'recordsTotal': len(playlists),
|
||||||
|
'data': playlists,
|
||||||
|
'draw': kwargs.get('draw', 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
class Libraries(object):
|
class Libraries(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
|
@ -843,6 +843,106 @@ class WebInterface(object):
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@cherrypy.expose
|
||||||
|
@cherrypy.tools.json_out()
|
||||||
|
@requireAuth(member_of("admin"))
|
||||||
|
@addtoapi()
|
||||||
|
def get_collections_list(self, section_id=None, **kwargs):
|
||||||
|
""" Get the data on the Tautulli media info tables.
|
||||||
|
|
||||||
|
```
|
||||||
|
Required parameters:
|
||||||
|
section_id (str): The id of the Plex library section, OR
|
||||||
|
|
||||||
|
Optional parameters:
|
||||||
|
None
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
json:
|
||||||
|
{"draw": 1,
|
||||||
|
"recordsTotal": 5,
|
||||||
|
"data":
|
||||||
|
[...]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
"""
|
||||||
|
# Check if datatables json_data was received.
|
||||||
|
# If not, then build the minimal amount of json data for a query
|
||||||
|
if not kwargs.get('json_data'):
|
||||||
|
# Alias 'title' to 'sort_title'
|
||||||
|
if kwargs.get('order_column') == 'title':
|
||||||
|
kwargs['order_column'] = 'sort_title'
|
||||||
|
|
||||||
|
# TODO: Find some one way to automatically get the columns
|
||||||
|
dt_columns = [("added_at", True, False),
|
||||||
|
("sort_title", True, True),
|
||||||
|
("container", True, True),
|
||||||
|
("bitrate", True, True),
|
||||||
|
("video_codec", True, True),
|
||||||
|
("video_resolution", True, True),
|
||||||
|
("video_framerate", True, True),
|
||||||
|
("audio_codec", True, True),
|
||||||
|
("audio_channels", True, True),
|
||||||
|
("file_size", True, False),
|
||||||
|
("last_played", True, False),
|
||||||
|
("play_count", True, False)]
|
||||||
|
kwargs['json_data'] = build_datatables_json(kwargs, dt_columns, "sort_title")
|
||||||
|
|
||||||
|
result = libraries.get_collections_list(section_id=section_id,
|
||||||
|
kwargs=kwargs)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
@cherrypy.expose
|
||||||
|
@cherrypy.tools.json_out()
|
||||||
|
@requireAuth(member_of("admin"))
|
||||||
|
@addtoapi()
|
||||||
|
def get_playlists_list(self, section_id=None, **kwargs):
|
||||||
|
""" Get the data on the Tautulli media info tables.
|
||||||
|
|
||||||
|
```
|
||||||
|
Required parameters:
|
||||||
|
section_id (str): The id of the Plex library section, OR
|
||||||
|
|
||||||
|
Optional parameters:
|
||||||
|
None
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
json:
|
||||||
|
{"draw": 1,
|
||||||
|
"recordsTotal": 5,
|
||||||
|
"data":
|
||||||
|
[...]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
"""
|
||||||
|
# Check if datatables json_data was received.
|
||||||
|
# If not, then build the minimal amount of json data for a query
|
||||||
|
if not kwargs.get('json_data'):
|
||||||
|
# Alias 'title' to 'sort_title'
|
||||||
|
if kwargs.get('order_column') == 'title':
|
||||||
|
kwargs['order_column'] = 'sort_title'
|
||||||
|
|
||||||
|
# TODO: Find some one way to automatically get the columns
|
||||||
|
dt_columns = [("added_at", True, False),
|
||||||
|
("sort_title", True, True),
|
||||||
|
("container", True, True),
|
||||||
|
("bitrate", True, True),
|
||||||
|
("video_codec", True, True),
|
||||||
|
("video_resolution", True, True),
|
||||||
|
("video_framerate", True, True),
|
||||||
|
("audio_codec", True, True),
|
||||||
|
("audio_channels", True, True),
|
||||||
|
("file_size", True, False),
|
||||||
|
("last_played", True, False),
|
||||||
|
("play_count", True, False)]
|
||||||
|
kwargs['json_data'] = build_datatables_json(kwargs, dt_columns, "sort_title")
|
||||||
|
|
||||||
|
result = libraries.get_playlists_list(section_id=section_id,
|
||||||
|
kwargs=kwargs)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
@cherrypy.expose
|
@cherrypy.expose
|
||||||
@cherrypy.tools.json_out()
|
@cherrypy.tools.json_out()
|
||||||
@requireAuth(member_of("admin"))
|
@requireAuth(member_of("admin"))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue