def initialize_options(self, get_option, get_help, db=None, book_id=None): ''' :param get_option: A callable that takes one argument: the option name and returns the corresponding OptionRecommendation. :param get_help: A callable that takes the option name and return a help string. ''' defaults = load_defaults(self._name) defaults.merge_recommendations(get_option, OptionRecommendation.LOW, self._options) if db is not None: specifics = load_specifics(db, book_id) specifics.merge_recommendations(get_option, OptionRecommendation.HIGH, self._options, only_existing=True) defaults.update(specifics) self.apply_recommendations(defaults) self.setup_help(get_help) def process_child(child): for g in child.children(): if isinstance(g, QLabel): buddy = g.buddy() if buddy is not None and hasattr(buddy, '_help'): g._help = buddy._help htext = unicode(buddy.toolTip()).strip() g.setToolTip(htext) g.setWhatsThis(htext) g.__class__.enterEvent = lambda obj, event: self.set_help(getattr(obj, '_help', obj.toolTip())) else: process_child(g) process_child(self)
def initialize_options(self, get_option, get_help, db=None, book_id=None): ''' :param get_option: A callable that takes one argument: the option name and returns the corresponding OptionRecommendation. :param get_help: A callable that takes the option name and return a help string. ''' defaults = load_defaults(self._name) defaults.merge_recommendations(get_option, OptionRecommendation.LOW, self._options) if db is not None: specifics = load_specifics(db, book_id) specifics.merge_recommendations(get_option, OptionRecommendation.HIGH, self._options, only_existing=True) defaults.update(specifics) self.apply_recommendations(defaults) self.setup_help(get_help) def process_child(child): for g in child.children(): if isinstance(g, QLabel): buddy = g.buddy() if buddy is not None and hasattr(buddy, '_help'): g._help = buddy._help htext = unicode(buddy.toolTip()).strip() g.setToolTip(htext) g.setWhatsThis(htext) g.__class__.enterEvent = lambda obj, event: self.set_help(getattr(obj, '_help', obj.toolTip())) else: process_child(g) process_child(self)
def conversion_data(ctx, rd, book_id): from calibre.ebooks.conversion.config import (NoSupportedInputFormats, get_input_format_for_book, get_sorted_output_formats, load_specifics) db = get_library_data(ctx, rd)[0] if not ctx.has_id(rd, db, book_id): raise BookNotFound(book_id, db) try: input_format, input_formats = get_input_format_for_book(db, book_id) except NoSupportedInputFormats: input_formats = [] else: if input_format in input_formats: input_formats.remove(input_format) input_formats.insert(0, input_format) ans = { 'input_formats': [x.upper() for x in input_formats], 'output_formats': get_sorted_output_formats(), 'conversion_defaults': conversion_defaults(), 'conversion_specifics': load_specifics(db, book_id), 'title': db.field_for('title', book_id), 'authors': db.field_for('authors', book_id), } return ans
def get_conversion_options(input_fmt, output_fmt, book_id, db): from calibre.ebooks.conversion.plumber import create_dummy_plumber from calibre.ebooks.conversion.config import (load_specifics, load_defaults, OPTIONS, options_for_input_fmt, options_for_output_fmt) from calibre.customize.conversion import OptionRecommendation plumber = create_dummy_plumber(input_fmt, output_fmt) specifics = load_specifics(db, book_id) ans = {'options': {}, 'disabled': set(), 'defaults': {}, 'help': {}} ans['input_plugin_name'] = plumber.input_plugin.commit_name ans['output_plugin_name'] = plumber.output_plugin.commit_name ans['input_ui_data'] = plumber.input_plugin.ui_data ans['output_ui_data'] = plumber.output_plugin.ui_data def merge_group(group_name, option_names): if not group_name or group_name in ('debug', 'metadata'): return defs = load_defaults(group_name) defs.merge_recommendations(plumber.get_option_by_name, OptionRecommendation.LOW, option_names) specifics.merge_recommendations(plumber.get_option_by_name, OptionRecommendation.HIGH, option_names, only_existing=True) defaults = defs.as_dict()['options'] for k in defs: if k in specifics: defs[k] = specifics[k] defs = defs.as_dict() ans['options'].update(defs['options']) ans['disabled'] |= set(defs['disabled']) ans['defaults'].update(defaults) ans['help'] = plumber.get_all_help() for group_name, option_names in iteritems(OPTIONS['pipe']): merge_group(group_name, option_names) group_name, option_names = options_for_input_fmt(input_fmt) merge_group(group_name, option_names) group_name, option_names = options_for_output_fmt(output_fmt) merge_group(group_name, option_names) ans['disabled'] = tuple(ans['disabled']) return ans
def get_conversion_options(input_fmt, output_fmt, book_id, db): from calibre.ebooks.conversion.plumber import create_dummy_plumber from calibre.ebooks.conversion.config import ( load_specifics, load_defaults, OPTIONS, options_for_input_fmt, options_for_output_fmt) from calibre.customize.conversion import OptionRecommendation plumber = create_dummy_plumber(input_fmt, output_fmt) specifics = load_specifics(db, book_id) ans = {'options': {}, 'disabled': set(), 'defaults': {}, 'help': {}} ans['input_plugin_name'] = plumber.input_plugin.commit_name ans['output_plugin_name'] = plumber.output_plugin.commit_name ans['input_ui_data'] = plumber.input_plugin.ui_data ans['output_ui_data'] = plumber.output_plugin.ui_data def merge_group(group_name, option_names): if not group_name or group_name in ('debug', 'metadata'): return defs = load_defaults(group_name) defs.merge_recommendations( plumber.get_option_by_name, OptionRecommendation.LOW, option_names) specifics.merge_recommendations( plumber.get_option_by_name, OptionRecommendation.HIGH, option_names, only_existing=True) defaults = defs.as_dict()['options'] for k in defs: if k in specifics: defs[k] = specifics[k] defs = defs.as_dict() ans['options'].update(defs['options']) ans['disabled'] |= set(defs['disabled']) ans['defaults'].update(defaults) ans['help'] = plumber.get_all_help() for group_name, option_names in OPTIONS['pipe'].iteritems(): merge_group(group_name, option_names) group_name, option_names = options_for_input_fmt(input_fmt) merge_group(group_name, option_names) group_name, option_names = options_for_output_fmt(output_fmt) merge_group(group_name, option_names) ans['disabled'] = tuple(ans['disabled']) return ans
def do_book(self): if self.i >= len(self.book_ids): return self.do_queue() book_id = self.book_ids[self.i] self.i += 1 temp_files = [] try: input_format = get_input_format_for_book(self.db, book_id, None)[0] input_fmt = self.db.original_fmt(book_id, input_format).lower() same_fmt = input_fmt == self.output_format.lower() mi, opf_file = create_opf_file(self.db, book_id) in_file = PersistentTemporaryFile('.' + input_format) with in_file: self.db.copy_format_to(book_id, input_fmt, in_file, index_is_id=True) out_file = PersistentTemporaryFile('.' + self.output_format) out_file.write(self.output_format) out_file.close() temp_files = [in_file] combined_recs = GuiRecommendations() default_recs = bulk_defaults_for_input_format(input_format) for key in default_recs: combined_recs[key] = default_recs[key] if self.use_saved_single_settings: specific_recs = load_specifics(self.db, book_id) for key in specific_recs: combined_recs[key] = specific_recs[key] for item in self.user_recs: combined_recs[item[0]] = item[1] save_specifics(self.db, book_id, combined_recs) lrecs = list(combined_recs.to_recommendations()) from calibre.customize.ui import plugin_for_output_format op = plugin_for_output_format(self.output_format) if op and op.recommendations: prec = {x[0] for x in op.recommendations} for i, r in enumerate(list(lrecs)): if r[0] in prec: lrecs[i] = (r[0], r[1], OptionRecommendation.HIGH) cover_file = create_cover_file(self.db, book_id) if opf_file is not None: lrecs.append(('read_metadata_from_opf', opf_file.name, OptionRecommendation.HIGH)) temp_files.append(opf_file) if cover_file is not None: lrecs.append( ('cover', cover_file.name, OptionRecommendation.HIGH)) temp_files.append(cover_file) for x in list(lrecs): if x[0] == 'debug_pipeline': lrecs.remove(x) try: dtitle = unicode(mi.title) except: dtitle = repr(mi.title) if len(dtitle) > 50: dtitle = dtitle[:50].rpartition(' ')[0] + '...' self.setLabelText(_('Queueing ') + dtitle) desc = _('Convert book %(num)d of %(tot)d (%(title)s)') % dict( num=self.i, tot=len(self.book_ids), title=dtitle) args = [in_file.name, out_file.name, lrecs] temp_files.append(out_file) func = 'gui_convert_override' if same_fmt: func += ':same_fmt' self.jobs.append((func, args, desc, self.output_format.upper(), book_id, temp_files)) self.changed = True self.setValue(self.i) except NoSupportedInputFormats: self.bad.append(book_id) QTimer.singleShot(0, self.do_book)
def get_preferred_input_format_for_book(db, book_id): recs = load_specifics(db, book_id) if recs: return recs.get('gui_preferred_input_format', None)
def do_book(self): if self.i >= len(self.book_ids): return self.do_queue() book_id = self.book_ids[self.i] self.i += 1 temp_files = [] try: input_format = get_input_format_for_book(self.db, book_id, None)[0] input_fmt = self.db.original_fmt(book_id, input_format).lower() same_fmt = input_fmt == self.output_format.lower() mi, opf_file = create_opf_file(self.db, book_id) in_file = PersistentTemporaryFile('.'+input_format) with in_file: self.db.copy_format_to(book_id, input_fmt, in_file, index_is_id=True) out_file = PersistentTemporaryFile('.' + self.output_format) out_file.write(self.output_format) out_file.close() temp_files = [in_file] combined_recs = GuiRecommendations() default_recs = bulk_defaults_for_input_format(input_format) for key in default_recs: combined_recs[key] = default_recs[key] if self.use_saved_single_settings: specific_recs = load_specifics(self.db, book_id) for key in specific_recs: combined_recs[key] = specific_recs[key] for item in self.user_recs: combined_recs[item[0]] = item[1] save_specifics(self.db, book_id, combined_recs) lrecs = list(combined_recs.to_recommendations()) cover_file = create_cover_file(self.db, book_id) if opf_file is not None: lrecs.append(('read_metadata_from_opf', opf_file.name, OptionRecommendation.HIGH)) temp_files.append(opf_file) if cover_file is not None: lrecs.append(('cover', cover_file.name, OptionRecommendation.HIGH)) temp_files.append(cover_file) for x in list(lrecs): if x[0] == 'debug_pipeline': lrecs.remove(x) try: dtitle = unicode(mi.title) except: dtitle = repr(mi.title) if len(dtitle) > 50: dtitle = dtitle[:50].rpartition(' ')[0]+'...' self.setLabelText(_('Queueing ')+dtitle) desc = _('Convert book %(num)d of %(tot)d (%(title)s)') % dict( num=self.i, tot=len(self.book_ids), title=dtitle) args = [in_file.name, out_file.name, lrecs] temp_files.append(out_file) func = 'gui_convert_override' if same_fmt: func += ':same_fmt' self.jobs.append((func, args, desc, self.output_format.upper(), book_id, temp_files)) self.changed = True self.setValue(self.i) except NoSupportedInputFormats: self.bad.append(book_id) QTimer.singleShot(0, self.do_book)
def get_preferred_input_format_for_book(db, book_id): recs = load_specifics(db, book_id) if recs: return recs.get('gui_preferred_input_format', None)