From 3edb183c25c6165bd4169103b19096dc5f1267bd Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 20 Feb 2010 13:42:32 -0700 Subject: [PATCH] Fix #4958 (Metadata not imported for zipped Mobipocket file) --- src/calibre/ebooks/metadata/meta.py | 7 +++++-- src/calibre/ebooks/metadata/zip.py | 11 +++++++---- src/calibre/ebooks/mobi/reader.py | 5 ++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/calibre/ebooks/metadata/meta.py b/src/calibre/ebooks/metadata/meta.py index 2d22190ad4..4f808e3fb0 100644 --- a/src/calibre/ebooks/metadata/meta.py +++ b/src/calibre/ebooks/metadata/meta.py @@ -70,11 +70,14 @@ def is_recipe(filename): filename.rpartition('.')[0].endswith('_recipe_out') def get_metadata(stream, stream_type='lrf', use_libprs_metadata=False): - pos = stream.tell() + pos = 0 + if hasattr(stream, 'tell'): + pos = stream.tell() try: return _get_metadata(stream, stream_type, use_libprs_metadata) finally: - stream.seek(pos) + if hasattr(stream, 'seek'): + stream.seek(pos) def _get_metadata(stream, stream_type, use_libprs_metadata): diff --git a/src/calibre/ebooks/metadata/zip.py b/src/calibre/ebooks/metadata/zip.py index db9d751f3a..08ac132d53 100644 --- a/src/calibre/ebooks/metadata/zip.py +++ b/src/calibre/ebooks/metadata/zip.py @@ -3,9 +3,10 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' import os -from zipfile import ZipFile -from cStringIO import StringIO +from calibre.utils.zipfile import ZipFile +from calibre.ptempfile import TemporaryDirectory +from calibre import CurrentDir def get_metadata(stream): from calibre.ebooks.metadata.meta import get_metadata @@ -23,8 +24,10 @@ def get_metadata(stream): stream_type = stream_type[1:] if stream_type in ('lit', 'opf', 'prc', 'mobi', 'fb2', 'epub', 'rb', 'imp', 'pdf', 'lrf'): - stream = StringIO(zf.read(f)) - return get_metadata(stream, stream_type) + with TemporaryDirectory() as tdir: + with CurrentDir(tdir): + path = zf.extract(f) + return get_metadata(open(path, 'rb'), stream_type) raise ValueError('No ebook found in ZIP archive') diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 88396b4346..55a8b2a799 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -795,8 +795,7 @@ class MobiReader(object): def get_metadata(stream): from calibre.utils.logging import Log - log = Log() - + log = Log(level=Log.DEBUG) mi = MetaInformation(os.path.basename(stream.name), [_('Unknown')]) try: mh = MetadataHeader(stream, log) @@ -823,5 +822,5 @@ def get_metadata(stream): im.convert('RGBA').save(obuf, format='JPEG') mi.cover_data = ('jpg', obuf.getvalue()) except: - log.exception() + log.exception('Failed to read MOBI metadata') return mi