GwR revise layout analysis

This commit is contained in:
GRiker 2010-03-10 12:06:59 -07:00
parent 834fd93bc8
commit f500bca0fe

View File

@ -4,9 +4,10 @@ __copyright__ = '2010, Greg Riker <griker@hotmail.com>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
''' Read/write metadata from Amazon's topaz format ''' ''' Read/write metadata from Amazon's topaz format '''
import copy, StringIO import copy, StringIO, sys
from struct import pack, unpack from struct import pack, unpack
from calibre import prints
from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata import MetaInformation
def read_record(raw, name): def read_record(raw, name):
@ -253,7 +254,8 @@ class MetadataUpdater(object):
offset = 5 offset = 5
topaz_headers = {} topaz_headers = {}
dkey_offset = 0 dkey_offset = 0
highest_payload_offset = 0 lowest_payload_offset = sys.maxint
lowest_offset_err = None
for x in range(self.header_records): for x in range(self.header_records):
marker = self.data[offset] marker = self.data[offset]
offset += 1 offset += 1
@ -268,10 +270,10 @@ class MetadataUpdater(object):
hdr_offset, consumed = self.decode_vwi(self.data[offset:offset+4]) hdr_offset, consumed = self.decode_vwi(self.data[offset:offset+4])
if tag == 'dkey': if tag == 'dkey':
dkey_offset = hdr_offset dkey_offset = hdr_offset
if tag != 'metadata': if tag not in ['dkey','metadata']:
if hdr_offset > highest_payload_offset: if hdr_offset < lowest_payload_offset:
highest_payload_offset = hdr_offset lowest_payload_offset = hdr_offset
#print "adjusting highest_payload_offset to 0x%x (%s)" % (hdr_offset,tag) lowest_offset_err = "lowest_payload_offset: 0x%x (%s)" % (hdr_offset,tag)
offset += consumed offset += consumed
len_uncomp, consumed = self.decode_vwi(self.data[offset:offset+4]) len_uncomp, consumed = self.decode_vwi(self.data[offset:offset+4])
offset += consumed offset += consumed
@ -280,10 +282,13 @@ class MetadataUpdater(object):
blocks[val] = dict(hdr_offset=hdr_offset,len_uncomp=len_uncomp,len_comp=len_comp) blocks[val] = dict(hdr_offset=hdr_offset,len_uncomp=len_uncomp,len_comp=len_comp)
topaz_headers[x] = dict(tag=tag,blocks=blocks) topaz_headers[x] = dict(tag=tag,blocks=blocks)
self.topaz_headers = topaz_headers self.topaz_headers = topaz_headers
self.highest_payload_offset = highest_payload_offset
self.eod = self.data[offset] self.eod = self.data[offset]
offset += 1 offset += 1
self.base = offset 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 self.base_value = None
if dkey_offset: if dkey_offset:
self.base_value = self.data[offset:offset + dkey_offset] self.base_value = self.data[offset:offset + dkey_offset]
@ -352,8 +357,8 @@ class MetadataUpdater(object):
self.metadata[item]['metadata'] = value self.metadata[item]['metadata'] = value
return return
if self.md_start > self.highest_payload_offset: if self.md_start > self.lowest_payload_offset:
raise ValueError('Unable to update metadata') raise ValueError('Unable to update metadata:')
try: try:
from calibre.ebooks.conversion.config import load_defaults from calibre.ebooks.conversion.config import load_defaults
@ -386,7 +391,6 @@ class MetadataUpdater(object):
self.stream.write(updated_metadata) self.stream.write(updated_metadata)
self.stream.write(tail) self.stream.write(tail)
def set_metadata(stream, mi): def set_metadata(stream, mi):
mu = MetadataUpdater(stream) mu = MetadataUpdater(stream)
mu.update(mi) mu.update(mi)