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..1d41b4ec29 --- /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, notification): + plumber = Plumber(input, output, Log(), notification) + plumber.merge_ui_recommendations(recommendations) + + plumber.run() + 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.') 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:
    ')%(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:
    ')%(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 8393414518..1d0281ead7 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, format) 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..230ab9d5f6 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,30 +16,30 @@ 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, 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) + d = SingleConfig(parent, db, book_id, None, out_format) if auto_conversion: result = QDialog.Accepted else: - retult = d.exec_() + 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) @@ -45,18 +47,14 @@ def convert_single_ebook(parent, db, row_ids, auto_conversion=False): 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(), book_id, temp_files)) changed = True except NoSupportedInputFormats: - bad.append(row_id) + bad.append(book_id) if bad != []: res = [] @@ -67,8 +65,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): pass diff --git a/src/calibre/parallel.py b/src/calibre/parallel.py index cb14c4ed20..a238b29754 100644 --- a/src/calibre/parallel.py +++ b/src/calibre/parallel.py @@ -38,50 +38,20 @@ 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', {}, 'notification'), }