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/src/calibre/gui2/device.py b/src/calibre/gui2/device.py
index 8dd639d7c2..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 []
@@ -686,8 +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_()
- self.auto_convert(_auto_rows, on_card, format)
+ 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 b78e0c27d9..8393414518 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
@@ -979,17 +970,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)
@@ -1004,18 +993,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()
@@ -1037,21 +1015,14 @@ 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):
- 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)
@@ -1084,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)
diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py
index d164daff95..d035a56d34 100644
--- a/src/calibre/gui2/tools.py
+++ b/src/calibre/gui2/tools.py
@@ -9,210 +9,70 @@ 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 NoSupportedInputFormats
+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):
+def convert_single_ebook(parent, db, row_ids, auto_conversion=False):
changed = False
jobs = []
-
- total = len(rows)
+ bad = []
+
+ total = len(row_ids)
if total == 0:
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):
- row_id = db.id(row)
+ parent.status_bar.showMessage(_('Starting conversion of %d books') % total, 2000)
+ for i, row_id in enumerate(row_ids):
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]
+ try:
+ d = SingleConfig(parent, db, row_id)
+
+ if auto_conversion:
+ result = QDialog.Accepted
else:
- bad_rows.append(row)
- continue
+ 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)
+
+ 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))
- 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
+ except NoSupportedInputFormats:
+ bad.append(row_id)
- changed = True
-
- if bad_rows:
+ if bad != []:
res = []
- for row in bad_rows:
- title = db.title(row)
+ 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.
')%(len(res), total, '\n'.join(res))
warning_dialog(parent, _('Could not convert some books'), msg).exec_()
- return jobs, changed, bad_rows
-
-def convert_single(fmt, 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 = 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
-
- 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]))
-
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):
+def convert_bulk_ebooks(*args):
+ pass
+ #(fmt, parent, db, comics, others):
if others:
d = get_dialog(fmt)(parent, db)
if d.exec_() != QDialog.Accepted:
@@ -314,117 +174,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.
')%(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()
@@ -434,7 +183,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):
@@ -451,30 +200,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_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':
- 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)
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()