Code to patch in dynamically updated metadata plugins

This commit is contained in:
Kovid Goyal 2017-02-28 13:52:41 +05:30
parent 82fca6cfae
commit b5010e7060
2 changed files with 35 additions and 2 deletions

View File

@ -21,9 +21,9 @@ from calibre.ebooks.metadata import MetaInformation
from calibre.utils.config import (make_config_dir, Config, ConfigProxy, from calibre.utils.config import (make_config_dir, Config, ConfigProxy,
plugin_dir, OptionParser) plugin_dir, OptionParser)
from calibre.ebooks.metadata.sources.base import Source from calibre.ebooks.metadata.sources.base import Source
from calibre.constants import DEBUG from calibre.constants import DEBUG, numeric_version
builtin_names = frozenset([p.name for p in builtin_plugins]) builtin_names = frozenset(p.name for p in builtin_plugins)
class NameConflict(ValueError): class NameConflict(ValueError):
@ -615,6 +615,18 @@ def all_metadata_plugins():
for plugin in _initialized_plugins: for plugin in _initialized_plugins:
if isinstance(plugin, Source): if isinstance(plugin, Source):
yield plugin yield plugin
def patch_metadata_plugins(possibly_updated_plugins):
patches = {}
for i, plugin in enumerate(_initialized_plugins):
if isinstance(plugin, Source) and plugin.name in builtin_names:
pup = possibly_updated_plugins.get(plugin.name)
if pup is not None:
if pup.version > plugin.version and pup.minimum_calibre_version <= numeric_version:
patches[i] = pup
for i, pup in patches.iteritems():
_initialized_plugins[i] = pup
# }}} # }}}
# Viewer plugins {{{ # Viewer plugins {{{

View File

@ -13,6 +13,8 @@ from threading import Thread
from calibre import as_unicode, prints from calibre import as_unicode, prints
from calibre.constants import DEBUG from calibre.constants import DEBUG
from calibre.customize.ui import patch_metadata_plugins
from calibre.ebooks.metadata.sources.base import Source
from calibre.utils.config import JSONConfig from calibre.utils.config import JSONConfig
from calibre.utils.https import get_https_resource_securely from calibre.utils.https import get_https_resource_securely
@ -26,6 +28,25 @@ def debug_print(*args, **k):
prints(*args, **k) prints(*args, **k)
def load_plugin(src):
src = src.encode('utf-8')
ns = {}
exec src in ns
for x in ns.itervalues():
if isinstance(x, type) and issubclass(x, Source) and x is not Source:
return x
def patch_plugins():
patches = {}
for name, val in cache.iteritems():
if name != 'hashes':
p = load_plugin(val)
if p is not None:
patches[p.name] = p
patch_metadata_plugins(patches)
def update_needed(): def update_needed():
needed = set() needed = set()
current_hashes = cache.get('hashes', {}) current_hashes = cache.get('hashes', {})