From 6413208f37201cd82263a7717b94b1371cbe7e6a Mon Sep 17 00:00:00 2001 From: John Schember Date: Tue, 5 May 2009 20:34:59 -0400 Subject: [PATCH 1/5] Don't continue the conversion process with unconvertable books. --- src/calibre/gui2/main.py | 14 ++++++++------ src/calibre/gui2/tools.py | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 8393414518..fbdf26987b 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -973,12 +973,13 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): def auto_convert(self, row_ids, on_card, format): previous = self.library_view.currentIndex() - jobs, changed = convert_single_ebook(self, self.library_view.model().db, row_ids, True) + jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, row_ids, True) if jobs == []: return for func, args, desc, fmt, id, temp_files in jobs: - job = self.job_manager.run_job(Dispatcher(self.book_auto_converted), + if id not in bad: + job = self.job_manager.run_job(Dispatcher(self.book_auto_converted), func, args=args, description=desc) - self.conversion_jobs[job] = (temp_files, fmt, id, on_card) + self.conversion_jobs[job] = (temp_files, fmt, id, on_card) if changed: self.library_view.model().refresh_rows(rows) @@ -1021,12 +1022,13 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): previous = self.library_view.currentIndex() rows = [x.row() for x in \ self.library_view.selectionModel().selectedRows()] - jobs, changed = convert_single_ebook(self, + jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, row_ids) for func, args, desc, fmt, id, temp_files in jobs: - job = self.job_manager.run_job(Dispatcher(self.book_converted), + if id not in bad: + job = self.job_manager.run_job(Dispatcher(self.book_converted), func, args=args, description=desc) - self.conversion_jobs[job] = (temp_files, fmt, id) + self.conversion_jobs[job] = (temp_files, fmt, id) if changed: self.library_view.model().refresh_rows(rows) diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index d035a56d34..1b217af86c 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -33,7 +33,7 @@ def convert_single_ebook(parent, db, row_ids, auto_conversion=False): if auto_conversion: result = QDialog.Accepted else: - retult = d.exec_() + result = d.exec_() if result == QDialog.Accepted: mi = db.get_metadata(row_id, True) @@ -67,7 +67,7 @@ def convert_single_ebook(parent, db, row_ids, auto_conversion=False): msg = _('

Could not convert %d of %d books, because no suitable source format was found.

')%(len(res), total, '\n'.join(res)) warning_dialog(parent, _('Could not convert some books'), msg).exec_() - return jobs, changed + return jobs, changed, bad def convert_bulk_ebooks(*args): From 067baed7f2a238ac5bc9d238508f682c60ff799c Mon Sep 17 00:00:00 2001 From: John Schember Date: Wed, 6 May 2009 06:52:15 -0400 Subject: [PATCH 2/5] Import filespecific widgets when not in same dir as modules. --- src/calibre/gui2/convert/single.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/convert/single.py b/src/calibre/gui2/convert/single.py index 27e1fb3bf4..5c6832f58a 100644 --- a/src/calibre/gui2/convert/single.py +++ b/src/calibre/gui2/convert/single.py @@ -136,9 +136,10 @@ class Config(ResizableDialog, Ui_Dialog): ps = widget_factory(PageSetupWidget) output_widget = None - name = self.plumber.output_plugin.name.lower().replace(' ', '_') + name = 'calibre.gui2.convert.%s' % self.plumber.output_plugin.name.lower().replace(' ', '_') try: - output_widget = __import__(name) + __import__(name) + output_widget = sys.modules[name] pw = output_widget.PluginWidget pw.ICON = ':/images/back.svg' pw.HELP = _('Options specific to the output format.') From dbe4123bc23c1b5cae7cdfb28f02ccf5a39c3016 Mon Sep 17 00:00:00 2001 From: John Schember Date: Wed, 6 May 2009 07:01:27 -0400 Subject: [PATCH 3/5] Auto convert: Check for format, use correct format in conversion. --- src/calibre/gui2/device.py | 16 ++++++++++------ src/calibre/gui2/main.py | 2 +- src/calibre/gui2/tools.py | 6 ++++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index aa77eb6718..3541d8105f 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -678,16 +678,20 @@ class DeviceGUI(object): bad.append(self.library_view.model().title(row)) if auto != []: - autos = [self.library_view.model().title(row) for row in auto] - autos = '\n'.join('
  • %s
  • '%(i,) for i in autos) - d = info_dialog(self, _('No suitable formats'), - _('Auto converting the following books before uploading to the device:
      %s
    ')%(autos,)) + format = None for fmt in self.device_manager.device_class.settings().format_map: if fmt in list(set(self.device_manager.device_class.settings().format_map).intersection(set(available_output_formats()))): format = fmt break - d.exec_() - self.auto_convert(_auto_ids, on_card, format) + if format is None: + bad += auto + else: + autos = [self.library_view.model().title(row) for row in auto] + autos = '\n'.join('
  • %s
  • '%(i,) for i in autos) + d = info_dialog(self, _('No suitable formats'), + _('Auto converting the following books before uploading to the device:
      %s
    ')%(autos,)) + d.exec_() + self.auto_convert(_auto_ids, on_card, format) if bad: bad = '\n'.join('
  • %s
  • '%(i,) for i in bad) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index fbdf26987b..1d0281ead7 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -973,7 +973,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): def auto_convert(self, row_ids, on_card, format): previous = self.library_view.currentIndex() - jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, row_ids, True) + jobs, changed, bad = convert_single_ebook(self, self.library_view.model().db, row_ids, True, format) if jobs == []: return for func, args, desc, fmt, id, temp_files in jobs: if id not in bad: diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index 1b217af86c..03ff2b150a 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -14,7 +14,7 @@ from calibre.gui2.convert import load_specifics from calibre.gui2.convert.single import NoSupportedInputFormats from calibre.gui2.convert.single import Config as SingleConfig -def convert_single_ebook(parent, db, row_ids, auto_conversion=False): +def convert_single_ebook(parent, db, row_ids, auto_conversion=False out_format=None): changed = False jobs = [] bad = [] @@ -28,10 +28,12 @@ def convert_single_ebook(parent, db, row_ids, auto_conversion=False): temp_files = [] try: - d = SingleConfig(parent, db, row_id) + d = SingleConfig(parent, db, row_id, None, out_format) if auto_conversion: result = QDialog.Accepted + if d.output_format != out_format: + raise Exception('Output format not supported.') else: result = d.exec_() From 6368f86626b3afa0cc986fa95184c6dda106f66d Mon Sep 17 00:00:00 2001 From: John Schember Date: Wed, 6 May 2009 07:40:15 -0400 Subject: [PATCH 4/5] Beginnings of gui_conversion module. --- src/calibre/ebooks/conversion/cli.py | 1 + src/calibre/gui2/convert/gui_conversion.py | 17 ++++++++++ src/calibre/gui2/tools.py | 18 ++++------- src/calibre/parallel.py | 37 +++------------------- 4 files changed, 29 insertions(+), 44 deletions(-) create mode 100644 src/calibre/gui2/convert/gui_conversion.py diff --git a/src/calibre/ebooks/conversion/cli.py b/src/calibre/ebooks/conversion/cli.py index 4c9b08df96..6c190759f7 100644 --- a/src/calibre/ebooks/conversion/cli.py +++ b/src/calibre/ebooks/conversion/cli.py @@ -211,6 +211,7 @@ def main(args=sys.argv): OptionRecommendation.HIGH) \ for n in parser.options_iter() if n.dest] + print recommendations plumber.merge_ui_recommendations(recommendations) plumber.run() diff --git a/src/calibre/gui2/convert/gui_conversion.py b/src/calibre/gui2/convert/gui_conversion.py new file mode 100644 index 0000000000..a4cb6c88d6 --- /dev/null +++ b/src/calibre/gui2/convert/gui_conversion.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- + +__license__ = 'GPL 3' +__copyright__ = '2009, John Schember ' +__docformat__ = 'restructuredtext en' + +import logging + +from calibre.ebooks.conversion.plumber import Plumber +from calibre.utils.logging import Log + +def gui_convert(input, output, recommendations): + plumber = Plumber(input, output, Log()) + plumber.merge_ui_recommendations(recommendations) + + plumber.run() + diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index 03ff2b150a..c83fcf4889 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -6,7 +6,9 @@ __docformat__ = 'restructuredtext en' ''' Logic for setting up conversion jobs ''' -import os + +import cPickle, os + from PyQt4.Qt import QDialog from calibre.ptempfile import PersistentTemporaryFile @@ -14,7 +16,7 @@ from calibre.gui2.convert import load_specifics from calibre.gui2.convert.single import NoSupportedInputFormats from calibre.gui2.convert.single import Config as SingleConfig -def convert_single_ebook(parent, db, row_ids, auto_conversion=False out_format=None): +def convert_single_ebook(parent, db, row_ids, auto_conversion=False, out_format=None): changed = False jobs = [] bad = [] @@ -32,8 +34,6 @@ def convert_single_ebook(parent, db, row_ids, auto_conversion=False out_format=N if auto_conversion: result = QDialog.Accepted - if d.output_format != out_format: - raise Exception('Output format not supported.') else: result = d.exec_() @@ -47,14 +47,10 @@ def convert_single_ebook(parent, db, row_ids, auto_conversion=False out_format=N desc = _('Convert book %d of %d (%s)') % (i + 1, total, repr(mi.title)) - opts = load_specifics(db, row_id) - opts_string = '' - for opt in opts.keys(): - opts_string += ' --%s %s ' % (opt, opts[opt]) - - args = [['', in_file, out_file.name, opts_string]] + recs = cPickle.loads(d.recommendations) + args = [in_file, out_file.name, recs] temp_files = [out_file] - jobs.append(('ebook-convert', args, desc, d.output_format.upper(), row_id, temp_files)) + jobs.append(('gui_convert', args, desc, d.output_format.upper(), row_id, temp_files)) changed = True except NoSupportedInputFormats: diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index cb14c4ed20..ff1180e4b4 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -38,50 +38,21 @@ DEBUG = False #: A mapping from job names to functions that perform the jobs PARALLEL_FUNCS = { - 'any2lrf' : - ('calibre.ebooks.lrf.any.convert_from', 'main', dict(gui_mode=True), None), - 'lrfviewer' : ('calibre.gui2.lrf_renderer.main', 'main', {}, None), 'ebook-viewer' : ('calibre.gui2.viewer.main', 'main', {}, None), - 'feeds2lrf' : - ('calibre.ebooks.lrf.feeds.convert_from', 'main', {}, 'notification'), - - 'render_table' : - ('calibre.ebooks.lrf.html.table_as_image', 'do_render', {}, None), - 'render_pages' : ('calibre.ebooks.comic.input', 'render_pages', {}, 'notification'), - 'comic2lrf' : - ('calibre.ebooks.lrf.comic.convert_from', 'do_convert', {}, 'notification'), - - 'any2epub' : - ('calibre.ebooks.epub.from_any', 'any2epub', {}, None), - - 'feeds2epub' : - ('calibre.ebooks.epub.from_feeds', 'main', {}, 'notification'), - - 'comic2epub' : - ('calibre.ebooks.epub.from_comic', 'convert', {}, 'notification'), - - 'any2mobi' : - ('calibre.ebooks.mobi.from_any', 'any2mobi', {}, None), - - 'any2pdf' : - ('calibre.ebooks.pdf.from_any', 'any2pdf', {}, None), - - 'feeds2mobi' : - ('calibre.ebooks.mobi.from_feeds', 'main', {}, 'notification'), - - 'comic2mobi' : - ('calibre.ebooks.mobi.from_comic', 'convert', {}, 'notification'), - 'ebook-convert' : ('calibre.ebooks.conversion.cli', 'main', {}, None), + + + 'gui_convert' : + ('calibre.gui2.convert.gui_conversion', 'gui_convert', {}, None), } From 0a67d845985cd99bd8329b04f3434edaa58130d1 Mon Sep 17 00:00:00 2001 From: John Schember Date: Wed, 6 May 2009 19:10:46 -0400 Subject: [PATCH 5/5] Progress reporting for gui conversion. --- src/calibre/gui2/convert/gui_conversion.py | 4 ++-- src/calibre/gui2/tools.py | 17 ++++++++--------- src/calibre/parallel.py | 3 +-- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/calibre/gui2/convert/gui_conversion.py b/src/calibre/gui2/convert/gui_conversion.py index a4cb6c88d6..1d41b4ec29 100644 --- a/src/calibre/gui2/convert/gui_conversion.py +++ b/src/calibre/gui2/convert/gui_conversion.py @@ -9,8 +9,8 @@ import logging from calibre.ebooks.conversion.plumber import Plumber from calibre.utils.logging import Log -def gui_convert(input, output, recommendations): - plumber = Plumber(input, output, Log()) +def gui_convert(input, output, recommendations, notification): + plumber = Plumber(input, output, Log(), notification) plumber.merge_ui_recommendations(recommendations) plumber.run() diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index c83fcf4889..230ab9d5f6 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -16,21 +16,21 @@ from calibre.gui2.convert import load_specifics from calibre.gui2.convert.single import NoSupportedInputFormats from calibre.gui2.convert.single import Config as SingleConfig -def convert_single_ebook(parent, db, row_ids, auto_conversion=False, out_format=None): +def convert_single_ebook(parent, db, book_ids, auto_conversion=False, out_format=None): changed = False jobs = [] bad = [] - total = len(row_ids) + total = len(book_ids) if total == 0: return None, None, None parent.status_bar.showMessage(_('Starting conversion of %d books') % total, 2000) - for i, row_id in enumerate(row_ids): + for i, book_id in enumerate(book_ids): temp_files = [] try: - d = SingleConfig(parent, db, row_id, None, out_format) + d = SingleConfig(parent, db, book_id, None, out_format) if auto_conversion: result = QDialog.Accepted @@ -38,8 +38,8 @@ def convert_single_ebook(parent, db, row_ids, auto_conversion=False, out_format= result = d.exec_() if result == QDialog.Accepted: - mi = db.get_metadata(row_id, True) - in_file = db.format_abspath(row_id, d.input_format, True) + mi = db.get_metadata(book_id, True) + in_file = db.format_abspath(book_id, d.input_format, True) out_file = PersistentTemporaryFile('.' + d.output_format) out_file.write(d.output_format) @@ -50,11 +50,11 @@ def convert_single_ebook(parent, db, row_ids, auto_conversion=False, out_format= recs = cPickle.loads(d.recommendations) args = [in_file, out_file.name, recs] temp_files = [out_file] - jobs.append(('gui_convert', args, desc, d.output_format.upper(), row_id, temp_files)) + jobs.append(('gui_convert', args, desc, d.output_format.upper(), book_id, temp_files)) changed = True except NoSupportedInputFormats: - bad.append(row_id) + bad.append(book_id) if bad != []: res = [] @@ -67,7 +67,6 @@ def convert_single_ebook(parent, db, row_ids, auto_conversion=False, out_format= return jobs, changed, bad - def convert_bulk_ebooks(*args): pass #(fmt, parent, db, comics, others): diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index ff1180e4b4..a238b29754 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -50,9 +50,8 @@ PARALLEL_FUNCS = { 'ebook-convert' : ('calibre.ebooks.conversion.cli', 'main', {}, None), - 'gui_convert' : - ('calibre.gui2.convert.gui_conversion', 'gui_convert', {}, None), + ('calibre.gui2.convert.gui_conversion', 'gui_convert', {}, 'notification'), }