From c9a0e00e45713cc4895338f211a1d21bc86f1713 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 28 Oct 2010 10:58:43 -0600 Subject: [PATCH] Fix #7245 (Defer Metadata reading until after on_import plugins run) --- src/calibre/customize/builtins.py | 2 +- src/calibre/ebooks/metadata/worker.py | 51 ++++++++++++++++----------- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index fe187a1400..772a2d47df 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -292,7 +292,7 @@ class RTFMetadataReader(MetadataReaderPlugin): def get_metadata(self, stream, ftype): from calibre.ebooks.metadata.rtf import get_metadata return get_metadata(stream) - + class SNBMetadataReader(MetadataReaderPlugin): name = 'Read SNB metadata' diff --git a/src/calibre/ebooks/metadata/worker.py b/src/calibre/ebooks/metadata/worker.py index 909eef05c2..d2616c2444 100644 --- a/src/calibre/ebooks/metadata/worker.py +++ b/src/calibre/ebooks/metadata/worker.py @@ -21,51 +21,62 @@ def debug(*args): prints(*args) sys.stdout.flush() -def read_metadata_(task, tdir, notification=lambda x,y:x): +def serialize_metadata_for(formats, tdir, id_): from calibre.ebooks.metadata.meta import metadata_from_formats from calibre.ebooks.metadata.opf2 import metadata_to_opf + mi = metadata_from_formats(formats) + mi.cover = None + cdata = None + if mi.cover_data: + cdata = mi.cover_data[-1] + mi.cover_data = None + if not mi.application_id: + mi.application_id = '__calibre_dummy__' + with open(os.path.join(tdir, '%s.opf'%id_), 'wb') as f: + f.write(metadata_to_opf(mi)) + if cdata: + with open(os.path.join(tdir, str(id_)), 'wb') as f: + f.write(cdata) + +def read_metadata_(task, tdir, notification=lambda x,y:x): from calibre.customize.ui import run_plugins_on_import for x in task: try: - id, formats = x + id_, formats = x + except: + continue + try: if isinstance(formats, basestring): formats = [formats] - mi = metadata_from_formats(formats) - mi.cover = None - cdata = None - if mi.cover_data: - cdata = mi.cover_data[-1] - mi.cover_data = None - if not mi.application_id: - mi.application_id = '__calibre_dummy__' - with open(os.path.join(tdir, '%s.opf'%id), 'wb') as f: - f.write(metadata_to_opf(mi)) - if cdata: - with open(os.path.join(tdir, str(id)), 'wb') as f: - f.write(cdata) import_map = {} + fmts = [] for format in formats: nfp = run_plugins_on_import(format) - if nfp is None: + if not nfp or not os.access(nfp, os.R_OK): nfp = format nfp = os.path.abspath(nfp) + fmts.append(nfp) + + serialize_metadata_for(fmts, tdir, id_) + + for format, nfp in zip(formats, fmts): if isinstance(nfp, unicode): nfp.encode(filesystem_encoding) x = lambda j : os.path.abspath(os.path.normpath(os.path.normcase(j))) if x(nfp) != x(format) and os.access(nfp, os.R_OK|os.W_OK): fmt = os.path.splitext(format)[1].replace('.', '').lower() nfmt = os.path.splitext(nfp)[1].replace('.', '').lower() - dest = os.path.join(tdir, '%s.%s'%(id, nfmt)) + dest = os.path.join(tdir, '%s.%s'%(id_, nfmt)) shutil.copyfile(nfp, dest) import_map[fmt] = dest os.remove(nfp) if import_map: - with open(os.path.join(tdir, str(id)+'.import'), 'wb') as f: + with open(os.path.join(tdir, str(id_)+'.import'), 'wb') as f: for fmt, nfp in import_map.items(): f.write(fmt+':'+nfp+'\n') - notification(0.5, id) + notification(0.5, id_) except: import traceback - with open(os.path.join(tdir, '%s.error'%id), 'wb') as f: + with open(os.path.join(tdir, '%s.error'%id_), 'wb') as f: f.write(traceback.format_exc()) class Progress(object):