diff --git a/src/calibre/srv/content.py b/src/calibre/srv/content.py index 838f657cca..ad25c2c3e3 100644 --- a/src/calibre/srv/content.py +++ b/src/calibre/srv/content.py @@ -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' diff --git a/src/calibre/srv/metadata.py b/src/calibre/srv/metadata.py index d557082776..8d5ad7f87f 100644 --- a/src/calibre/srv/metadata.py +++ b/src/calibre/srv/metadata.py @@ -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) diff --git a/src/calibre/srv/standalone.py b/src/calibre/srv/standalone.py index 4741066f8f..57cb491d7d 100644 --- a/src/calibre/srv/standalone.py +++ b/src/calibre/srv/standalone.py @@ -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() diff --git a/src/calibre/srv/utils.py b/src/calibre/srv/utils.py index 15b25250df..5b802656e9 100644 --- a/src/calibre/srv/utils.py +++ b/src/calibre/srv/utils.py @@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -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