Dont use a worker process when generating thumbnails, for better performance

This commit is contained in:
Kovid Goyal 2016-02-21 11:52:58 +05:30
parent 830b826c58
commit b027fa50e5
4 changed files with 15 additions and 32 deletions

View File

@ -16,6 +16,7 @@ from functools import partial
from calibre import fit_image from calibre import fit_image
from calibre.constants import config_dir, iswindows from calibre.constants import config_dir, iswindows
from calibre.db.errors import NoSuchFormat from calibre.db.errors import NoSuchFormat
from calibre.ebooks.covers import cprefs, override_prefs, scale_cover, generate_cover, set_use_roman
from calibre.ebooks.metadata import authors_to_string from calibre.ebooks.metadata import authors_to_string
from calibre.ebooks.metadata.meta import set_metadata from calibre.ebooks.metadata.meta import set_metadata
from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.ebooks.metadata.opf2 import metadata_to_opf
@ -28,7 +29,6 @@ from calibre.utils.date import timestampfromdt
from calibre.utils.img import scale_image, image_from_data from calibre.utils.img import scale_image, image_from_data
from calibre.utils.filenames import ascii_filename, atomic_rename from calibre.utils.filenames import ascii_filename, atomic_rename
from calibre.utils.shared_file import share_open from calibre.utils.shared_file import share_open
from calibre.utils.ipc.simple_worker import fork_job, WorkerError
plugboard_content_server_value = 'content_server' plugboard_content_server_value = 'content_server'
plugboard_content_server_formats = ['epub', 'mobi', 'azw3'] plugboard_content_server_formats = ['epub', 'mobi', 'azw3']
@ -96,14 +96,9 @@ def create_file_copy(ctx, rd, prefix, library_id, book_id, ext, mtime, copy_func
rd.outheaders['Tempfile'] = hexlify(fname.encode('utf-8')) rd.outheaders['Tempfile'] = hexlify(fname.encode('utf-8'))
return rd.filesystem_file_with_custom_etag(ans, prefix, library_id, book_id, mtime, extra_etag_data) return rd.filesystem_file_with_custom_etag(ans, prefix, library_id, book_id, mtime, extra_etag_data)
def write_generated_cover(db, book_id, width, height, destf):
def generate_cover_worker(width, height, opf, file_name, use_roman): mi = db.get_metadata(book_id)
# We have to generate the cover in a worker as it depends on Qt and needs set_use_roman(get_use_roman())
# QApplication
from calibre.ebooks.covers import cprefs, override_prefs, scale_cover, generate_cover, set_use_roman
from calibre.ebooks.metadata.opf2 import OPF
set_use_roman(use_roman)
mi = OPF(BytesIO(opf), try_to_guess_cover=False, populate_spine=False).to_book_metadata()
if height is None: if height is None:
prefs = cprefs prefs = cprefs
else: else:
@ -111,17 +106,7 @@ def generate_cover_worker(width, height, opf, file_name, use_roman):
prefs = override_prefs(cprefs) prefs = override_prefs(cprefs)
scale_cover(prefs, ratio) scale_cover(prefs, ratio)
cdata = generate_cover(mi, prefs=prefs) cdata = generate_cover(mi, prefs=prefs)
with share_open(file_name, 'w+b') as f: destf.write(cdata)
f.write(cdata)
def write_generated_cover(db, book_id, width, height, destf):
from calibre.ebooks.metadata.opf2 import metadata_to_opf
mi = metadata_to_opf(db.get_metadata(book_id))
try:
fork_job('calibre.srv.content', 'generate_cover_worker', args=(width, height, mi, destf.name, get_use_roman()), no_output=True)
except WorkerError as err:
raise Exception(err.orig_tb)
def generated_cover(ctx, rd, library_id, db, book_id, width=None, height=None): def generated_cover(ctx, rd, library_id, db, book_id, width=None, height=None):
prefix = 'generated-cover' prefix = 'generated-cover'

View File

@ -16,7 +16,7 @@ from calibre.constants import config_dir
from calibre.db.categories import Tag from calibre.db.categories import Tag
from calibre.ebooks.metadata.sources.identify import urls_from_identifiers from calibre.ebooks.metadata.sources.identify import urls_from_identifiers
from calibre.utils.date import isoformat, UNDEFINED_DATE, local_tz from calibre.utils.date import isoformat, UNDEFINED_DATE, local_tz
from calibre.utils.config import tweaks, JSONConfig from calibre.utils.config import tweaks
from calibre.utils.formatter import EvalFormatter from calibre.utils.formatter import EvalFormatter
from calibre.utils.file_type_icons import EXT_MAP from calibre.utils.file_type_icons import EXT_MAP
from calibre.utils.icu import collation_order from calibre.utils.icu import collation_order
@ -154,8 +154,9 @@ def icon_map():
global _icon_map global _icon_map
with _icon_map_lock: with _icon_map_lock:
if _icon_map is None: if _icon_map is None:
from calibre.gui2 import gprefs
_icon_map = category_icon_map.copy() _icon_map = category_icon_map.copy()
custom_icons = JSONConfig('gui').get('tags_browser_category_icons', {}) custom_icons = gprefs.get('tags_browser_category_icons', {})
for k, v in custom_icons.iteritems(): for k, v in custom_icons.iteritems():
if os.access(os.path.join(config_dir, 'tb_icons', v), os.R_OK): if os.access(os.path.join(config_dir, 'tb_icons', v), os.R_OK):
_icon_map[k] = '_' + quote(v) _icon_map[k] = '_' + quote(v)

View File

@ -237,4 +237,7 @@ def main(args=sys.argv):
signal.signal(signal.SIGTERM, lambda s,f: server.stop()) signal.signal(signal.SIGTERM, lambda s,f: server.stop())
if not opts.daemonize and not iswindows: if not opts.daemonize and not iswindows:
signal.signal(signal.SIGHUP, lambda s,f: server.stop()) signal.signal(signal.SIGHUP, lambda s,f: server.stop())
# Needed for dynamic cover generation, which uses Qt for drawing
from calibre.gui2 import ensure_app, load_builtin_fonts
ensure_app(), load_builtin_fonts()
server.serve_forever() server.serve_forever()

View File

@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import,
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>' __copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
import errno, socket, select, os, re import errno, socket, select, os
from Cookie import SimpleCookie from Cookie import SimpleCookie
from contextlib import closing from contextlib import closing
from urlparse import parse_qs from urlparse import parse_qs
@ -18,7 +18,7 @@ from urllib import quote as urlquote
from binascii import hexlify, unhexlify from binascii import hexlify, unhexlify
from calibre import prints from calibre import prints
from calibre.constants import iswindows, config_dir from calibre.constants import iswindows
from calibre.srv.errors import HTTPNotFound from calibre.srv.errors import HTTPNotFound
from calibre.utils.config_base import tweaks from calibre.utils.config_base import tweaks
from calibre.utils.localization import get_translator from calibre.utils.localization import get_translator
@ -511,12 +511,6 @@ _use_roman = None
def get_use_roman(): def get_use_roman():
global _use_roman global _use_roman
if _use_roman is None: if _use_roman is None:
try: from calibre.gui2 import config
with lopen(os.path.join(config_dir, 'gui.py'), 'rb') as f: _use_roman = config['use_roman_numerals_for_series_number']
raw = f.read()
except EnvironmentError:
_use_roman = False
else:
m = re.search(br'use_roman_numerals_for_series_number\s*=\s*(True|False)', raw)
_use_roman = m is not None and m.group(1) == b'True'
return _use_roman return _use_roman