def convert_single_ebook( parent, db, book_ids, auto_conversion=False, # {{{ out_format=None, show_no_format_warning=True): changed = False jobs = [] bad = [] total = len(book_ids) if total == 0: return None, None, None for i, book_id in enumerate(book_ids): temp_files = [] try: d = SingleConfig(parent, db, book_id, None, out_format) if auto_conversion: d.accept() result = QDialog.Accepted else: result = d.exec_() if result == QDialog.Accepted: # if not convert_existing(parent, db, [book_id], d.output_format): # continue mi = db.get_metadata(book_id, True) in_file = PersistentTemporaryFile('.' + d.input_format) with in_file: input_fmt = db.original_fmt(book_id, d.input_format).lower() same_fmt = input_fmt == d.output_format.lower() db.copy_format_to(book_id, input_fmt, in_file, index_is_id=True) out_file = PersistentTemporaryFile('.' + d.output_format) out_file.write(d.output_format) out_file.close() temp_files = [in_file] try: dtitle = unicode(mi.title) except: dtitle = repr(mi.title) desc = _('Convert book %(num)d of %(total)d (%(title)s)') % \ {'num':i + 1, 'total':total, 'title':dtitle} recs = cPickle.loads(d.recommendations) if d.opf_file is not None: recs.append(('read_metadata_from_opf', d.opf_file.name, OptionRecommendation.HIGH)) temp_files.append(d.opf_file) if d.cover_file is not None: recs.append(('cover', d.cover_file.name, OptionRecommendation.HIGH)) temp_files.append(d.cover_file) args = [in_file.name, out_file.name, recs] temp_files.append(out_file) func = 'gui_convert_override' parts = [] if not auto_conversion and d.manually_fine_tune_toc: parts.append('manually_fine_tune_toc') if same_fmt: parts.append('same_fmt') if parts: func += ':%s' % (';'.join(parts)) jobs.append((func, args, desc, d.output_format.upper(), book_id, temp_files)) changed = True d.break_cycles() except NoSupportedInputFormats as nsif: bad.append((book_id, nsif.available_formats)) if bad and show_no_format_warning: if len(bad) == 1 and not bad[0][1]: title = db.title(bad[0][0], True) warning_dialog( parent, _('Could not convert'), '<p>' + _('Could not convert <b>%s</b> as it has no e-book files. If you ' 'think it should have files, but calibre is not finding ' 'them, that is most likely because you moved the book\'s ' 'files around outside of calibre. You will need to find those files ' 'and re-add them to calibre.') % title, show=True) else: res = [] for id, available_formats in bad: title = db.title(id, True) if available_formats: msg = _('No supported formats (Available formats: %s)') % ( ', '.join(available_formats)) else: msg = _('This book has no actual e-book files') res.append('%s - %s' % (title, msg)) msg = '%s' % '\n'.join(res) warning_dialog( parent, _('Could not convert some books'), ngettext( 'Could not convert the book because no supported source format was found', 'Could not convert {num} of {tot} books, because no supported source formats were found.', len(res)).format(num=len(res), tot=total), msg).exec_() return jobs, changed, bad
def convert_single_ebook( parent, db, book_ids, auto_conversion=False, # {{{ out_format=None, show_no_format_warning=True): changed = False jobs = [] bad = [] total = len(book_ids) if total == 0: return None, None, None for i, book_id in enumerate(book_ids): temp_files = [] try: d = SingleConfig(parent, db, book_id, None, out_format) if auto_conversion: d.accept() result = QDialog.Accepted else: result = d.exec_() if result == QDialog.Accepted: #if not convert_existing(parent, db, [book_id], d.output_format): # continue mi = db.get_metadata(book_id, True) in_file = PersistentTemporaryFile('.' + d.input_format) with in_file: input_fmt = db.original_fmt(book_id, d.input_format).lower() same_fmt = input_fmt == d.output_format.lower() db.copy_format_to(book_id, input_fmt, in_file, index_is_id=True) out_file = PersistentTemporaryFile('.' + d.output_format) out_file.write(d.output_format) out_file.close() temp_files = [in_file] try: dtitle = unicode(mi.title) except: dtitle = repr(mi.title) desc = _('Convert book %(num)d of %(total)d (%(title)s)') % \ {'num':i + 1, 'total':total, 'title':dtitle} recs = cPickle.loads(d.recommendations) if d.opf_file is not None: recs.append(('read_metadata_from_opf', d.opf_file.name, OptionRecommendation.HIGH)) temp_files.append(d.opf_file) if d.cover_file is not None: recs.append(('cover', d.cover_file.name, OptionRecommendation.HIGH)) temp_files.append(d.cover_file) args = [in_file.name, out_file.name, recs] temp_files.append(out_file) func = 'gui_convert_override' if same_fmt: func += ':same_fmt' jobs.append((func, args, desc, d.output_format.upper(), book_id, temp_files)) changed = True d.break_cycles() except NoSupportedInputFormats: bad.append(book_id) if bad and show_no_format_warning: res = [] for id in bad: title = db.title(id, True) res.append('%s' % title) msg = '%s' % '\n'.join(res) warning_dialog( parent, _('Could not convert some books'), _('Could not convert %(num)d of %(tot)d books, because no suitable source' ' format was found.') % dict(num=len(res), tot=total), msg).exec_() return jobs, changed, bad