From f500bca0fe1556eb6a776837d64d18f9ae30a093 Mon Sep 17 00:00:00 2001 From: GRiker Date: Wed, 10 Mar 2010 12:06:59 -0700 Subject: [PATCH] GwR revise layout analysis --- src/calibre/ebooks/metadata/topaz.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/calibre/ebooks/metadata/topaz.py b/src/calibre/ebooks/metadata/topaz.py index 4f442a844f..8423c52524 100644 --- a/src/calibre/ebooks/metadata/topaz.py +++ b/src/calibre/ebooks/metadata/topaz.py @@ -4,9 +4,10 @@ __copyright__ = '2010, Greg Riker ' __docformat__ = 'restructuredtext en' ''' Read/write metadata from Amazon's topaz format ''' -import copy, StringIO +import copy, StringIO, sys from struct import pack, unpack +from calibre import prints from calibre.ebooks.metadata import MetaInformation def read_record(raw, name): @@ -253,7 +254,8 @@ class MetadataUpdater(object): offset = 5 topaz_headers = {} dkey_offset = 0 - highest_payload_offset = 0 + lowest_payload_offset = sys.maxint + lowest_offset_err = None for x in range(self.header_records): marker = self.data[offset] offset += 1 @@ -268,10 +270,10 @@ class MetadataUpdater(object): hdr_offset, consumed = self.decode_vwi(self.data[offset:offset+4]) if tag == 'dkey': dkey_offset = hdr_offset - if tag != 'metadata': - if hdr_offset > highest_payload_offset: - highest_payload_offset = hdr_offset - #print "adjusting highest_payload_offset to 0x%x (%s)" % (hdr_offset,tag) + if tag not in ['dkey','metadata']: + if hdr_offset < lowest_payload_offset: + lowest_payload_offset = hdr_offset + lowest_offset_err = "lowest_payload_offset: 0x%x (%s)" % (hdr_offset,tag) offset += consumed len_uncomp, consumed = self.decode_vwi(self.data[offset:offset+4]) offset += consumed @@ -280,10 +282,13 @@ class MetadataUpdater(object): blocks[val] = dict(hdr_offset=hdr_offset,len_uncomp=len_uncomp,len_comp=len_comp) topaz_headers[x] = dict(tag=tag,blocks=blocks) self.topaz_headers = topaz_headers - self.highest_payload_offset = highest_payload_offset self.eod = self.data[offset] offset += 1 self.base = offset + self.lowest_payload_offset = lowest_payload_offset + self.base + if self.lowest_payload_offset < self.md_header_offset: + prints("Unexpected TPZ file layout:\n %s\n metadata_offset: 0x%x" % (lowest_offset_err, self.md_header_offset)) + prints("metadata needs to be before payload") self.base_value = None if dkey_offset: self.base_value = self.data[offset:offset + dkey_offset] @@ -352,8 +357,8 @@ class MetadataUpdater(object): self.metadata[item]['metadata'] = value return - if self.md_start > self.highest_payload_offset: - raise ValueError('Unable to update metadata') + if self.md_start > self.lowest_payload_offset: + raise ValueError('Unable to update metadata:') try: from calibre.ebooks.conversion.config import load_defaults @@ -386,7 +391,6 @@ class MetadataUpdater(object): self.stream.write(updated_metadata) self.stream.write(tail) - def set_metadata(stream, mi): mu = MetadataUpdater(stream) mu.update(mi)