This commit is contained in:
Kovid Goyal 2011-07-30 19:25:38 -06:00
parent a66c9c5e1a
commit 6401dafec5

View File

@ -277,7 +277,8 @@ class MOBIHeader(object): # {{{
self.first_image_index, = struct.unpack(b'>I', self.raw[108:112]) self.first_image_index, = struct.unpack(b'>I', self.raw[108:112])
self.huffman_record_offset, = struct.unpack(b'>I', self.raw[112:116]) self.huffman_record_offset, = struct.unpack(b'>I', self.raw[112:116])
self.huffman_record_count, = struct.unpack(b'>I', self.raw[116:120]) self.huffman_record_count, = struct.unpack(b'>I', self.raw[116:120])
self.unknown2 = self.raw[120:128] self.datp_record_offset, = struct.unpack(b'>I', self.raw[120:124])
self.datp_record_count, = struct.unpack(b'>I', self.raw[124:128])
self.exth_flags, = struct.unpack(b'>I', self.raw[128:132]) self.exth_flags, = struct.unpack(b'>I', self.raw[128:132])
self.has_exth = bool(self.exth_flags & 0x40) self.has_exth = bool(self.exth_flags & 0x40)
self.has_drm_data = self.length >= 174 and len(self.raw) >= 180 self.has_drm_data = self.length >= 174 and len(self.raw) >= 180
@ -352,7 +353,8 @@ class MOBIHeader(object): # {{{
ans.append('First Image index: %d'%self.first_image_index) ans.append('First Image index: %d'%self.first_image_index)
ans.append('Huffman record offset: %d'%self.huffman_record_offset) ans.append('Huffman record offset: %d'%self.huffman_record_offset)
ans.append('Huffman record count: %d'%self.huffman_record_count) ans.append('Huffman record count: %d'%self.huffman_record_count)
ans.append('Unknown2: %r'%self.unknown2) ans.append('DATP record offset: %r'%self.datp_record_offset)
ans.append('DATP record count: %r'%self.datp_record_count)
ans.append('EXTH flags: %s (%s)'%(bin(self.exth_flags)[2:], self.has_exth)) ans.append('EXTH flags: %s (%s)'%(bin(self.exth_flags)[2:], self.has_exth))
if self.has_drm_data: if self.has_drm_data:
ans.append('Unknown3: %r'%self.unknown3) ans.append('Unknown3: %r'%self.unknown3)
@ -920,7 +922,7 @@ class BinaryRecord(object): # {{{
self.raw = record.raw self.raw = record.raw
sig = self.raw[:4] sig = self.raw[:4]
name = '%06d'%idx name = '%06d'%idx
if sig in (b'FCIS', b'FLIS', b'SRCS'): if sig in (b'FCIS', b'FLIS', b'SRCS', b'DATP'):
name += '-' + sig.decode('ascii') name += '-' + sig.decode('ascii')
elif sig == b'\xe9\x8e\r\n': elif sig == b'\xe9\x8e\r\n':
name += '-' + 'EOF' name += '-' + 'EOF'
@ -1142,12 +1144,13 @@ class MOBIFile(object): # {{{
self.records.append(Record(section(i), self.record_headers[i])) self.records.append(Record(section(i), self.record_headers[i]))
self.mobi_header = MOBIHeader(self.records[0]) self.mobi_header = MOBIHeader(self.records[0])
self.huffman_record_nums = []
if 'huff' in self.mobi_header.compression.lower(): if 'huff' in self.mobi_header.compression.lower():
huffrecs = [self.records[r].raw for r in self.huffman_record_nums = list(xrange(self.mobi_header.huffman_record_offset,
xrange(self.mobi_header.huffman_record_offset,
self.mobi_header.huffman_record_offset + self.mobi_header.huffman_record_offset +
self.mobi_header.huffman_record_count)] self.mobi_header.huffman_record_count))
huffrecs = [self.records[r].raw for r in self.huffman_record_nums]
from calibre.ebooks.mobi.huffcdic import HuffReader from calibre.ebooks.mobi.huffcdic import HuffReader
huffs = HuffReader(huffrecs) huffs = HuffReader(huffrecs)
decompress = lambda x: huffs.decompress([x]) decompress = lambda x: huffs.decompress([x])
@ -1181,7 +1184,7 @@ class MOBIFile(object): # {{{
min(len(self.records), ntr+1))] min(len(self.records), ntr+1))]
self.image_records, self.binary_records = [], [] self.image_records, self.binary_records = [], []
for i in xrange(fntbr, len(self.records)): for i in xrange(fntbr, len(self.records)):
if i in self.indexing_record_nums: if i in self.indexing_record_nums or i in self.huffman_record_nums:
continue continue
r = self.records[i] r = self.records[i]
fmt = None fmt = None