Add file_format to exports table

This commit is contained in:
JonnyWong16 2020-08-03 14:07:22 -07:00
parent 5468676811
commit de2e2ee962
No known key found for this signature in database
GPG key ID: B1F1F9807184697A
5 changed files with 38 additions and 18 deletions

View file

@ -50,7 +50,7 @@ export_table_options = {
$(td).html(cellData); $(td).html(cellData);
} }
}, },
"width": "10%", "width": "7%",
"className": "no-wrap" "className": "no-wrap"
}, },
{ {
@ -61,22 +61,33 @@ export_table_options = {
$(td).html(cellData); $(td).html(cellData);
} }
}, },
"width": "10%", "width": "7%",
"className": "no-wrap" "className": "no-wrap"
}, },
{ {
"targets": [3], "targets": [3],
"data": "file_format",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== '') {
$(td).html(cellData);
}
},
"width": "7%",
"className": "no-wrap"
},
{
"targets": [4],
"data": "filename", "data": "filename",
"createdCell": function (td, cellData, rowData, row, col) { "createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== '') { if (cellData !== '') {
$(td).html(cellData); $(td).html(cellData);
} }
}, },
"width": "60%", "width": "55%",
"className": "no-wrap" "className": "no-wrap"
}, },
{ {
"targets": [4], "targets": [5],
"data": "complete", "data": "complete",
"createdCell": function (td, cellData, rowData, row, col) { "createdCell": function (td, cellData, rowData, row, col) {
if (cellData === 1) { if (cellData === 1) {
@ -85,7 +96,7 @@ export_table_options = {
$(td).html('<button class="btn btn-xs btn-dark" data-id="' + rowData['row_id'] + '" disabled><i class="fa fa-spinner fa-spin fa-fw"></i> Processing</button>'); $(td).html('<button class="btn btn-xs btn-dark" data-id="' + rowData['row_id'] + '" disabled><i class="fa fa-spinner fa-spin fa-fw"></i> Processing</button>');
} }
}, },
"width": "10%" "width": "7%"
} }
], ],
"drawCallback": function (settings) { "drawCallback": function (settings) {
@ -96,5 +107,10 @@ export_table_options = {
"preDrawCallback": function(settings) { "preDrawCallback": function(settings) {
var msg = "<i class='fa fa-refresh fa-spin'></i>&nbsp; Fetching rows..."; var msg = "<i class='fa fa-refresh fa-spin'></i>&nbsp; Fetching rows...";
showMsg(msg, false, false, 0) showMsg(msg, false, false, 0)
},
"rowCallback": function (row, rowData, rowIndex) {
if (rowData['complete'] !== 1) {
$(row).addClass('current-activity-row');
}
} }
}; };

View file

@ -336,6 +336,7 @@ DOCUMENTATION :: END
<th align="left" id="timestamp">Exported At</th> <th align="left" id="timestamp">Exported At</th>
<th align="left" id="media_type_title">Media Type</th> <th align="left" id="media_type_title">Media Type</th>
<th align="left" id="rating_key">Rating Key</th> <th align="left" id="rating_key">Rating Key</th>
<th align="left" id="file_format">Format</th>
<th align="left" id="filename">Filename</th> <th align="left" id="filename">Filename</th>
<th align="left" id="complete">Download</th> <th align="left" id="complete">Download</th>
</tr> </tr>

View file

@ -1,4 +1,4 @@
# This file is part of Tautulli. # This file is part of Tautulli.
# #
# Tautulli is free software: you can redistribute it and/or modify # Tautulli is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -792,7 +792,7 @@ def dbcheck():
c_db.execute( c_db.execute(
'CREATE TABLE IF NOT EXISTS exports (id INTEGER PRIMARY KEY AUTOINCREMENT, ' 'CREATE TABLE IF NOT EXISTS exports (id INTEGER PRIMARY KEY AUTOINCREMENT, '
'timestamp INTEGER, section_id INTEGER, rating_key INTEGER, media_type TEXT, ' 'timestamp INTEGER, section_id INTEGER, rating_key INTEGER, media_type TEXT, '
'filename TEXT, complete INTEGER DEFAULT 0)' 'file_format TEXT, filename TEXT, complete INTEGER DEFAULT 0)'
) )
# Upgrade sessions table from earlier versions # Upgrade sessions table from earlier versions

View file

@ -845,7 +845,7 @@ MEDIA_TYPES = {
} }
def export(section_id=None, rating_key=None, output_format='json'): def export(section_id=None, rating_key=None, file_format='json'):
timestamp = helpers.timestamp() timestamp = helpers.timestamp()
if not section_id and not rating_key: if not section_id and not rating_key:
@ -857,8 +857,8 @@ def export(section_id=None, rating_key=None, output_format='json'):
elif rating_key and not str(rating_key).isdigit(): elif rating_key and not str(rating_key).isdigit():
logger.error("Tautulli Exporter :: Export called with invalid rating_key '%s'.", rating_key) logger.error("Tautulli Exporter :: Export called with invalid rating_key '%s'.", rating_key)
return return
elif output_format not in ('json', 'csv'): elif file_format not in ('json', 'csv'):
logger.error("Tautulli Exporter :: Export called but invalid output_format '%s' provided.", output_format) logger.error("Tautulli Exporter :: Export called but invalid file_format '%s' provided.", file_format)
return return
plex = Plex(plexpy.CONFIG.PMS_URL, plexpy.CONFIG.PMS_TOKEN) plex = Plex(plexpy.CONFIG.PMS_URL, plexpy.CONFIG.PMS_TOKEN)
@ -870,7 +870,7 @@ def export(section_id=None, rating_key=None, output_format='json'):
media_type = library.type media_type = library.type
library_title = library.title library_title = library.title
filename = 'Library - {} [{}].{}.{}'.format( filename = 'Library - {} [{}].{}.{}'.format(
library_title, section_id, helpers.timestamp_to_YMDHMS(timestamp), output_format) library_title, section_id, helpers.timestamp_to_YMDHMS(timestamp), file_format)
items = library.all() items = library.all()
elif rating_key: elif rating_key:
@ -889,7 +889,7 @@ def export(section_id=None, rating_key=None, output_format='json'):
media_type = 'photo album' media_type = 'photo album'
filename = '{} - {} [{}].{}.{}'.format( filename = '{} - {} [{}].{}.{}'.format(
media_type.title(), item_title, rating_key, helpers.timestamp_to_YMDHMS(timestamp), output_format) media_type.title(), item_title, rating_key, helpers.timestamp_to_YMDHMS(timestamp), file_format)
items = [item] items = [item]
@ -915,11 +915,11 @@ def export(section_id=None, rating_key=None, output_format='json'):
with ThreadPool(processes=4) as pool: with ThreadPool(processes=4) as pool:
result = pool.map(part, items) result = pool.map(part, items)
if output_format == 'json': if file_format == 'json':
with open(filepath, 'w', encoding='utf-8') as outfile: with open(filepath, 'w', encoding='utf-8') as outfile:
json.dump(result, outfile, indent=4, ensure_ascii=False, sort_keys=True) json.dump(result, outfile, indent=4, ensure_ascii=False, sort_keys=True)
elif output_format == 'csv': elif file_format == 'csv':
flatten_result = helpers.flatten_dict(result) flatten_result = helpers.flatten_dict(result)
flatten_attrs = helpers.flatten_dict(attrs) flatten_attrs = helpers.flatten_dict(attrs)
with open(filepath, 'w', encoding='utf-8', newline='') as outfile: with open(filepath, 'w', encoding='utf-8', newline='') as outfile:
@ -931,13 +931,14 @@ def export(section_id=None, rating_key=None, output_format='json'):
logger.info("Tautulli Exporter :: Successfully exported to '%s'", filepath) logger.info("Tautulli Exporter :: Successfully exported to '%s'", filepath)
def set_export_state(timestamp, section_id, rating_key, media_type, filename): def set_export_state(timestamp, section_id, rating_key, media_type, file_format, filename):
keys = {'timestamp': timestamp, keys = {'timestamp': timestamp,
'section_id': section_id, 'section_id': section_id,
'rating_key': rating_key, 'rating_key': rating_key,
'media_type': media_type} 'media_type': media_type}
values = {'filename': filename} values = {'file_format': file_format,
'filename': filename}
db = database.MonitorDatabase() db = database.MonitorDatabase()
try: try:
@ -976,6 +977,7 @@ def get_export_datatable(section_id=None, rating_key=None, kwargs=None):
'exports.section_id', 'exports.section_id',
'exports.rating_key', 'exports.rating_key',
'exports.media_type', 'exports.media_type',
'exports.file_format',
'exports.filename', 'exports.filename',
'exports.complete' 'exports.complete'
] ]
@ -1004,6 +1006,7 @@ def get_export_datatable(section_id=None, rating_key=None, kwargs=None):
'rating_key': item['rating_key'], 'rating_key': item['rating_key'],
'media_type': item['media_type'], 'media_type': item['media_type'],
'media_type_title': media_type_title, 'media_type_title': media_type_title,
'file_format': item['file_format'],
'filename': item['filename'], 'filename': item['filename'],
'complete': item['complete'] 'complete': item['complete']
} }

View file

@ -6480,10 +6480,10 @@ class WebInterface(object):
@cherrypy.tools.json_out() @cherrypy.tools.json_out()
@requireAuth(member_of("admin")) @requireAuth(member_of("admin"))
@addtoapi() @addtoapi()
def export_metadata(self, section_id=None, rating_key=None, output_format='json', **kwargs): def export_metadata(self, section_id=None, rating_key=None, file_format='json', **kwargs):
threading.Thread(target=exporter.export, threading.Thread(target=exporter.export,
kwargs={'section_id': section_id, kwargs={'section_id': section_id,
'rating_key': rating_key, 'rating_key': rating_key,
'output_format': output_format}).start() 'file_format': file_format}).start()
return {'result': 'success', return {'result': 'success',
'message': 'Metadata export has started. Check the logs to monitor any problems.'} 'message': 'Metadata export has started. Check the logs to monitor any problems.'}