diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index 3b6f1cd760..456c9fba93 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -119,11 +119,34 @@ class Plugin(object): def __enter__(self, *args): if self.plugin_path is not None: - sys.path.insert(0, self.plugin_path) + from calibre.utils.zipfile import ZipFile + zf = ZipFile(self.plugin_path) + extensions = set([x.rpartition('.')[-1].lower() for x in + zf.namelist()]) + zip_safe = True + for ext in ('pyd', 'so', 'dll', 'dylib'): + if ext in extensions: + zip_safe = False + if zip_safe: + sys.path.insert(0, self.plugin_path) + self._sys_insertion_path = self.plugin_path + else: + from calibre.ptempfile import TemporaryDirectory + self._sys_insertion_tdir = TemporaryDirectory('plugin_unzip') + self._sys_insertion_path = self._sys_insertion_tdir.__enter__(*args) + zf.extractall(self._sys_insertion_path) + sys.path.insert(0, self._sys_insertion_path) + zf.close() + def __exit__(self, *args): - if self.plugin_path in sys.path: - sys.path.remove(self.plugin_path) + ip, it = getattr(self, '_sys_insertion_path', None), getattr(self, + '_sys_insertion_tdir', None) + if ip in sys.path: + sys.path.remove(ip) + if hasattr(it, '__exit__'): + it.__exit__(*args) + class FileTypePlugin(Plugin): @@ -183,6 +206,7 @@ class MetadataReaderPlugin(Plugin): type = _('Metadata reader') def __init__(self, *args, **kwargs): + print 11111, args, kwargs Plugin.__init__(self, *args, **kwargs) self.quick = False diff --git a/src/calibre/customize/ui.py b/src/calibre/customize/ui.py index 0f072d1f70..68c26386c9 100644 --- a/src/calibre/customize/ui.py +++ b/src/calibre/customize/ui.py @@ -401,7 +401,7 @@ def initialize_plugins(): plugin = load_plugin(zfp) if not isinstance(zfp, type) else zfp except PluginNotFound: continue - plugin = initialize_plugin(plugin, zfp if not isinstance(zfp, type) else zfp) + plugin = initialize_plugin(plugin, None if isinstance(zfp, type) else zfp) _initialized_plugins.append(plugin) except: print 'Failed to initialize plugin...'