diff --git a/src/calibre/customize/conversion.py b/src/calibre/customize/conversion.py index e98f34273f..72c067747d 100644 --- a/src/calibre/customize/conversion.py +++ b/src/calibre/customize/conversion.py @@ -112,6 +112,10 @@ class InputFormatPlugin(Plugin): #: convenience method, :meth:`get_image_collection`. is_image_collection = False + #: Number of CPU cores used by this plugin + #: A value of -1 means that it uses all available cores + core_usage = 1 + #: If set to True, the input plugin will perform special processing #: to make its output suitable for viewing for_viewer = False diff --git a/src/calibre/ebooks/comic/input.py b/src/calibre/ebooks/comic/input.py index bfc6ff30ca..443a302999 100755 --- a/src/calibre/ebooks/comic/input.py +++ b/src/calibre/ebooks/comic/input.py @@ -247,6 +247,7 @@ class ComicInput(InputFormatPlugin): description = 'Optimize comic files (.cbz, .cbr, .cbc) for viewing on portable devices' file_types = set(['cbz', 'cbr', 'cbc']) is_image_collection = True + core_usage = -1 options = set([ OptionRecommendation(name='colors', recommended_value=256, diff --git a/src/calibre/gui2/actions/convert.py b/src/calibre/gui2/actions/convert.py index 0641cc6a97..ef8a8688c5 100644 --- a/src/calibre/gui2/actions/convert.py +++ b/src/calibre/gui2/actions/convert.py @@ -14,6 +14,7 @@ from calibre.gui2 import error_dialog, Dispatcher from calibre.gui2.tools import convert_single_ebook, convert_bulk_ebook from calibre.utils.config import prefs from calibre.gui2.actions import InterfaceAction +from calibre.customize.ui import plugin_for_input_format class ConvertAction(InterfaceAction): @@ -115,9 +116,19 @@ class ConvertAction(InterfaceAction): def queue_convert_jobs(self, jobs, changed, bad, rows, previous, converted_func, extra_job_args=[]): for func, args, desc, fmt, id, temp_files in jobs: + input_file = args[0] + input_fmt = os.path.splitext(input_file)[1] + core_usage = 1 + if input_fmt: + input_fmt = input_fmt[1:] + plugin = plugin_for_input_format(input_fmt) + if plugin is not None: + core_usage = plugin.core_usage + if id not in bad: job = self.gui.job_manager.run_job(Dispatcher(converted_func), - func, args=args, description=desc) + func, args=args, description=desc, + core_usage=core_usage) args = [temp_files, fmt, id]+extra_job_args self.conversion_jobs[job] = tuple(args) diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index d512409d25..813a9bda45 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -198,8 +198,9 @@ class JobManager(QAbstractTableModel): return False def run_job(self, done, name, args=[], kwargs={}, - description=''): + description='', core_usage=1): job = ParallelJob(name, description, done, args=args, kwargs=kwargs) + job.core_usage = core_usage self.add_job(job) self.server.add_job(job) return job diff --git a/src/calibre/utils/ipc/job.py b/src/calibre/utils/ipc/job.py index a6c39ffc6b..91db333791 100644 --- a/src/calibre/utils/ipc/job.py +++ b/src/calibre/utils/ipc/job.py @@ -42,6 +42,7 @@ class BaseJob(object): self._message = None self._status_text = _('Waiting...') self._done_called = False + self.core_usage = 1 def update(self, consume_notifications=True): if self.duration is not None: