From 184692b587e67d79ef35edc04ff5b97c0c27654d Mon Sep 17 00:00:00 2001 From: John Schember Date: Tue, 12 Apr 2011 20:39:01 -0400 Subject: [PATCH] extZ metadata: Get cover, update OPF without losing other data such as spine, and guide. --- src/calibre/ebooks/metadata/extz.py | 34 +++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/calibre/ebooks/metadata/extz.py b/src/calibre/ebooks/metadata/extz.py index b49f3f6ddd..338c4dd91d 100644 --- a/src/calibre/ebooks/metadata/extz.py +++ b/src/calibre/ebooks/metadata/extz.py @@ -7,13 +7,10 @@ __copyright__ = '2011, John Schember ' Read meta information from extZ (TXTZ, HTMLZ...) files. ''' -import os - from cStringIO import StringIO from calibre.ebooks.metadata import MetaInformation -from calibre.ebooks.metadata.opf2 import OPF, metadata_to_opf -from calibre.ptempfile import TemporaryDirectory +from calibre.ebooks.metadata.opf2 import OPF from calibre.utils.zipfile import ZipFile, safe_replace def get_metadata(stream, extract_cover=True): @@ -23,23 +20,32 @@ def get_metadata(stream, extract_cover=True): mi = MetaInformation(_('Unknown'), [_('Unknown')]) stream.seek(0) - with TemporaryDirectory('_untxtz_mdata') as tdir: - try: - with ZipFile(stream) as zf: - opf_name = get_first_opf_name(stream) - opf_stream = StringIO(zf.read(opf_name)) - mi = OPF(opf_stream).to_book_metadata() - except: - return mi + try: + with ZipFile(stream) as zf: + opf_name = get_first_opf_name(stream) + opf_stream = StringIO(zf.read(opf_name)) + opf = OPF(opf_stream) + mi = opf.to_book_metadata() + if extract_cover: + cover_name = opf.raster_cover + if cover_name: + mi.cover_data = ('jpg', zf.read(cover_name)) + except: + return mi return mi def set_metadata(stream, mi): - opf = StringIO(metadata_to_opf(mi)) try: opf_name = get_first_opf_name(stream) + with ZipFile(stream) as zf: + opf_stream = StringIO(zf.read(opf_name)) + opf = OPF(opf_stream) except: opf_name = 'metadata.opf' - safe_replace(stream, opf_name, opf) + opf = OPF(StringIO()) + opf.smart_update(mi, replace_metadata=True) + newopf = StringIO(opf.render()) + safe_replace(stream, opf_name, newopf) def get_first_opf_name(stream): with ZipFile(stream) as zf: