mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
GwR revise layout analysis
This commit is contained in:
parent
834fd93bc8
commit
f500bca0fe
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user