GUI: Convert single.

This commit is contained in:
John Schember 2009-05-05 07:33:15 -04:00
parent 05a9732dbb
commit 035d85392a
2 changed files with 37 additions and 144 deletions

View File

@ -1004,18 +1004,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
_('No books selected')) _('No books selected'))
d.exec_() d.exec_()
return [], [] return [], []
comics, others = [], [] return [self.library_view.model().db.id(r) for r in rows]
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
def convert_bulk(self, checked): def convert_bulk(self, checked):
r = self.get_books_for_conversion() 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) set_conversion_defaults(True, self, self.library_view.model().db)
def convert_single(self, checked): def convert_single(self, checked):
r = self.get_books_for_conversion() row_ids = self.get_books_for_conversion()
if r is None: return if row_ids is None: return
previous = self.library_view.currentIndex() previous = self.library_view.currentIndex()
rows = [x.row() for x in \ rows = [x.row() for x in \
self.library_view.selectionModel().selectedRows()] self.library_view.selectionModel().selectedRows()]
comics, others = r
jobs, changed = convert_single_ebook(self, 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: for func, args, desc, fmt, id, temp_files in jobs:
job = self.job_manager.run_job(Dispatcher(self.book_converted), job = self.job_manager.run_job(Dispatcher(self.book_converted),
func, args=args, description=desc) func, args=args, description=desc)

View File

@ -14,6 +14,9 @@ from calibre.utils.config import prefs
from calibre.gui2 import warning_dialog from calibre.gui2 import warning_dialog
from calibre.ptempfile import PersistentTemporaryFile 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 # Ordered list of source formats. Items closer to the beginning are
# preferred for conversion over those toward the end. # preferred for conversion over those toward the end.
PREFERRED_SOURCE_FORMATS = ['epub', 'lit', 'mobi', 'prc', 'azw', 'fb2', 'odt', 'rtf', 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 return None, None, None
parent.status_bar.showMessage(_('Starting auto conversion of %d books')%total, 2000) parent.status_bar.showMessage(_('Starting auto conversion of %d books')%total, 2000)
i = 0
bad_rows = [] bad_rows = []
for i, row in enumerate(rows): for i, row in enumerate(rows):
@ -85,133 +87,43 @@ def auto_convert(fmt, parent, db, rows):
return jobs, changed, bad_rows return jobs, changed, bad_rows
def convert_single(fmt, parent, db, comics, others): def convert_single_ebook(parent, db, row_ids):
changed = False changed = False
jobs = [] 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): total = len(row_ids)
mi = db.get_metadata(row) if total == 0:
title = author = _('Unknown') return None, None, None
if mi.title: parent.status_bar.showMessage(_('Starting conversion of %d books') % total, 2000)
title = mi.title
if mi.authors: for i, row_id in enumerate(row_ids):
author = ','.join(mi.authors) temp_files = []
defaults = db.conversion_options(db.id(row), 'comic')
opts, defaults = ComicConf.get_conversion_options(parent, defaults, title, author) d = SingleConfig(parent, db, row_id)
if defaults is not None: if d.exec_() == QDialog.Accepted:
db.set_conversion_options(db.id(row), 'comic', defaults) mi = db.get_metadata(row_id, True)
if opts is None: continue in_file = db.format_abspath(row_id, d.input_format, True)
for _fmt in ['cbz', 'cbr']:
try: out_file = PersistentTemporaryFile('.' + d.output_format)
data = db.format(row, _fmt.upper()) out_file.write(d.output_format)
if data is not None: out_file.close()
break
except: desc = _('Convert book %d of %d (%s)') % (i + 1, total, repr(mi.title))
continue
pt = PersistentTemporaryFile('.'+_fmt) opts = load_specifics(db, row_id)
pt.write(data) opts_string = ''
pt.close() for opt in opts.keys():
of = PersistentTemporaryFile('.'+fmt) opts_string += ' --%s %s ' % (opt, opts[opt])
of.close()
opts.output = of.name args = [['', in_file, out_file.name, opts_string]]
opts.verbose = 2 temp_files = [out_file]
args = [pt.name, opts] jobs.append(('ebook-convert', args, desc, d.output_format.upper(), row_id, temp_files))
changed = True changed = True
jobs.append(('comic2'+fmt, args, _('Convert comic: ')+opts.title,
fmt.upper(), row_id, [pt, of]))
return jobs, changed 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(fmt, parent, db, comics, others):
if others: if others:
d = get_dialog(fmt)(parent, db) d = get_dialog(fmt)(parent, db)
@ -454,13 +366,6 @@ def fetch_scheduled_recipe(recipe, script):
def auto_convert_ebook(*args): def auto_convert_ebook(*args):
return auto_convert(*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): def convert_bulk_ebooks(*args):
fmt = prefs['output_format'].lower() fmt = prefs['output_format'].lower()
if fmt == 'lrf': if fmt == 'lrf':