mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Pull from driver-dev
This commit is contained in:
commit
654462faba
@ -89,7 +89,7 @@ class Config(ResizableDialog, Ui_Dialog):
|
|||||||
None)
|
None)
|
||||||
|
|
||||||
self.setup_input_output_formats(db, book_id, preferred_input_format,
|
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.db, self.book_id = db, book_id
|
||||||
self.setup_pipeline()
|
self.setup_pipeline()
|
||||||
|
|
||||||
|
@ -612,23 +612,23 @@ class DeviceGUI(object):
|
|||||||
|
|
||||||
|
|
||||||
def sync_to_device(self, on_card, delete_from_library,
|
def sync_to_device(self, on_card, delete_from_library,
|
||||||
specific_format=None, send_rows=None, do_auto_convert=True):
|
specific_format=None, send_ids=None, do_auto_convert=True):
|
||||||
rows = self.library_view.selectionModel().selectedRows() if send_rows is None else send_rows
|
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 rows or len(rows) == 0:
|
if not self.device_manager or not ids or len(ids) == 0:
|
||||||
return
|
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,
|
self.device_manager.device_class.settings().format_map,
|
||||||
paths=True, set_metadata=True,
|
paths=True, set_metadata=True,
|
||||||
specific_format=specific_format,
|
specific_format=specific_format,
|
||||||
exclude_auto=do_auto_convert)
|
exclude_auto=do_auto_convert)
|
||||||
if do_auto_convert:
|
if do_auto_convert:
|
||||||
rows = list(set(rows).difference(_auto_rows))
|
ids = list(set(ids).difference(_auto_ids))
|
||||||
else:
|
else:
|
||||||
_auto_rows = []
|
_auto_ids = []
|
||||||
|
|
||||||
ids = iter(self.library_view.model().id(r) for r in rows)
|
ids = iter(ids)
|
||||||
metadata = self.library_view.model().get_metadata(rows)
|
metadata = self.library_view.model().get_metadata(ids, True)
|
||||||
for mi in metadata:
|
for mi in metadata:
|
||||||
cdata = mi['cover']
|
cdata = mi['cover']
|
||||||
if cdata:
|
if cdata:
|
||||||
@ -662,8 +662,8 @@ class DeviceGUI(object):
|
|||||||
self.status_bar.showMessage(_('Sending books to device.'), 5000)
|
self.status_bar.showMessage(_('Sending books to device.'), 5000)
|
||||||
|
|
||||||
auto = []
|
auto = []
|
||||||
if _auto_rows != []:
|
if _auto_ids != []:
|
||||||
for row in _auto_rows:
|
for row in _auto_ids:
|
||||||
if specific_format == None:
|
if specific_format == None:
|
||||||
formats = [f.lower() for f in self.library_view.model().db.formats(row).split(',')]
|
formats = [f.lower() for f in self.library_view.model().db.formats(row).split(',')]
|
||||||
formats = formats if formats != None else []
|
formats = formats if formats != None else []
|
||||||
@ -687,7 +687,7 @@ class DeviceGUI(object):
|
|||||||
format = fmt
|
format = fmt
|
||||||
break
|
break
|
||||||
d.exec_()
|
d.exec_()
|
||||||
self.auto_convert(_auto_rows, on_card, format)
|
self.auto_convert(_auto_ids, on_card, format)
|
||||||
|
|
||||||
if bad:
|
if bad:
|
||||||
bad = '\n'.join('<li>%s</li>'%(i,) for i in bad)
|
bad = '\n'.join('<li>%s</li>'%(i,) for i in bad)
|
||||||
|
@ -36,9 +36,7 @@ from calibre.gui2.dialogs.metadata_single import MetadataSingleDialog
|
|||||||
from calibre.gui2.dialogs.metadata_bulk import MetadataBulkDialog
|
from calibre.gui2.dialogs.metadata_bulk import MetadataBulkDialog
|
||||||
from calibre.gui2.dialogs.jobs import JobsDialog
|
from calibre.gui2.dialogs.jobs import JobsDialog
|
||||||
from calibre.gui2.dialogs.conversion_error import ConversionErrorDialog
|
from calibre.gui2.dialogs.conversion_error import ConversionErrorDialog
|
||||||
from calibre.gui2.tools import convert_single_ebook, convert_bulk_ebooks, \
|
from calibre.gui2.tools import convert_single_ebook, fetch_scheduled_recipe
|
||||||
set_conversion_defaults, fetch_scheduled_recipe, \
|
|
||||||
auto_convert_ebook
|
|
||||||
from calibre.gui2.dialogs.config import ConfigDialog
|
from calibre.gui2.dialogs.config import ConfigDialog
|
||||||
from calibre.gui2.dialogs.search import SearchDialog
|
from calibre.gui2.dialogs.search import SearchDialog
|
||||||
from calibre.gui2.dialogs.choose_format import ChooseFormatDialog
|
from calibre.gui2.dialogs.choose_format import ChooseFormatDialog
|
||||||
@ -233,18 +231,11 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
|
|||||||
cm = QMenu()
|
cm = QMenu()
|
||||||
cm.addAction(_('Convert individually'))
|
cm.addAction(_('Convert individually'))
|
||||||
cm.addAction(_('Bulk convert'))
|
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)
|
self.action_convert.setMenu(cm)
|
||||||
QObject.connect(cm.actions()[0],
|
QObject.connect(cm.actions()[0],
|
||||||
SIGNAL('triggered(bool)'), self.convert_single)
|
SIGNAL('triggered(bool)'), self.convert_single)
|
||||||
QObject.connect(cm.actions()[1],
|
QObject.connect(cm.actions()[1],
|
||||||
SIGNAL('triggered(bool)'), self.convert_bulk)
|
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,
|
QObject.connect(self.action_convert,
|
||||||
SIGNAL('triggered(bool)'), self.convert_single)
|
SIGNAL('triggered(bool)'), self.convert_single)
|
||||||
self.convert_menu = cm
|
self.convert_menu = cm
|
||||||
@ -979,14 +970,12 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
|
|||||||
|
|
||||||
############################### Convert ####################################
|
############################### Convert ####################################
|
||||||
|
|
||||||
def auto_convert(self, rows, on_card, format):
|
def auto_convert(self, row_ids, on_card, format):
|
||||||
previous = self.library_view.currentIndex()
|
previous = self.library_view.currentIndex()
|
||||||
|
|
||||||
jobs, changed, bad_rows = auto_convert_ebook(format, self, self.library_view.model().db, rows)
|
jobs, changed = convert_single_ebook(self, self.library_view.model().db, row_ids, True)
|
||||||
if jobs is None:
|
if jobs == []: return
|
||||||
return
|
|
||||||
for func, args, desc, fmt, id, temp_files in jobs:
|
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),
|
job = self.job_manager.run_job(Dispatcher(self.book_auto_converted),
|
||||||
func, args=args, description=desc)
|
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)
|
||||||
@ -1004,18 +993,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()
|
||||||
@ -1037,21 +1015,14 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
|
|||||||
self.library_view.model().resort(reset=False)
|
self.library_view.model().resort(reset=False)
|
||||||
self.library_view.model().research()
|
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):
|
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)
|
||||||
@ -1084,8 +1055,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
|
|||||||
current = self.library_view.currentIndex()
|
current = self.library_view.currentIndex()
|
||||||
self.library_view.model().current_changed(current, QModelIndex())
|
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_ids=[book_id], do_auto_convert=False)
|
||||||
self.sync_to_device(on_card, False, specific_format=fmt, send_rows=[r], do_auto_convert=False)
|
|
||||||
|
|
||||||
def book_converted(self, job):
|
def book_converted(self, job):
|
||||||
temp_files, fmt, book_id = self.conversion_jobs.pop(job)
|
temp_files, fmt, book_id = self.conversion_jobs.pop(job)
|
||||||
|
@ -9,210 +9,70 @@ Logic for setting up conversion jobs
|
|||||||
import os
|
import os
|
||||||
from PyQt4.Qt import QDialog
|
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.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
|
def convert_single_ebook(parent, db, row_ids, auto_conversion=False):
|
||||||
# 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
|
changed = False
|
||||||
jobs = []
|
jobs = []
|
||||||
|
bad = []
|
||||||
|
|
||||||
total = len(rows)
|
total = len(row_ids)
|
||||||
if total == 0:
|
if total == 0:
|
||||||
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 conversion of %d books') % total, 2000)
|
||||||
|
|
||||||
i = 0
|
|
||||||
bad_rows = []
|
|
||||||
|
|
||||||
for i, row in enumerate(rows):
|
|
||||||
row_id = db.id(row)
|
|
||||||
|
|
||||||
|
for i, row_id in enumerate(row_ids):
|
||||||
temp_files = []
|
temp_files = []
|
||||||
|
|
||||||
data = None
|
try:
|
||||||
in_formats = [f.lower() for f in db.formats(row).split(',')]
|
d = SingleConfig(parent, db, row_id)
|
||||||
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)
|
if auto_conversion:
|
||||||
in_file = db.format_abspath(row, data)
|
result = QDialog.Accepted
|
||||||
out_file = PersistentTemporaryFile('.'+fmt.lower())
|
else:
|
||||||
out_file.write(data)
|
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()
|
out_file.close()
|
||||||
desc = _('Auto convert book %d of %d (%s)')%(i+1, total, repr(mi.title))
|
|
||||||
args = [['', in_file, out_file.name]]
|
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]
|
temp_files = [out_file]
|
||||||
jobs.append(('ebook-convert', args, desc, fmt.upper(), row_id, temp_files))
|
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_rows:
|
if bad != []:
|
||||||
res = []
|
res = []
|
||||||
for row in bad_rows:
|
for id in bad:
|
||||||
title = db.title(row)
|
title = db.title(id, True)
|
||||||
res.append('<li>%s</li>'%title)
|
res.append('<li>%s</li>'%title)
|
||||||
|
|
||||||
msg = _('<p>Could not convert %d of %d books, because no suitable source format was found.<ul>%s</ul>')%(len(res), total, '\n'.join(res))
|
msg = _('<p>Could not convert %d of %d books, because no suitable source format was found.<ul>%s</ul>')%(len(res), total, '\n'.join(res))
|
||||||
warning_dialog(parent, _('Could not convert some books'), msg).exec_()
|
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
|
return jobs, changed
|
||||||
|
|
||||||
|
|
||||||
|
def convert_bulk_ebooks(*args):
|
||||||
def convert_single_lrf(parent, db, comics, others):
|
pass
|
||||||
changed = False
|
#(fmt, parent, db, comics, others):
|
||||||
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:
|
if others:
|
||||||
d = get_dialog(fmt)(parent, db)
|
d = get_dialog(fmt)(parent, db)
|
||||||
if d.exec_() != QDialog.Accepted:
|
if d.exec_() != QDialog.Accepted:
|
||||||
@ -314,117 +174,6 @@ def convert_bulk(fmt, parent, db, comics, others):
|
|||||||
|
|
||||||
return jobs, False
|
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('<li>%s</li>'%title)
|
|
||||||
|
|
||||||
msg = _('<p>Could not convert %d of %d books, because no suitable source format was found.<ul>%s</ul>')%(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):
|
def _fetch_news(data, fmt):
|
||||||
pt = PersistentTemporaryFile(suffix='_feeds2%s.%s'%(fmt.lower(), fmt.lower()))
|
pt = PersistentTemporaryFile(suffix='_feeds2%s.%s'%(fmt.lower(), fmt.lower()))
|
||||||
pt.close()
|
pt.close()
|
||||||
@ -434,7 +183,7 @@ def _fetch_news(data, fmt):
|
|||||||
if data['password']:
|
if data['password']:
|
||||||
args.extend(['--password', data['password']])
|
args.extend(['--password', data['password']])
|
||||||
args.append(data['script'] if data['script'] else data['title'])
|
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):
|
def fetch_scheduled_recipe(recipe, script):
|
||||||
@ -451,30 +200,6 @@ def fetch_scheduled_recipe(recipe, script):
|
|||||||
args.append(script)
|
args.append(script)
|
||||||
return 'feeds2'+fmt, [args], _('Fetch news from ')+recipe.title, fmt.upper(), [pt]
|
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):
|
def fetch_news(data):
|
||||||
fmt = prefs['output_format'].lower()
|
fmt = prefs['output_format'].lower()
|
||||||
return _fetch_news(data, fmt)
|
return _fetch_news(data, fmt)
|
||||||
|
@ -286,7 +286,7 @@ class gui(OptionlessCommand):
|
|||||||
with open('images.qrc', 'wb') as f:
|
with open('images.qrc', 'wb') as f:
|
||||||
f.write(manifest)
|
f.write(manifest)
|
||||||
try:
|
try:
|
||||||
check_call(['pyrcc4', '-py2', '-o', images, 'images.qrc'])
|
check_call(['pyrcc4', '-o', images, 'images.qrc'])
|
||||||
except:
|
except:
|
||||||
import traceback
|
import traceback
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user