From 05a9732dbbea0ea86215742e72a3cb6b0429c096 Mon Sep 17 00:00:00 2001 From: John Schember Date: Tue, 5 May 2009 06:55:28 -0400 Subject: [PATCH 1/6] Wrong init arg. Remove unknown argument. --- src/calibre/gui2/convert/single.py | 2 +- upload.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/convert/single.py b/src/calibre/gui2/convert/single.py index 295656237b..27e1fb3bf4 100644 --- a/src/calibre/gui2/convert/single.py +++ b/src/calibre/gui2/convert/single.py @@ -89,7 +89,7 @@ class Config(ResizableDialog, Ui_Dialog): None) self.setup_input_output_formats(db, book_id, preferred_input_format, - preferred_input_format) + preferred_output_format) self.db, self.book_id = db, book_id self.setup_pipeline() diff --git a/upload.py b/upload.py index 2a6261e3bc..131c43c56c 100644 --- a/upload.py +++ b/upload.py @@ -286,7 +286,7 @@ class gui(OptionlessCommand): with open('images.qrc', 'wb') as f: f.write(manifest) try: - check_call(['pyrcc4', '-py2', '-o', images, 'images.qrc']) + check_call(['pyrcc4', '-o', images, 'images.qrc']) except: import traceback traceback.print_exc() From 035d85392a254c0df4fe134bf91bfb838ff0ffdc Mon Sep 17 00:00:00 2001 From: John Schember Date: Tue, 5 May 2009 07:33:15 -0400 Subject: [PATCH 2/6] GUI: Convert single. --- src/calibre/gui2/main.py | 20 +---- src/calibre/gui2/tools.py | 161 ++++++++------------------------------ 2 files changed, 37 insertions(+), 144 deletions(-) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index b78e0c27d9..dd460b6011 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -1004,18 +1004,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): _('No books selected')) d.exec_() return [], [] - comics, others = [], [] - db = self.library_view.model().db - for r in rows: - formats = db.formats(r) - if not formats: continue - formats = formats.lower().split(',') - if 'cbr' in formats or 'cbz' in formats: - comics.append(r) - else: - others.append(r) - return comics, others - + return [self.library_view.model().db.id(r) for r in rows] def convert_bulk(self, checked): r = self.get_books_for_conversion() @@ -1044,14 +1033,13 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): set_conversion_defaults(True, self, self.library_view.model().db) def convert_single(self, checked): - r = self.get_books_for_conversion() - if r is None: return + row_ids = self.get_books_for_conversion() + if row_ids is None: return previous = self.library_view.currentIndex() rows = [x.row() for x in \ self.library_view.selectionModel().selectedRows()] - comics, others = r jobs, changed = convert_single_ebook(self, - self.library_view.model().db, comics, others) + 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), func, args=args, description=desc) diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index d164daff95..e85c749482 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -14,6 +14,9 @@ from calibre.utils.config import prefs from calibre.gui2 import warning_dialog from calibre.ptempfile import PersistentTemporaryFile +from calibre.gui2.convert import load_specifics +from calibre.gui2.convert.single import Config as SingleConfig + # Ordered list of source formats. Items closer to the beginning are # preferred for conversion over those toward the end. PREFERRED_SOURCE_FORMATS = ['epub', 'lit', 'mobi', 'prc', 'azw', 'fb2', 'odt', 'rtf', @@ -40,7 +43,6 @@ def auto_convert(fmt, parent, db, rows): return None, None, None parent.status_bar.showMessage(_('Starting auto conversion of %d books')%total, 2000) - i = 0 bad_rows = [] for i, row in enumerate(rows): @@ -85,133 +87,43 @@ def auto_convert(fmt, parent, db, rows): return jobs, changed, bad_rows -def convert_single(fmt, parent, db, comics, others): +def convert_single_ebook(parent, db, row_ids): changed = False jobs = [] - others_ids = [db.id(row) for row in others] - comics_ids = [db.id(row) for row in comics] - for row, row_id in zip(others, others_ids): - temp_files = [] - d = get_dialog(fmt)(parent, db, row) - if d.source_format is not None: - d.exec_() - if d.result() == QDialog.Accepted: - opts = d.opts - data = db.format(row, d.source_format) - pt = PersistentTemporaryFile('.'+d.source_format.lower()) - pt.write(data) - pt.close() - of = PersistentTemporaryFile('.'+fmt) - of.close() - opts.output = of.name - opts.from_opf = d.opf_file.name - opts.verbose = 2 - args = [opts, pt.name] - if d.cover_file: - temp_files.append(d.cover_file) - opts.cover = d.cover_file.name - temp_files.extend([d.opf_file, pt, of]) - jobs.append(('any2'+fmt, args, _('Convert book: ')+d.mi.title, - fmt.upper(), row_id, temp_files)) - changed = True + + total = len(row_ids) + if total == 0: + return None, None, None + parent.status_bar.showMessage(_('Starting conversion of %d books') % total, 2000) - for row, row_id in zip(comics, comics_ids): - mi = db.get_metadata(row) - title = author = _('Unknown') - if mi.title: - title = mi.title - if mi.authors: - author = ','.join(mi.authors) - defaults = db.conversion_options(db.id(row), 'comic') - opts, defaults = ComicConf.get_conversion_options(parent, defaults, title, author) - if defaults is not None: - db.set_conversion_options(db.id(row), 'comic', defaults) - if opts is None: continue - for _fmt in ['cbz', 'cbr']: - try: - data = db.format(row, _fmt.upper()) - if data is not None: - break - except: - continue - pt = PersistentTemporaryFile('.'+_fmt) - pt.write(data) - pt.close() - of = PersistentTemporaryFile('.'+fmt) - of.close() - opts.output = of.name - opts.verbose = 2 - args = [pt.name, opts] - changed = True - jobs.append(('comic2'+fmt, args, _('Convert comic: ')+opts.title, - fmt.upper(), row_id, [pt, of])) + for i, row_id in enumerate(row_ids): + temp_files = [] + + d = SingleConfig(parent, db, row_id) + if d.exec_() == QDialog.Accepted: + mi = db.get_metadata(row_id, True) + in_file = db.format_abspath(row_id, d.input_format, True) + + out_file = PersistentTemporaryFile('.' + d.output_format) + out_file.write(d.output_format) + out_file.close() + + 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]] + temp_files = [out_file] + jobs.append(('ebook-convert', args, desc, d.output_format.upper(), row_id, temp_files)) + + changed = True return jobs, changed - -def convert_single_lrf(parent, db, comics, others): - changed = False - jobs = [] - others_ids = [db.id(row) for row in others] - comics_ids = [db.id(row) for row in comics] - for row, row_id in zip(others, others_ids): - temp_files = [] - d = LRFSingleDialog(parent, db, row) - if d.selected_format: - d.exec_() - if d.result() == QDialog.Accepted: - cmdline = d.cmdline - data = db.format(row, d.selected_format) - pt = PersistentTemporaryFile('.'+d.selected_format.lower()) - pt.write(data) - pt.close() - of = PersistentTemporaryFile('.lrf') - of.close() - cmdline.extend(['-o', of.name]) - cmdline.append(pt.name) - if d.cover_file: - temp_files.append(d.cover_file) - temp_files.extend([pt, of]) - jobs.append(('any2lrf', [cmdline], _('Convert book: ')+d.title(), - 'LRF', row_id, temp_files)) - changed = True - - for row, row_id in zip(comics, comics_ids): - mi = db.get_metadata(row) - title = author = _('Unknown') - if mi.title: - title = mi.title - if mi.authors: - author = ','.join(mi.authors) - defaults = db.conversion_options(db.id(row), 'comic') - opts, defaults = ComicConf.get_conversion_options(parent, defaults, title, author) - if defaults is not None: - db.set_conversion_options(db.id(row), 'comic', defaults) - if opts is None: continue - for fmt in ['cbz', 'cbr']: - try: - data = db.format(row, fmt.upper()) - if data is not None: - break - except: - continue - if data is None: - continue - pt = PersistentTemporaryFile('.'+fmt) - pt.write(data) - pt.close() - of = PersistentTemporaryFile('.lrf') - of.close() - opts.output = of.name - opts.verbose = 1 - args = [pt.name, opts] - changed = True - jobs.append(('comic2lrf', args, _('Convert comic: ')+opts.title, - 'LRF', row_id, [pt, of])) - - return jobs, changed - def convert_bulk(fmt, parent, db, comics, others): if others: d = get_dialog(fmt)(parent, db) @@ -454,13 +366,6 @@ def fetch_scheduled_recipe(recipe, script): def auto_convert_ebook(*args): return auto_convert(*args) -def convert_single_ebook(*args): - fmt = prefs['output_format'].lower() - if fmt == 'lrf': - return convert_single_lrf(*args) - elif fmt in ('epub', 'mobi'): - return convert_single(fmt, *args) - def convert_bulk_ebooks(*args): fmt = prefs['output_format'].lower() if fmt == 'lrf': From c956f5fa30c74b7a691e462fbcb02504faba557c Mon Sep 17 00:00:00 2001 From: John Schember Date: Tue, 5 May 2009 07:51:15 -0400 Subject: [PATCH 3/6] GUI: Convert auto. --- src/calibre/gui2/device.py | 3 +- src/calibre/gui2/main.py | 14 +++--- src/calibre/gui2/tools.py | 87 ++++---------------------------------- 3 files changed, 16 insertions(+), 88 deletions(-) diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 8dd639d7c2..f5b58c28d8 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -686,7 +686,8 @@ class DeviceGUI(object): if fmt in list(set(self.device_manager.device_class.settings().format_map).intersection(set(available_output_formats()))): format = fmt break - d.exec_() + d.exec_() + _auto_rows = [self.library_view.model().db.id(r) for r in _auto_rows] self.auto_convert(_auto_rows, on_card, format) if bad: diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index dd460b6011..8a62aecc68 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -979,17 +979,15 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): ############################### Convert #################################### - def auto_convert(self, rows, on_card, format): + def auto_convert(self, row_ids, on_card, format): previous = self.library_view.currentIndex() - jobs, changed, bad_rows = auto_convert_ebook(format, self, self.library_view.model().db, rows) - if jobs is None: - return + jobs, changed = 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: - if id not in bad_rows: - 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) + 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) if changed: self.library_view.model().refresh_rows(rows) diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index e85c749482..d04625bb98 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -9,85 +9,11 @@ Logic for setting up conversion jobs import os from PyQt4.Qt import QDialog -from calibre.customize.ui import available_input_formats -from calibre.utils.config import prefs -from calibre.gui2 import warning_dialog from calibre.ptempfile import PersistentTemporaryFile - from calibre.gui2.convert import load_specifics from calibre.gui2.convert.single import Config as SingleConfig -# Ordered list of source formats. Items closer to the beginning are -# preferred for conversion over those toward the end. -PREFERRED_SOURCE_FORMATS = ['epub', 'lit', 'mobi', 'prc', 'azw', 'fb2', 'odt', 'rtf', - 'txt', 'pdf', 'oebzip', 'htm', 'html'] - -def get_dialog(fmt): - return { - 'epub':EPUBConvert, - 'mobi':MOBIConvert, - }[fmt] - -def get_config(fmt): - return { - 'epub':epubconfig, - 'mobi':mobiconfig, - }[fmt] - -def auto_convert(fmt, parent, db, rows): - changed = False - jobs = [] - - total = len(rows) - if total == 0: - return None, None, None - parent.status_bar.showMessage(_('Starting auto conversion of %d books')%total, 2000) - - bad_rows = [] - - for i, row in enumerate(rows): - row_id = db.id(row) - - temp_files = [] - - data = None - in_formats = [f.lower() for f in db.formats(row).split(',')] - in_formats = list(set(in_formats).intersection(available_input_formats())) - for _fmt in PREFERRED_SOURCE_FORMATS: - if _fmt in in_formats: - data = _fmt - break - if data is None: - if in_formats != []: - data = list(in_formats)[0] - else: - bad_rows.append(row) - continue - - mi = db.get_metadata(row) - in_file = db.format_abspath(row, data) - out_file = PersistentTemporaryFile('.'+fmt.lower()) - out_file.write(data) - out_file.close() - desc = _('Auto convert book %d of %d (%s)')%(i+1, total, repr(mi.title)) - args = [['', in_file, out_file.name]] - temp_files = [out_file] - jobs.append(('ebook-convert', args, desc, fmt.upper(), row_id, temp_files)) - - changed = True - - if bad_rows: - res = [] - for row in bad_rows: - title = db.title(row) - res.append('
  • %s
  • '%title) - - msg = _('

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

      %s
    ')%(len(res), total, '\n'.join(res)) - warning_dialog(parent, _('Could not convert some books'), msg).exec_() - - return jobs, changed, bad_rows - -def convert_single_ebook(parent, db, row_ids): +def convert_single_ebook(parent, db, row_ids, auto_conversion=False): changed = False jobs = [] @@ -100,7 +26,13 @@ def convert_single_ebook(parent, db, row_ids): temp_files = [] d = SingleConfig(parent, db, row_id) - if d.exec_() == QDialog.Accepted: + + if auto_conversion: + result = QDialog.Accepted + else: + retult = d.exec_() + + if result == QDialog.Accepted: mi = db.get_metadata(row_id, True) in_file = db.format_abspath(row_id, d.input_format, True) @@ -363,9 +295,6 @@ def fetch_scheduled_recipe(recipe, script): args.append(script) return 'feeds2'+fmt, [args], _('Fetch news from ')+recipe.title, fmt.upper(), [pt] -def auto_convert_ebook(*args): - return auto_convert(*args) - def convert_bulk_ebooks(*args): fmt = prefs['output_format'].lower() if fmt == 'lrf': From 970430c40f98a9010e0d165d7e01fbb01e1d6605 Mon Sep 17 00:00:00 2001 From: John Schember Date: Tue, 5 May 2009 07:57:50 -0400 Subject: [PATCH 4/6] GUI: Convert, remove old default config functions. --- src/calibre/gui2/main.py | 17 +---- src/calibre/gui2/tools.py | 131 ++------------------------------------ 2 files changed, 5 insertions(+), 143 deletions(-) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 8a62aecc68..22b49cdffd 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -36,9 +36,7 @@ from calibre.gui2.dialogs.metadata_single import MetadataSingleDialog from calibre.gui2.dialogs.metadata_bulk import MetadataBulkDialog from calibre.gui2.dialogs.jobs import JobsDialog from calibre.gui2.dialogs.conversion_error import ConversionErrorDialog -from calibre.gui2.tools import convert_single_ebook, convert_bulk_ebooks, \ - set_conversion_defaults, fetch_scheduled_recipe, \ - auto_convert_ebook +from calibre.gui2.tools import convert_single_ebook, fetch_scheduled_recipe from calibre.gui2.dialogs.config import ConfigDialog from calibre.gui2.dialogs.search import SearchDialog from calibre.gui2.dialogs.choose_format import ChooseFormatDialog @@ -233,18 +231,11 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): cm = QMenu() cm.addAction(_('Convert individually')) cm.addAction(_('Bulk convert')) - cm.addSeparator() - cm.addAction(_('Set defaults for conversion')) - cm.addAction(_('Set defaults for conversion of comics')) self.action_convert.setMenu(cm) QObject.connect(cm.actions()[0], SIGNAL('triggered(bool)'), self.convert_single) QObject.connect(cm.actions()[1], SIGNAL('triggered(bool)'), self.convert_bulk) - QObject.connect(cm.actions()[3], - SIGNAL('triggered(bool)'), self.set_conversion_defaults) - QObject.connect(cm.actions()[4], - SIGNAL('triggered(bool)'), self.set_comic_conversion_defaults) QObject.connect(self.action_convert, SIGNAL('triggered(bool)'), self.convert_single) self.convert_menu = cm @@ -1024,12 +1015,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): self.library_view.model().resort(reset=False) self.library_view.model().research() - def set_conversion_defaults(self, checked): - set_conversion_defaults(False, self, self.library_view.model().db) - - def set_comic_conversion_defaults(self, checked): - set_conversion_defaults(True, self, self.library_view.model().db) - def convert_single(self, checked): row_ids = self.get_books_for_conversion() if row_ids is None: return diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index d04625bb98..fcf0905a29 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -56,7 +56,9 @@ def convert_single_ebook(parent, db, row_ids, auto_conversion=False): return jobs, changed -def convert_bulk(fmt, parent, db, comics, others): +def convert_bulk_ebooks(*args): + pass + #(fmt, parent, db, comics, others): if others: d = get_dialog(fmt)(parent, db) if d.exec_() != QDialog.Accepted: @@ -158,117 +160,6 @@ def convert_bulk(fmt, parent, db, comics, others): return jobs, False - -def convert_bulk_lrf(parent, db, comics, others): - if others: - d = LRFBulkDialog(parent) - if d.exec_() != QDialog.Accepted: - others = [] - if comics: - comic_opts = ComicConf.get_bulk_conversion_options(parent) - if not comic_opts: - comics = [] - bad_rows = [] - jobs = [] - total = sum(map(len, (others, comics))) - if total == 0: - return - parent.status_bar.showMessage(_('Starting Bulk conversion of %d books')%total, 2000) - - for i, row in enumerate(others+comics): - row_id = db.id(row) - if row in others: - cmdline = list(d.cmdline) - mi = db.get_metadata(row) - if mi.title: - cmdline.extend(['--title', mi.title]) - if mi.authors: - cmdline.extend(['--author', ','.join(mi.authors)]) - if mi.publisher: - cmdline.extend(['--publisher', mi.publisher]) - if mi.comments: - cmdline.extend(['--comment', mi.comments]) - data = None - for fmt in LRF_PREFERRED_SOURCE_FORMATS: - try: - data = db.format(row, fmt.upper()) - if data is not None: - break - except: - continue - if data is None: - bad_rows.append(row) - continue - pt = PersistentTemporaryFile('.'+fmt.lower()) - pt.write(data) - pt.close() - of = PersistentTemporaryFile('.lrf') - of.close() - cover = db.cover(row) - cf = None - if cover: - cf = PersistentTemporaryFile('.jpeg') - cf.write(cover) - cf.close() - cmdline.extend(['--cover', cf.name]) - cmdline.extend(['-o', of.name]) - cmdline.append(pt.name) - desc = _('Convert book %d of %d (%s)')%(i+1, total, repr(mi.title)) - temp_files = [cf] if cf is not None else [] - temp_files.extend([pt, of]) - jobs.append(('any2lrf', [cmdline], desc, 'LRF', row_id, temp_files)) - else: - options = comic_opts.copy() - mi = db.get_metadata(row) - if mi.title: - options.title = mi.title - if mi.authors: - options.author = ','.join(mi.authors) - data = None - for fmt in ['cbz', 'cbr']: - try: - data = db.format(row, fmt.upper()) - if data is not None: - break - except: - continue - - pt = PersistentTemporaryFile('.'+fmt.lower()) - pt.write(data) - pt.close() - of = PersistentTemporaryFile('.lrf') - of.close() - setattr(options, 'output', of.name) - options.verbose = 1 - args = [pt.name, options] - desc = _('Convert book %d of %d (%s)')%(i+1, total, repr(mi.title)) - jobs.append(('comic2lrf', args, desc, 'LRF', row_id, [pt, of])) - - if bad_rows: - res = [] - for row in bad_rows: - title = db.title(row) - res.append('
  • %s
  • '%title) - - msg = _('

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

      %s
    ')%(len(res), total, '\n'.join(res)) - warning_dialog(parent, _('Could not convert some books'), msg).exec_() - - return jobs, False - -def set_conversion_defaults_lrf(comic, parent, db): - if comic: - ComicConf.set_conversion_defaults(parent) - else: - LRFSingleDialog(parent, None, None).exec_() - -def _set_conversion_defaults(dialog, comic, parent, db): - if comic: - ComicConf.set_conversion_defaults(parent) - else: - d = dialog(parent, db) - d.setWindowTitle(_('Set conversion defaults')) - d.exec_() - def _fetch_news(data, fmt): pt = PersistentTemporaryFile(suffix='_feeds2%s.%s'%(fmt.lower(), fmt.lower())) pt.close() @@ -278,7 +169,7 @@ def _fetch_news(data, fmt): if data['password']: args.extend(['--password', data['password']]) args.append(data['script'] if data['script'] else data['title']) - return 'feeds2'+fmt.lower(), [args], _('Fetch news from ')+data['title'], fmt.upper(), [pt] + return 'fconvert_bulk_ebookseeds2'+fmt.lower(), [args], _('Fetch news from ')+data['title'], fmt.upper(), [pt] def fetch_scheduled_recipe(recipe, script): @@ -295,20 +186,6 @@ def fetch_scheduled_recipe(recipe, script): args.append(script) return 'feeds2'+fmt, [args], _('Fetch news from ')+recipe.title, fmt.upper(), [pt] -def convert_bulk_ebooks(*args): - fmt = prefs['output_format'].lower() - if fmt == 'lrf': - return convert_bulk_lrf(*args) - elif fmt in ('epub', 'mobi'): - return convert_bulk(fmt, *args) - -def set_conversion_defaults(comic, parent, db): - fmt = prefs['output_format'].lower() - if fmt == 'lrf': - return set_conversion_defaults_lrf(comic, parent, db) - elif fmt in ('epub', 'mobi'): - return _set_conversion_defaults(get_dialog(fmt), comic, parent, db) - def fetch_news(data): fmt = prefs['output_format'].lower() return _fetch_news(data, fmt) From 3c045737da2f85edb05fa55074dbb31a7cd77c7a Mon Sep 17 00:00:00 2001 From: John Schember Date: Tue, 5 May 2009 08:26:14 -0400 Subject: [PATCH 5/6] GUI: Convert, use book_ids when possible. --- src/calibre/gui2/device.py | 23 +++++++++++------------ src/calibre/gui2/main.py | 3 +-- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index f5b58c28d8..aa77eb6718 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -612,23 +612,23 @@ class DeviceGUI(object): def sync_to_device(self, on_card, delete_from_library, - specific_format=None, send_rows=None, do_auto_convert=True): - rows = self.library_view.selectionModel().selectedRows() if send_rows is None else send_rows - if not self.device_manager or not rows or len(rows) == 0: + specific_format=None, send_ids=None, do_auto_convert=True): + ids = [self.library_view.model().id(r) for r in self.library_view.selectionModel().selectedRows()] if send_ids is None else send_ids + if not self.device_manager or not ids or len(ids) == 0: return - _files, _auto_rows = self.library_view.model().get_preferred_formats(rows, + _files, _auto_ids = self.library_view.model().get_preferred_formats_from_ids(ids, self.device_manager.device_class.settings().format_map, paths=True, set_metadata=True, specific_format=specific_format, exclude_auto=do_auto_convert) if do_auto_convert: - rows = list(set(rows).difference(_auto_rows)) + ids = list(set(ids).difference(_auto_ids)) else: - _auto_rows = [] + _auto_ids = [] - ids = iter(self.library_view.model().id(r) for r in rows) - metadata = self.library_view.model().get_metadata(rows) + ids = iter(ids) + metadata = self.library_view.model().get_metadata(ids, True) for mi in metadata: cdata = mi['cover'] if cdata: @@ -662,8 +662,8 @@ class DeviceGUI(object): self.status_bar.showMessage(_('Sending books to device.'), 5000) auto = [] - if _auto_rows != []: - for row in _auto_rows: + if _auto_ids != []: + for row in _auto_ids: if specific_format == None: formats = [f.lower() for f in self.library_view.model().db.formats(row).split(',')] formats = formats if formats != None else [] @@ -687,8 +687,7 @@ class DeviceGUI(object): format = fmt break d.exec_() - _auto_rows = [self.library_view.model().db.id(r) for r in _auto_rows] - self.auto_convert(_auto_rows, on_card, format) + 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 22b49cdffd..8393414518 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -1055,8 +1055,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): current = self.library_view.currentIndex() self.library_view.model().current_changed(current, QModelIndex()) - r = self.library_view.model().index(self.library_view.model().db.row(book_id), 0) - self.sync_to_device(on_card, False, specific_format=fmt, send_rows=[r], do_auto_convert=False) + self.sync_to_device(on_card, False, specific_format=fmt, send_ids=[book_id], do_auto_convert=False) def book_converted(self, job): temp_files, fmt, book_id = self.conversion_jobs.pop(job) From eda53229a4d400af1f4ae6762c59000071f9021b Mon Sep 17 00:00:00 2001 From: John Schember Date: Tue, 5 May 2009 08:41:17 -0400 Subject: [PATCH 6/6] GUI: Convert, check for NoSupportedInputFormats. --- src/calibre/gui2/tools.py | 60 ++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index fcf0905a29..d035a56d34 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -11,11 +11,13 @@ from PyQt4.Qt import QDialog from calibre.ptempfile import PersistentTemporaryFile 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): changed = False jobs = [] + bad = [] total = len(row_ids) if total == 0: @@ -25,33 +27,45 @@ def convert_single_ebook(parent, db, row_ids, auto_conversion=False): for i, row_id in enumerate(row_ids): temp_files = [] - d = SingleConfig(parent, db, row_id) - - if auto_conversion: - result = QDialog.Accepted - else: - retult = d.exec_() - - if result == QDialog.Accepted: - mi = db.get_metadata(row_id, True) - in_file = db.format_abspath(row_id, d.input_format, True) + try: + d = SingleConfig(parent, db, row_id) - out_file = PersistentTemporaryFile('.' + d.output_format) - out_file.write(d.output_format) - out_file.close() - - desc = _('Convert book %d of %d (%s)') % (i + 1, total, repr(mi.title)) + if auto_conversion: + result = QDialog.Accepted + else: + retult = d.exec_() - opts = load_specifics(db, row_id) - opts_string = '' - for opt in opts.keys(): - opts_string += ' --%s %s ' % (opt, opts[opt]) + if result == QDialog.Accepted: + mi = db.get_metadata(row_id, True) + in_file = db.format_abspath(row_id, d.input_format, True) + + out_file = PersistentTemporaryFile('.' + d.output_format) + out_file.write(d.output_format) + out_file.close() - args = [['', in_file, out_file.name, opts_string]] - temp_files = [out_file] - jobs.append(('ebook-convert', args, desc, d.output_format.upper(), row_id, temp_files)) + 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]] + temp_files = [out_file] + jobs.append(('ebook-convert', args, desc, d.output_format.upper(), row_id, temp_files)) - changed = True + changed = True + except NoSupportedInputFormats: + bad.append(row_id) + + if bad != []: + res = [] + for id in bad: + title = db.title(id, True) + res.append('
  • %s
  • '%title) + + msg = _('

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

      %s
    ')%(len(res), total, '\n'.join(res)) + warning_dialog(parent, _('Could not convert some books'), msg).exec_() return jobs, changed