From 9bb972a2ad77d6c425362aa650eab1fd49e565df Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 30 Jun 2018 09:01:41 +0530 Subject: [PATCH] Allow aborting running conversion jobs --- src/calibre/srv/convert.py | 2 ++ src/calibre/srv/handler.py | 3 +++ src/pyj/book_list/convert_book.pyj | 13 ++++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/calibre/srv/convert.py b/src/calibre/srv/convert.py index 5858963722..5182c0694c 100644 --- a/src/calibre/srv/convert.py +++ b/src/calibre/srv/convert.py @@ -179,6 +179,8 @@ def conversion_status(ctx, rd, job_id): job_status.last_check_at = monotonic() if job_status.running: percent, msg = job_status.current_status + if rd.query.get('abort_job'): + ctx.abort_job(job_id) return {'running': True, 'percent': percent, 'msg': msg} del conversion_jobs[job_id] diff --git a/src/calibre/srv/handler.py b/src/calibre/srv/handler.py index 95d0b67111..dcce493d47 100644 --- a/src/calibre/srv/handler.py +++ b/src/calibre/srv/handler.py @@ -45,6 +45,9 @@ class Context(object): def job_status(self, job_id): return self.jobs_manager.job_status(job_id) + def abort_job(self, job_id): + return self.jobs_manager.abort_job(job_id) + def is_field_displayable(self, field): if self.displayed_fields and field not in self.displayed_fields: return False diff --git a/src/pyj/book_list/convert_book.pyj b/src/pyj/book_list/convert_book.pyj index 75bce2bc2f..cd836bce24 100644 --- a/src/pyj/book_list/convert_book.pyj +++ b/src/pyj/book_list/convert_book.pyj @@ -99,6 +99,8 @@ def show_failure(response): def on_conversion_status(end_type, xhr, ev): nonlocal current_state + if current_state is not 'converting' or not container_for_current_state(): + return # user clicked the back button similar if end_type is 'load': response = JSON.parse(xhr.responseText) if response.running: @@ -119,8 +121,10 @@ def on_conversion_status(end_type, xhr, ev): report_conversion_ajax_failure(xhr) -def check_for_conversion_status(): +def check_for_conversion_status(abort_job): query = url_books_query() + if abort_job: + query.abort_job = '1' data = {} ajax_send(f'/conversion/status/{conversion_data.job_id}', data, on_conversion_status, query=query) @@ -145,6 +149,8 @@ def create_converting_markup(): _('Converting, please wait...'), E.div(E.progress()), E.div('\xa0', class_='progress-msg'), + E.div('\xa0'), + E.div(_('Click the close button in the top left corner to abort the conversion')), ) ) @@ -265,6 +271,11 @@ def fetch_conversion_data(book_id, input_fmt, output_fmt): def on_close(container_id): + nonlocal current_state + if current_state is 'converting': + check_for_conversion_status(True) + current_state = 'initializing' + apply_state_to_markup() back()