mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Implement Bulk conversion of ebooks
This commit is contained in:
parent
4f88faf537
commit
87c34c73cc
@ -33,6 +33,21 @@ from libprs500 import __appname__, __version__, __author__, iswindows, OptionPar
|
||||
|
||||
__docformat__ = "epytext"
|
||||
|
||||
preferred_source_formats = [
|
||||
'LIT',
|
||||
'MOBI',
|
||||
'HTML',
|
||||
'HTM',
|
||||
'XHTM',
|
||||
'XHTML',
|
||||
'PRC',
|
||||
'RTF',
|
||||
'PDF',
|
||||
'TXT',
|
||||
'ZIP',
|
||||
'RAR'
|
||||
]
|
||||
|
||||
class LRFParseError(Exception):
|
||||
pass
|
||||
|
||||
|
@ -47,6 +47,18 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog):
|
||||
src = opt.get_opt_string()
|
||||
return 'gui_' + src[2:].replace('-', '_')
|
||||
|
||||
def initialize_common(self):
|
||||
self.output_format = 'LRF'
|
||||
self.setup_tooltips()
|
||||
self.initialize_options()
|
||||
global font_family_model
|
||||
if font_family_model is None:
|
||||
font_family_model = FontFamilyModel()
|
||||
self.font_family_model = font_family_model
|
||||
self.gui_serif_family.setModel(self.font_family_model)
|
||||
self.gui_sans_family.setModel(self.font_family_model)
|
||||
self.gui_mono_family.setModel(self.font_family_model)
|
||||
|
||||
def __init__(self, window, db, row):
|
||||
QDialog.__init__(self, window)
|
||||
Ui_LRFSingleDialog.__init__(self)
|
||||
@ -57,22 +69,13 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog):
|
||||
QObject.connect(self.cover_button, SIGNAL("clicked(bool)"), self.select_cover)
|
||||
self.categoryList.leaveEvent = self.reset_help
|
||||
self.reset_help()
|
||||
self.output_format = 'LRF'
|
||||
self.selected_format = None
|
||||
self.setup_tooltips()
|
||||
self.initialize_options()
|
||||
self.initialize_common()
|
||||
self.db = db
|
||||
self.row = row
|
||||
self.cover_changed = False
|
||||
self.cpixmap = None
|
||||
self.changed = False
|
||||
global font_family_model
|
||||
if font_family_model is None:
|
||||
font_family_model = FontFamilyModel()
|
||||
self.font_family_model = font_family_model
|
||||
self.gui_serif_family.setModel(self.font_family_model)
|
||||
self.gui_sans_family.setModel(self.font_family_model)
|
||||
self.gui_mono_family.setModel(self.font_family_model)
|
||||
|
||||
|
||||
self.load_saved_global_defaults()
|
||||
@ -380,3 +383,22 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog):
|
||||
QSettings().setValue('LRF conversion defaults', QVariant(QByteArray(cPickle.dumps(cmdline))))
|
||||
QDialog.accept(self)
|
||||
|
||||
class LRFBulkDialog(LRFSingleDialog):
|
||||
|
||||
def __init__(self, window):
|
||||
QDialog.__init__(self, window)
|
||||
Ui_LRFSingleDialog.__init__(self)
|
||||
self.setupUi(self)
|
||||
|
||||
self.categoryList.takeItem(0)
|
||||
self.stack.removeWidget(self.stack.widget(0))
|
||||
self.categoryList.setCurrentRow(0)
|
||||
|
||||
self.initialize_common()
|
||||
self.setWindowTitle(_('Bulk convert ebooks to LRF'))
|
||||
|
||||
def accept(self):
|
||||
self.cmdline = self.cmdline = [unicode(i) for i in self.build_commandline()]
|
||||
self.cover_file = None
|
||||
QDialog.accept(self)
|
||||
|
@ -42,7 +42,7 @@ from libprs500.gui2.dialogs.metadata_single import MetadataSingleDialog
|
||||
from libprs500.gui2.dialogs.metadata_bulk import MetadataBulkDialog
|
||||
from libprs500.gui2.dialogs.jobs import JobsDialog
|
||||
from libprs500.gui2.dialogs.conversion_error import ConversionErrorDialog
|
||||
from libprs500.gui2.dialogs.lrf_single import LRFSingleDialog
|
||||
from libprs500.gui2.dialogs.lrf_single import LRFSingleDialog, LRFBulkDialog
|
||||
from libprs500.gui2.dialogs.config import ConfigDialog
|
||||
from libprs500.gui2.dialogs.search import SearchDialog
|
||||
from libprs500.gui2.dialogs.user_profiles import UserProfiles
|
||||
@ -52,6 +52,7 @@ from libprs500.library.database import DatabaseLocked
|
||||
from libprs500.ebooks.metadata.meta import set_metadata
|
||||
from libprs500.ebooks.metadata import MetaInformation
|
||||
from libprs500.ebooks import BOOK_EXTENSIONS
|
||||
from libprs500.ebooks.lrf import preferred_source_formats as LRF_PREFERRED_SOURCE_FORMATS
|
||||
|
||||
|
||||
|
||||
@ -586,9 +587,61 @@ class Main(MainWindow, Ui_MainWindow):
|
||||
############################################################################
|
||||
|
||||
############################### Convert ####################################
|
||||
|
||||
def convert_bulk(self, checked):
|
||||
d = error_dialog(self, _('Cannot convert'), _('Not yet implemented.'))
|
||||
rows = self.library_view.selectionModel().selectedRows()
|
||||
if not rows or len(rows) == 0:
|
||||
d = error_dialog(self, _('Cannot convert'), _('No books selected'))
|
||||
d.exec_()
|
||||
return
|
||||
d = LRFBulkDialog(self)
|
||||
d.exec_()
|
||||
if d.result() != QDialog.Accepted:
|
||||
return
|
||||
bad_rows = []
|
||||
|
||||
self.status_bar.showMessage('Starting Bulk conversion of %d books'%len(rows), 2000)
|
||||
|
||||
for i, row in enumerate([r.row() for r in rows]):
|
||||
cmdline = list(d.cmdline)
|
||||
data = None
|
||||
for fmt in LRF_PREFERRED_SOURCE_FORMATS:
|
||||
try:
|
||||
data = self.library_view.model().db.format(row, fmt.upper())
|
||||
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()
|
||||
cmdline.extend(['-o', of.name])
|
||||
cmdline.append(pt.name)
|
||||
id = self.job_manager.run_conversion_job(self.book_converted,
|
||||
'any2lrf', args=[cmdline],
|
||||
job_description='Convert book %d of %d'%(i, len(rows)))
|
||||
|
||||
|
||||
self.conversion_jobs[id] = (d.cover_file, pt, of, d.output_format,
|
||||
self.library_view.model().db.id(row))
|
||||
|
||||
|
||||
res = []
|
||||
for row in bad_rows:
|
||||
title = self.library_view.model().db.title(row)
|
||||
res.append('<li>%s</li>'%title)
|
||||
if res:
|
||||
msg = '<p>Could not convert %d of %d books, because no suitable source format was found.<ul>%s</ul>'%(len(res), len(rows), '\n'.join(res))
|
||||
warning_dialog(self, 'Could not convert some books', msg).exec_()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def set_conversion_defaults(self, checked):
|
||||
d = LRFSingleDialog(self, None, None)
|
||||
@ -600,13 +653,11 @@ class Main(MainWindow, Ui_MainWindow):
|
||||
d = error_dialog(self, _('Cannot convert'), _('No books selected'))
|
||||
d.exec_()
|
||||
|
||||
changed = False
|
||||
for row in [r.row() for r in rows]:
|
||||
d = LRFSingleDialog(self, self.library_view.model().db, row)
|
||||
if d.selected_format:
|
||||
d.exec_()
|
||||
if d.result() == QDialog.Accepted:
|
||||
changed = True
|
||||
cmdline = d.cmdline
|
||||
data = self.library_view.model().db.format(row, d.selected_format)
|
||||
pt = PersistentTemporaryFile('.'+d.selected_format.lower())
|
||||
@ -622,9 +673,7 @@ class Main(MainWindow, Ui_MainWindow):
|
||||
|
||||
|
||||
self.conversion_jobs[id] = (d.cover_file, pt, of, d.output_format, d.id)
|
||||
if changed:
|
||||
self.library_view.model().resort(reset=False)
|
||||
self.library_view.model().research()
|
||||
|
||||
|
||||
|
||||
def book_converted(self, id, description, result, exception, formatted_traceback, log):
|
||||
|
Loading…
x
Reference in New Issue
Block a user