diff --git a/src/calibre/customize/ui.py b/src/calibre/customize/ui.py index 9b5eb17fb8..f8e4f17c07 100644 --- a/src/calibre/customize/ui.py +++ b/src/calibre/customize/ui.py @@ -21,9 +21,9 @@ from calibre.ebooks.metadata import MetaInformation from calibre.utils.config import (make_config_dir, Config, ConfigProxy, plugin_dir, OptionParser) 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): @@ -615,6 +615,18 @@ def all_metadata_plugins(): for plugin in _initialized_plugins: if isinstance(plugin, Source): 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 {{{ diff --git a/src/calibre/ebooks/metadata/sources/update.py b/src/calibre/ebooks/metadata/sources/update.py index a9e7c6a56b..2dd7737f7d 100644 --- a/src/calibre/ebooks/metadata/sources/update.py +++ b/src/calibre/ebooks/metadata/sources/update.py @@ -13,6 +13,8 @@ from threading import Thread from calibre import as_unicode, prints 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.https import get_https_resource_securely @@ -26,6 +28,25 @@ def debug_print(*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(): needed = set() current_hashes = cache.get('hashes', {})