From 3c98d88b658ff10ef7fd3f536c9e1e5cd1be26cf Mon Sep 17 00:00:00 2001 From: bookfere Date: Wed, 20 Mar 2024 18:34:56 +0800 Subject: [PATCH] feat: Show the details while extracting the content of an ebook. --- advanced.py | 57 +++++++++++++++++++++++++++++++++-------------- lib/conversion.py | 38 +++++++++++++++++++++++++------ lib/exception.py | 4 ++++ lib/utils.py | 3 --- 4 files changed, 75 insertions(+), 27 deletions(-) diff --git a/advanced.py b/advanced.py index 66d4a6a..b4350b6 100644 --- a/advanced.py +++ b/advanced.py @@ -55,6 +55,7 @@ class PreparationWorker(QObject): start = pyqtSignal() progress = pyqtSignal(int) progress_message = pyqtSignal(str) + progress_detail = pyqtSignal(str) finished = pyqtSignal(str) def __init__(self, engine_class, ebook): @@ -78,6 +79,9 @@ def prepare_ebook_data(self): + Extraction.__version__) cache = get_cache(cache_id) + self.progress_detail.emit( + 'Start processing the ebook: %s' % self.ebook.title) + if cache.is_fresh() or not cache.is_persistence(): cache.set_info('title', self.ebook.title) cache.set_info('engine_name', self.engine_class.name) @@ -89,10 +93,11 @@ def prepare_ebook_data(self): a = time.time() # -------------------------- self.progress_message.emit(_('Extracting ebook content...')) - elements = extract_item(input_path, self.ebook.input_format) + elements = extract_item( + input_path, self.ebook.input_format, self.progress_detail.emit) self.progress.emit(30) b = time.time() - print('extract: ', b - a) + self.progress_detail.emit('extracting timing: %s' % (b - a)) if self.cancel(): self.clean_cache(cache) return @@ -101,7 +106,7 @@ def prepare_ebook_data(self): original_group = element_handler.prepare_original(elements) self.progress.emit(80) c = time.time() - print('filter: ', c - b) + self.progress_detail.emit('filtering timing: %s' % (c - b)) if self.cancel(): self.clean_cache(cache) return @@ -110,11 +115,14 @@ def prepare_ebook_data(self): cache.save(original_group) self.progress.emit(100) d = time.time() - print('cache: ', d - c) + self.progress_detail.emit('cache timing: %s' % (d - c)) if self.cancel(): self.clean_cache(cache) return + self.progress_detail.emit( + 'The ebook content was extracted successfully.') + self.finished.emit(cache_id) def cancel(self): @@ -351,28 +359,43 @@ def layout_progress(self): cover.setAlignment(Qt.AlignCenter) cover.setPixmap(cover_image) + title = QLabel() + title.setText(title.fontMetrics().elidedText( + self.ebook.title, Qt.ElideRight, title.width())) + progress_bar = QProgressBar() progress_bar.setFormat('') progress_bar.setValue(0) # progress_bar.setFixedWidth(300) - # progress_bar.setMaximum(0) - # progress_bar.setMinimum(0) - self.preparation_worker.progress.connect(progress_bar.setValue) + progress_bar.setMinimum(0) + progress_bar.setMaximum(0) + + def show_progress(value): + if progress_bar.maximum() == 0: + progress_bar.setMaximum(100) + progress_bar.setValue(value) + self.preparation_worker.progress.connect(show_progress) label = QLabel(_('Loading ebook data, please wait...')) label.setAlignment(Qt.AlignCenter) self.preparation_worker.progress_message.connect(label.setText) - layout.addItem(QSpacerItem(0, 0), 0, 0, 1, 3) - layout.addWidget(cover, 1, 1) - layout.addItem(QSpacerItem(0, 30), 2, 0, 1, 3) - layout.addWidget(progress_bar, 3, 1) - layout.addWidget(label, 4, 1) + detail = QPlainTextEdit() + detail.setReadOnly(True) + self.preparation_worker.progress_detail.connect(detail.appendPlainText) + + layout.addWidget(cover, 0, 0) + layout.addWidget(title, 1, 0) + layout.addItem(QSpacerItem(0, 20), 2, 0, 1, 3) + layout.addWidget(progress_bar, 3, 0) + layout.addWidget(label, 4, 0) layout.addItem(QSpacerItem(0, 0), 5, 0, 1, 3) - layout.setRowStretch(0, 1) - layout.setRowStretch(5, 1) - layout.setColumnStretch(0, 1) + layout.addItem(QSpacerItem(10, 0), 0, 1, 6, 1) + layout.addWidget(detail, 0, 2, 6, 1) + # layout.setRowStretch(0, 1) + layout.setRowStretch(2, 1) layout.setColumnStretch(2, 1) + # layout.setColumnStretch(2, 1) return widget @@ -691,8 +714,8 @@ def layout_review(self): def refresh_translation(paragraph): translation_text.clear() - raw_text.setPlainText(paragraph.raw) - original_text.setPlainText(paragraph.original) + raw_text.setPlainText(paragraph.raw.strip()) + original_text.setPlainText(paragraph.original.strip()) translation_text.setPlainText(paragraph.translation) self.paragraph_sig.connect(refresh_translation) self.trans_worker.start.connect( diff --git a/lib/conversion.py b/lib/conversion.py index 184da99..e2f844a 100644 --- a/lib/conversion.py +++ b/lib/conversion.py @@ -5,6 +5,7 @@ from tempfile import gettempdir from calibre.gui2 import Dispatcher +from calibre.utils.logging import Log, Stream from calibre.constants import DEBUG, __version__ from calibre.ebooks.conversion.plumber import Plumber from calibre.ptempfile import PersistentTemporaryFile @@ -13,18 +14,40 @@ from .. import EbookTranslator from .config import get_config -from .utils import log, sep, uid, open_path, open_file +from .utils import sep, uid, open_path, open_file from .cache import get_cache, TranslationCache from .element import ( Extraction, get_element_handler, get_srt_elements, get_toc_elements, get_page_elements, get_metadata_elements, get_pgn_elements) from .translation import get_translator, get_translation - +from .exception import ConversionAbort load_translations() -def extract_item(input_path, input_format): +class PrepareStream: + mode = 'r' + + def __init__(self, callback): + self.callback = callback + self.temp = '' + + def write(self, text): + self.temp += text + if text == '\n': + self.callback(self.temp.strip('\n')) + self.temp = '' + + def flush(self): + pass + + +log = Log() + + +def extract_item(input_path, input_format, callback=None): + if callback is not None: + log.outputs = [Stream(PrepareStream(callback))] extractors = { 'srt': get_srt_elements, 'pgn': get_pgn_elements, @@ -35,7 +58,6 @@ def extract_item(input_path, input_format): def extract_book(input_path): elements = [] - output_path = os.path.join(gettempdir(), 'temp.epub') plumber = Plumber(input_path, output_path, log=log) @@ -51,10 +73,12 @@ def convert(self, oeb, output_path, input_plugin, opts, log): elements.extend(get_metadata_elements(oeb.metadata)) elements.extend(get_toc_elements(oeb.toc.nodes, [])) elements.extend(get_page_elements(oeb.manifest.items)) + raise ConversionAbort() plumber.output_plugin.convert = MethodType(convert, plumber.output_plugin) - plumber.run() - - return elements + try: + plumber.run() + except ConversionAbort: + return elements def convert_item(ebook_title, input_path, output_path, source_lang, diff --git a/lib/exception.py b/lib/exception.py index e16470e..5ac9a77 100644 --- a/lib/exception.py +++ b/lib/exception.py @@ -2,6 +2,10 @@ class ConversionFailed(Exception): pass +class ConversionAbort(Exception): + pass + + class TranslationFailed(Exception): pass diff --git a/lib/utils.py b/lib/utils.py index 42372f6..79c8eae 100644 --- a/lib/utils.py +++ b/lib/utils.py @@ -5,13 +5,10 @@ import hashlib from subprocess import Popen -from calibre.utils.logging import Log - from ..lib.cssselect import GenericTranslator, SelectorError ns = {'x': 'http://www.w3.org/1999/xhtml'} -log = Log() is_test = 'unittest' in sys.modules