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.constants import config_dir, iswindows
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.meta import set_metadata
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.filenames import ascii_filename, atomic_rename
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_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'))
return rd.filesystem_file_with_custom_etag(ans, prefix, library_id, book_id, mtime, extra_etag_data)
def generate_cover_worker(width, height, opf, file_name, use_roman):
# We have to generate the cover in a worker as it depends on Qt and needs
# 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()
def write_generated_cover(db, book_id, width, height, destf):
mi = db.get_metadata(book_id)
set_use_roman(get_use_roman())
if height is None:
prefs = cprefs
else:
@ -111,17 +106,7 @@ def generate_cover_worker(width, height, opf, file_name, use_roman):
prefs = override_prefs(cprefs)
scale_cover(prefs, ratio)
cdata = generate_cover(mi, prefs=prefs)
with share_open(file_name, 'w+b') as f:
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)
destf.write(cdata)
def generated_cover(ctx, rd, library_id, db, book_id, width=None, height=None):
prefix = 'generated-cover'

View File

@ -16,7 +16,7 @@ from calibre.constants import config_dir
from calibre.db.categories import Tag
from calibre.ebooks.metadata.sources.identify import urls_from_identifiers
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.file_type_icons import EXT_MAP
from calibre.utils.icu import collation_order
@ -154,8 +154,9 @@ def icon_map():
global _icon_map
with _icon_map_lock:
if _icon_map is None:
from calibre.gui2 import gprefs
_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():
if os.access(os.path.join(config_dir, 'tb_icons', v), os.R_OK):
_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())
if not opts.daemonize and not iswindows:
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()

View File

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