diff --git a/data/interfaces/default/js/tables/export_table.js b/data/interfaces/default/js/tables/export_table.js index d44d0937..0054048e 100644 --- a/data/interfaces/default/js/tables/export_table.js +++ b/data/interfaces/default/js/tables/export_table.js @@ -116,3 +116,12 @@ export_table_options = { } } }; + +$('.export_table').on('click', '> tbody > tr > td > button.btn-download', function (e) { + var tr = $(this).closest('tr'); + var row = export_table.row(tr); + var rowData = row.data(); + + e.preventDefault(); + window.location.href = 'download_export?row_id=' + rowData['row_id']; +}); diff --git a/plexpy/exporter.py b/plexpy/exporter.py index fb390cb9..31125274 100644 --- a/plexpy/exporter.py +++ b/plexpy/exporter.py @@ -897,7 +897,7 @@ def export(section_id=None, rating_key=None, file_format='json'): return filename = helpers.clean_filename(filename) - filepath = os.path.join(plexpy.CONFIG.EXPORT_DIR, filename) + filepath = get_export_filepath(filename) logger.info("Tautulli Exporter :: Starting export for '%s'...", filename) export_id = set_export_state(timestamp=timestamp, @@ -932,6 +932,18 @@ def export(section_id=None, rating_key=None, file_format='json'): logger.info("Tautulli Exporter :: Successfully exported to '%s'", filepath) +def get_export(export_id): + db = database.MonitorDatabase() + result = db.select_single('SELECT filename, complete ' + 'FROM exports WHERE id = ?', + [export_id]) + + if result: + result['exists'] = check_export_exists(result['filename']) + + return result + + def set_export_state(timestamp, section_id, rating_key, media_type, file_format, filename): keys = {'timestamp': timestamp, 'section_id': section_id, @@ -1000,8 +1012,7 @@ def get_export_datatable(section_id=None, rating_key=None, kwargs=None): rows = [] for item in result: media_type_title = item['media_type'].title() - filepath = os.path.join(plexpy.CONFIG.EXPORT_DIR, item['filename']) - exists = helpers.cast_to_int(os.path.isfile(filepath)) + exists = helpers.cast_to_int(check_export_exists(item['filename'])) row = {'row_id': item['row_id'], 'timestamp': item['timestamp'], @@ -1024,3 +1035,11 @@ def get_export_datatable(section_id=None, rating_key=None, kwargs=None): } return result + + +def get_export_filepath(filename): + return os.path.join(plexpy.CONFIG.EXPORT_DIR, filename) + + +def check_export_exists(filename): + return os.path.isfile(get_export_filepath(filename)) diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 407aae97..a2283be8 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- # This file is part of Tautulli. # @@ -6482,9 +6482,49 @@ class WebInterface(object): @requireAuth(member_of("admin")) @addtoapi() def export_metadata(self, section_id=None, rating_key=None, file_format='json', **kwargs): + """ Download the Plex log file. + + ``` + Required parameters: + row_id (int): The row id of the exported file to download + + + Optional parameters: + None + + Returns: + json: + {"result": "success", + "message": "Metadata export has started. Check the logs to monitor any problems." + } + ``` + """ threading.Thread(target=exporter.export, kwargs={'section_id': section_id, 'rating_key': rating_key, 'file_format': file_format}).start() return {'result': 'success', 'message': 'Metadata export has started. Check the logs to monitor any problems.'} + + @cherrypy.expose + @cherrypy.tools.json_out() + @requireAuth(member_of("admin")) + @addtoapi() + def download_export(self, row_id=None, **kwargs): + """ Download the Plex log file. + + ``` + Required parameters: + row_id (int): The row id of the exported file to download + + + Optional parameters: + None + + Returns: + download + ``` + """ + result = exporter.get_export(export_id=row_id) + if result and result['complete'] and result['exists']: + serve_download(path=exporter.get_export_filepath(result['filename']), name=result['filename'])