diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index a0e8fafd0f..d8e158f842 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -537,3 +537,10 @@ many_libraries = 10 # highlight with this tweak. Set it to 'transparent' to disable highlighting. highlight_virtual_library = 'yellow' +#: Choose available output formats for conversion +# Restrict the list of available output formats in the conversion dialogs. +# For example, if you only want to convert to EPUB and AZW3, change this to +# restrict_output_formats = ['EPUB', 'AZW3']. The default value of None causes +# all available output formats to be present. +restrict_output_formats = None + diff --git a/src/calibre/gui2/convert/bulk.py b/src/calibre/gui2/convert/bulk.py index b1c3de122b..91efc73ca9 100644 --- a/src/calibre/gui2/convert/bulk.py +++ b/src/calibre/gui2/convert/bulk.py @@ -9,8 +9,7 @@ import shutil from PyQt4.Qt import QString, SIGNAL from calibre.gui2.convert.single import (Config, sort_formats_by_preference, - GroupModel, gprefs) -from calibre.customize.ui import available_output_formats + GroupModel, gprefs, get_output_formats) from calibre.gui2 import ResizableDialog from calibre.gui2.convert.look_and_feel import LookAndFeelWidget from calibre.gui2.convert.heuristics import HeuristicsWidget @@ -43,7 +42,6 @@ class BulkConfig(Config): 'values saved in a previous conversion (if they exist) instead ' 'of using the defaults specified in the Preferences')) - self.connect(self.output_formats, SIGNAL('currentIndexChanged(QString)'), self.setup_pipeline) self.connect(self.groups, SIGNAL('activated(QModelIndex)'), @@ -96,7 +94,8 @@ class BulkConfig(Config): while True: c = self.stack.currentWidget() - if not c: break + if not c: + break self.stack.removeWidget(c) widgets = [lf, hw, ps, sd, toc, sr] @@ -118,17 +117,14 @@ class BulkConfig(Config): except: pass - def setup_output_formats(self, db, preferred_output_format): if preferred_output_format: preferred_output_format = preferred_output_format.lower() - output_formats = sorted(available_output_formats(), - key=lambda x:{'EPUB':'!A', 'MOBI':'!B'}.get(x.upper(), x)) - output_formats.remove('oeb') + output_formats = get_output_formats(preferred_output_format) preferred_output_format = preferred_output_format if \ preferred_output_format and preferred_output_format \ in output_formats else sort_formats_by_preference(output_formats, - prefs['output_format'])[0] + [prefs['output_format']])[0] self.output_formats.addItems(list(map(QString, [x.upper() for x in output_formats]))) self.output_formats.setCurrentIndex(output_formats.index(preferred_output_format)) @@ -149,3 +145,4 @@ class BulkConfig(Config): bytearray(self.saveGeometry()) return ResizableDialog.done(self, r) + diff --git a/src/calibre/gui2/convert/single.py b/src/calibre/gui2/convert/single.py index 1a915288a8..e8342610dd 100644 --- a/src/calibre/gui2/convert/single.py +++ b/src/calibre/gui2/convert/single.py @@ -29,7 +29,7 @@ from calibre.ebooks.conversion.plumber import (Plumber, from calibre.ebooks.conversion.config import delete_specifics from calibre.customize.ui import available_output_formats from calibre.customize.conversion import OptionRecommendation -from calibre.utils.config import prefs +from calibre.utils.config import prefs, tweaks from calibre.utils.logging import Log class NoSupportedInputFormats(Exception): @@ -48,6 +48,20 @@ def sort_formats_by_preference(formats, prefs): return len(prefs) return sorted(formats, key=key) +def get_output_formats(preferred_output_format): + all_formats = {x.upper() for x in available_output_formats()} + all_formats.discard('OEB') + pfo = preferred_output_format.upper() if preferred_output_format else '' + restrict = tweaks['restrict_output_formats'] + if restrict: + fmts = [x.upper() for x in restrict] + if pfo and pfo not in fmts and pfo in all_formats: + fmts.append(pfo) + else: + fmts = list(sorted(all_formats, + key=lambda x:{'EPUB':'!A', 'MOBI':'!B'}.get(x.upper(), x))) + return fmts + class GroupModel(QAbstractListModel): def __init__(self, widgets): @@ -239,15 +253,13 @@ class Config(ResizableDialog, Ui_Dialog): preferred_output_format): if preferred_output_format: preferred_output_format = preferred_output_format.lower() - output_formats = sorted(available_output_formats(), - key=lambda x:{'EPUB':'!A', 'MOBI':'!B'}.get(x.upper(), x)) - output_formats.remove('oeb') + output_formats = get_output_formats(preferred_output_format) input_format, input_formats = get_input_format_for_book(db, book_id, preferred_input_format) preferred_output_format = preferred_output_format if \ preferred_output_format in output_formats else \ sort_formats_by_preference(output_formats, - prefs['output_format'])[0] + [prefs['output_format']])[0] self.input_formats.addItems(list(map(QString, [x.upper() for x in input_formats]))) self.output_formats.addItems(list(map(QString, [x.upper() for x in