mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 10:44:09 -04:00
Dont use a worker process when generating thumbnails, for better performance
This commit is contained in:
parent
830b826c58
commit
b027fa50e5
@ -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'
|
||||||
|
@ -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)
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user