Skip to content

Commit

Permalink
feat: Show the details while extracting the content of an ebook.
Browse files Browse the repository at this point in the history
  • Loading branch information
bookfere committed Mar 20, 2024
1 parent 5db4a23 commit 3c98d88
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 27 deletions.
57 changes: 40 additions & 17 deletions advanced.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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)
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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):
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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(
Expand Down
38 changes: 31 additions & 7 deletions lib/conversion.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -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)

Expand All @@ -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,
Expand Down
4 changes: 4 additions & 0 deletions lib/exception.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ class ConversionFailed(Exception):
pass


class ConversionAbort(Exception):
pass


class TranslationFailed(Exception):
pass

Expand Down
3 changes: 0 additions & 3 deletions lib/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down

0 comments on commit 3c98d88

Please sign in to comment.