Remove ununsed vars from mobi.py

This commit is contained in:
Kovid Goyal 2010-01-26 10:06:56 -07:00
parent 9ba8790663
commit 0a73a7cf51

View File

@ -17,7 +17,7 @@ from calibre.ebooks.mobi import MobiError
from calibre.ebooks.mobi.writer import rescale_image, MAX_THUMB_DIMEN from calibre.ebooks.mobi.writer import rescale_image, MAX_THUMB_DIMEN
from calibre.ebooks.mobi.langcodes import iana2mobi from calibre.ebooks.mobi.langcodes import iana2mobi
import struct, traceback import struct
class StreamSlicer(object): class StreamSlicer(object):
@ -74,15 +74,15 @@ class StreamSlicer(object):
return stream.write(value) return stream.write(value)
raise TypeError("stream indices must be integers") raise TypeError("stream indices must be integers")
def update(self, data_blocks): def update(self, data_blocks):
# Rewrite the stream # Rewrite the stream
stream = self._stream stream = self._stream
base = self.start base = self.start
stream.seek(base) stream.seek(base)
self._stream.truncate(base) self._stream.truncate(base)
for block in data_blocks: for block in data_blocks:
stream.write(block) stream.write(block)
def truncate(self, value): def truncate(self, value):
self._stream.truncate(value) self._stream.truncate(value)
@ -90,7 +90,7 @@ class MetadataUpdater(object):
def __init__(self, stream): def __init__(self, stream):
self.stream = stream self.stream = stream
data = self.data = StreamSlicer(stream) data = self.data = StreamSlicer(stream)
type = self.type = data[60:68] self.type = data[60:68]
self.nrecs, = unpack('>H', data[76:78]) self.nrecs, = unpack('>H', data[76:78])
record0 = self.record0 = self.record(0) record0 = self.record0 = self.record(0)
self.encryption_type, = unpack('>H', record0[12:14]) self.encryption_type, = unpack('>H', record0[12:14])
@ -135,25 +135,24 @@ class MetadataUpdater(object):
elif id == 202: elif id == 202:
rindex, = self.thumbnail_rindex, = unpack('>I', content) rindex, = self.thumbnail_rindex, = unpack('>I', content)
self.thumbnail_record = self.record(rindex + image_base) self.thumbnail_record = self.record(rindex + image_base)
def patch(self, off, new_record0): def patch(self, off, new_record0):
# Save the current size of each record # Save the current size of each record
record_sizes = [len(new_record0)] record_sizes = [len(new_record0)]
for i in range(1,self.nrecs-1): for i in range(1,self.nrecs-1):
record_sizes.append(self.pdbrecords[i+1][0]-self.pdbrecords[i][0]) record_sizes.append(self.pdbrecords[i+1][0]-self.pdbrecords[i][0])
# And the last one # And the last one
record_sizes.append(self.data.stop - self.pdbrecords[self.nrecs-1][0]) record_sizes.append(self.data.stop - self.pdbrecords[self.nrecs-1][0])
# pdbrecord[0] is the offset of record0. It will not change # pdbrecord[0] is the offset of record0. It will not change
# record1 offset will be offset of record0 + len(new_record0) # record1 offset will be offset of record0 + len(new_record0)
updated_pdbrecords = [self.pdbrecords[0][0]] updated_pdbrecords = [self.pdbrecords[0][0]]
record0_offset = self.pdbrecords[0][0] record0_offset = self.pdbrecords[0][0]
current_offset = self.pdbrecords[1][0]
updated_offset = record0_offset + len(new_record0) updated_offset = record0_offset + len(new_record0)
for i in range(1,self.nrecs-1): for i in range(1,self.nrecs-1):
updated_pdbrecords.append(updated_offset) updated_pdbrecords.append(updated_offset)
updated_offset += record_sizes[i] updated_offset += record_sizes[i]
# Update the last pdbrecord # Update the last pdbrecord
updated_pdbrecords.append(updated_offset) updated_pdbrecords.append(updated_offset)
@ -175,17 +174,13 @@ class MetadataUpdater(object):
self.data.stop = updated_pdbrecords[-1] + record_sizes[-1] self.data.stop = updated_pdbrecords[-1] + record_sizes[-1]
def patchSection(self, section, new): def patchSection(self, section, new):
if (section + 1 == self.nrecs):
endoff = len(self.stream)
else:
endoff = self.pdbrecords[section + 1][0]
off = self.pdbrecords[section][0] off = self.pdbrecords[section][0]
self.patch(off, new) self.patch(off, new)
def create_exth(self, exth=None): def create_exth(self, exth=None):
# Add an EXTH block to record 0, rewrite the stream # Add an EXTH block to record 0, rewrite the stream
# self.hexdump(self.record0) # self.hexdump(self.record0)
# Fetch the title # Fetch the title
title_offset, = struct.unpack('>L', self.record0[0x54:0x58]) title_offset, = struct.unpack('>L', self.record0[0x54:0x58])
title_length, = struct.unpack('>L', self.record0[0x58:0x5c]) title_length, = struct.unpack('>L', self.record0[0x58:0x5c])
@ -198,10 +193,10 @@ class MetadataUpdater(object):
self.record0[0x17] = "\xe8" self.record0[0x17] = "\xe8"
self.record0[0xf4:0xf8] = pack('>L', 0xFFFFFFFF) self.record0[0xf4:0xf8] = pack('>L', 0xFFFFFFFF)
mobi_header_length = 0xe8 mobi_header_length = 0xe8
# Set EXTH flag (0x40) # Set EXTH flag (0x40)
self.record0[0x80:0x84] = pack('>L', self.flags|0x40) self.record0[0x80:0x84] = pack('>L', self.flags|0x40)
if not exth: if not exth:
# Construct an empty EXTH block # Construct an empty EXTH block
pad = '\0' * 4 pad = '\0' * 4
@ -216,23 +211,23 @@ class MetadataUpdater(object):
new_record0.write(self.record0[:0x10 + mobi_header_length]) new_record0.write(self.record0[:0x10 + mobi_header_length])
new_record0.write(exth) new_record0.write(exth)
new_record0.write(title_in_file) new_record0.write(title_in_file)
# Pad to a 4-byte boundary # Pad to a 4-byte boundary
trail = len(new_record0.getvalue()) % 4 trail = len(new_record0.getvalue()) % 4
pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte
new_record0.write(pad) new_record0.write(pad)
self.hexdump(new_record0.getvalue()) self.hexdump(new_record0.getvalue())
# Rebuild the stream, update the pdbrecords pointers # Rebuild the stream, update the pdbrecords pointers
self.patchSection(0,new_record0.getvalue()) self.patchSection(0,new_record0.getvalue())
# Update record0 # Update record0
self.record0 = self.record(0) self.record0 = self.record(0)
def hexdump(self, src, length=16): def hexdump(self, src, length=16):
# Diagnostic # Diagnostic
FILTER=''.join([(len(repr(chr(x)))==3) and chr(x) or '.' for x in range(256)]) FILTER=''.join([(len(repr(chr(x)))==3) and chr(x) or '.' for x in range(256)])
N=0; result='' N=0; result=''
while src: while src:
s,src = src[:length],src[length:] s,src = src[:length],src[length:]
@ -249,14 +244,14 @@ class MetadataUpdater(object):
flags, val = a1, a2<<16|a3<<8|a4 flags, val = a1, a2<<16|a3<<8|a4
pdbrecords.append( [offset, flags, val] ) pdbrecords.append( [offset, flags, val] )
return pdbrecords return pdbrecords
def update_pdbrecords(self, updated_pdbrecords): def update_pdbrecords(self, updated_pdbrecords):
for (i, pdbrecord) in enumerate(updated_pdbrecords): for (i, pdbrecord) in enumerate(updated_pdbrecords):
self.data[78+i*8:78+i*8 + 4] = pack('>L',pdbrecord) self.data[78+i*8:78+i*8 + 4] = pack('>L',pdbrecord)
# Refresh local copy # Refresh local copy
self.pdbrecords = self.get_pdbrecords() self.pdbrecords = self.get_pdbrecords()
def dump_pdbrecords(self): def dump_pdbrecords(self):
# Diagnostic # Diagnostic
print "MetadataUpdater.dump_pdbrecords()" print "MetadataUpdater.dump_pdbrecords()"
@ -264,7 +259,7 @@ class MetadataUpdater(object):
for i in xrange(len(self.pdbrecords)): for i in xrange(len(self.pdbrecords)):
pdbrecord = self.pdbrecords[i] pdbrecord = self.pdbrecords[i]
print "%10X %10X %10X" % (pdbrecord[0], pdbrecord[1], pdbrecord[2]) print "%10X %10X %10X" % (pdbrecord[0], pdbrecord[1], pdbrecord[2])
def record(self, n): def record(self, n):
if n >= self.nrecs: if n >= self.nrecs:
raise ValueError('non-existent record %r' % n) raise ValueError('non-existent record %r' % n)
@ -325,7 +320,6 @@ class MetadataUpdater(object):
exth = ['EXTH', pack('>II', len(exth) + 12, len(recs)), exth, pad] exth = ['EXTH', pack('>II', len(exth) + 12, len(recs)), exth, pad]
exth = ''.join(exth) exth = ''.join(exth)
title = (mi.title or _('Unknown')).encode(self.codec, 'replace')
if getattr(self, 'exth', None) is None: if getattr(self, 'exth', None) is None:
raise MobiError('No existing EXTH record. Cannot update metadata.') raise MobiError('No existing EXTH record. Cannot update metadata.')