mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Code to patch in dynamically updated metadata plugins
This commit is contained in:
parent
82fca6cfae
commit
b5010e7060
@ -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 {{{
|
||||
|
@ -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', {})
|
||||
|
Loading…
x
Reference in New Issue
Block a user