diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index 456c9fba93..2d4e89492b 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -206,7 +206,6 @@ 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/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py index 5c8e34c139..304593a2ca 100644 --- a/src/calibre/ebooks/conversion/plumber.py +++ b/src/calibre/ebooks/conversion/plumber.py @@ -731,7 +731,8 @@ OptionRecommendation(name='timestamp', zf = ZipFile(os.path.join(self.opts.debug_pipeline, 'periodical.downloaded_recipe'), 'w') zf.add_dir(out_dir) - self.input_plugin.save_download(zf) + with self.input_plugin: + self.input_plugin.save_download(zf) zf.close() self.log.info('Input debug saved to:', out_dir) @@ -780,28 +781,29 @@ OptionRecommendation(name='timestamp', self.ui_reporter(0.01, _('Converting input to HTML...')) ir = CompositeProgressReporter(0.01, 0.34, self.ui_reporter) self.input_plugin.report_progress = ir - self.oeb = self.input_plugin(stream, self.opts, - self.input_fmt, self.log, - accelerators, tdir) - if self.opts.debug_pipeline is not None: - self.dump_input(self.oeb, tdir) - if self.abort_after_input_dump: - return - if self.input_fmt in ('recipe', 'downloaded_recipe'): - self.opts_to_mi(self.user_metadata) - if not hasattr(self.oeb, 'manifest'): - self.oeb = create_oebbook(self.log, self.oeb, self.opts, - self.input_plugin) - self.input_plugin.postprocess_book(self.oeb, self.opts, self.log) - self.opts.is_image_collection = self.input_plugin.is_image_collection - pr = CompositeProgressReporter(0.34, 0.67, self.ui_reporter) - self.flush() - if self.opts.debug_pipeline is not None: - out_dir = os.path.join(self.opts.debug_pipeline, 'parsed') - self.dump_oeb(self.oeb, out_dir) - self.log('Parsed HTML written to:', out_dir) - self.input_plugin.specialize(self.oeb, self.opts, self.log, - self.output_fmt) + with self.input_plugin: + self.oeb = self.input_plugin(stream, self.opts, + self.input_fmt, self.log, + accelerators, tdir) + if self.opts.debug_pipeline is not None: + self.dump_input(self.oeb, tdir) + if self.abort_after_input_dump: + return + if self.input_fmt in ('recipe', 'downloaded_recipe'): + self.opts_to_mi(self.user_metadata) + if not hasattr(self.oeb, 'manifest'): + self.oeb = create_oebbook(self.log, self.oeb, self.opts, + self.input_plugin) + self.input_plugin.postprocess_book(self.oeb, self.opts, self.log) + self.opts.is_image_collection = self.input_plugin.is_image_collection + pr = CompositeProgressReporter(0.34, 0.67, self.ui_reporter) + self.flush() + if self.opts.debug_pipeline is not None: + out_dir = os.path.join(self.opts.debug_pipeline, 'parsed') + self.dump_oeb(self.oeb, out_dir) + self.log('Parsed HTML written to:', out_dir) + self.input_plugin.specialize(self.oeb, self.opts, self.log, + self.output_fmt) pr(0., _('Running transforms on ebook...')) @@ -891,7 +893,8 @@ OptionRecommendation(name='timestamp', our = CompositeProgressReporter(0.67, 1., self.ui_reporter) self.output_plugin.report_progress = our our(0., _('Creating')+' %s'%self.output_plugin.name) - self.output_plugin.convert(self.oeb, self.output, self.input_plugin, + with self.output_plugin: + self.output_plugin.convert(self.oeb, self.output, self.input_plugin, self.opts, self.log) self.ui_reporter(1.) run_plugins_on_postprocess(self.output, self.output_fmt) diff --git a/src/calibre/ebooks/metadata/fetch.py b/src/calibre/ebooks/metadata/fetch.py index aca975e4b9..053a0a6cc7 100644 --- a/src/calibre/ebooks/metadata/fetch.py +++ b/src/calibre/ebooks/metadata/fetch.py @@ -215,6 +215,28 @@ def merge_results(one, two): else: one[idx].smart_update(x) +class MetadataSources(object): + + def __init__(self, sources): + self.sources = sources + + def __enter__(self): + for s in self.sources: + s.__enter__() + return self + + def __exit__(self, *args): + for s in self.sources: + s.__exit__() + + def __call__(self, *args, **kwargs): + for s in self.sources: + s(*args, **kwargs) + + def join(self): + for s in self.sources: + s.join() + def search(title=None, author=None, publisher=None, isbn=None, isbndb_key=None, verbose=0): assert not(title is None and author is None and publisher is None and \ @@ -224,11 +246,10 @@ def search(title=None, author=None, publisher=None, isbn=None, isbndb_key=None, if isbn is not None: isbn = re.sub(r'[^a-zA-Z0-9]', '', isbn).upper() fetchers = list(metadata_sources(isbndb_key=isbndb_key)) + with MetadataSources(fetchers) as manager: + manager(title, author, publisher, isbn, verbose) + manager.join() - for fetcher in fetchers: - fetcher(title, author, publisher, isbn, verbose) - for fetcher in fetchers: - fetcher.join() results = list(fetchers[0].results) for fetcher in fetchers[1:]: merge_results(results, fetcher.results) @@ -243,10 +264,9 @@ def search(title=None, author=None, publisher=None, isbn=None, isbndb_key=None, def get_social_metadata(mi, verbose=0): from calibre.customize.ui import metadata_sources fetchers = list(metadata_sources(metadata_type='social')) - for fetcher in fetchers: - fetcher(mi.title, mi.authors, mi.publisher, mi.isbn, verbose) - for fetcher in fetchers: - fetcher.join() + with MetadataSources(fetchers) as manager: + manager(mi.title, mi.authors, mi.publisher, mi.isbn, verbose) + manager.join() ratings, tags, comments = [], set([]), set([]) for fetcher in fetchers: if fetcher.results: diff --git a/src/calibre/ebooks/oeb/iterator.py b/src/calibre/ebooks/oeb/iterator.py index d09c49ebeb..cb62774e8d 100644 --- a/src/calibre/ebooks/oeb/iterator.py +++ b/src/calibre/ebooks/oeb/iterator.py @@ -173,7 +173,8 @@ class EbookIterator(object): plumber.opts.no_process = True plumber.input_plugin.for_viewer = True - self.pathtoopf = plumber.input_plugin(open(plumber.input, 'rb'), + with plumber.input_plugin: + self.pathtoopf = plumber.input_plugin(open(plumber.input, 'rb'), plumber.opts, plumber.input_fmt, self.log, {}, self.base)