mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 02:34:06 -04:00
Remove ununsed vars from mobi.py
This commit is contained in:
parent
9ba8790663
commit
0a73a7cf51
@ -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.')
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user