%PDF- %PDF-
Direktori : /lib/calibre/calibre/ebooks/mobi/debug/ |
Current File : //lib/calibre/calibre/ebooks/mobi/debug/containers.py |
#!/usr/bin/env python3 __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>' from struct import unpack_from from calibre.ebooks.mobi.debug.headers import EXTHHeader class ContainerHeader: def __init__(self, data): self.ident = data[:4] self.record_size, self.type, self.count, self.encoding = unpack_from(b'>IHHI', data, 4) self.encoding = { 1252 : 'cp1252', 65001: 'utf-8', }.get(self.encoding, repr(self.encoding)) rest = list(unpack_from(b'>IIIIIIII', data, 16)) self.num_of_resource_records = rest[2] self.num_of_non_dummy_resource_records = rest[3] self.offset_to_href_record = rest[4] self.unknowns1 = rest[:2] self.unknowns2 = rest[5] self.header_length = rest[6] self.title_length = rest[7] self.resources = [] self.hrefs = [] if data[48:52] == b'EXTH': self.exth = EXTHHeader(data[48:]) self.title = data[48 + self.exth.length:][:self.title_length].decode(self.encoding) self.is_image_container = self.exth[539] == 'application/image' else: self.exth = ' No EXTH header present ' self.title = '' self.is_image_container = False self.bytes_after_exth = data[self.header_length + self.title_length:] self.null_bytes_after_exth = len(self.bytes_after_exth) - len(self.bytes_after_exth.replace(b'\0', b'')) def add_hrefs(self, data): # kindlegen inserts a trailing | after the last href self.hrefs = list(filter(None, data.decode('utf-8').split('|'))) def __str__(self): ans = [('*'*10) + ' Container Header ' + ('*'*10)] a = ans.append a('Record size: %d' % self.record_size) a('Type: %d' % self.type) a('Total number of records in this container: %d' % self.count) a('Encoding: %s' % self.encoding) a('Unknowns1: %s' % self.unknowns1) a('Num of resource records: %d' % self.num_of_resource_records) a('Num of non-dummy resource records: %d' % self.num_of_non_dummy_resource_records) a('Offset to href record: %d' % self.offset_to_href_record) a('Unknowns2: %s' % self.unknowns2) a('Header length: %d' % self.header_length) a('Title Length: %s' % self.title_length) a('hrefs: %s' % self.hrefs) a('Null bytes after EXTH: %d' % self.null_bytes_after_exth) if len(self.bytes_after_exth) != self.null_bytes_after_exth: a('Non-null bytes present after EXTH header!!!!') return '\n'.join(ans) + '\n\n' + str(self.exth) + '\n\n' + ('Title: %s' % self.title)