%PDF- %PDF-
| Direktori : /usr/lib/calibre/calibre/ebooks/pdb/ereader/ |
| Current File : //usr/lib/calibre/calibre/ebooks/pdb/ereader/inspector.py |
'''
Inspect the header of ereader files. This is primarily used for debugging.
'''
__license__ = 'GPL v3'
__copyright__ = '2009, John Schember <john@nachtimwald.com>'
__docformat__ = 'restructuredtext en'
import struct
import sys
from calibre.ebooks.pdb.ereader import EreaderError
from calibre.ebooks.pdb.header import PdbHeaderReader
def ereader_header_info(header):
h0 = header.section_data(0)
print('Header Size: %s' % len(h0))
if len(h0) == 132:
print('Header Type: Dropbook compatible')
print('')
ereader_header_info132(h0)
elif len(h0) == 202:
print('Header Type: Makebook compatible')
print('')
ereader_header_info202(h0)
else:
raise EreaderError('Size mismatch. eReader header record size %i KB is not supported.' % len(h0))
def pdb_header_info(header):
print('PDB Header Info:')
print('')
print('Identity: %s' % header.ident)
print('Total Sections: %s' % header.num_sections)
print('Title: %s' % header.title)
print('')
def ereader_header_info132(h0):
print('Ereader Record 0 (Header) Info:')
print('')
print('0-2 Version: %i' % struct.unpack('>H', h0[0:2])[0])
print('2-4: %i' % struct.unpack('>H', h0[2:4])[0])
print('4-6: %i' % struct.unpack('>H', h0[4:6])[0])
print('6-8 Codepage: %i' % struct.unpack('>H', h0[6:8])[0])
print('8-10: %i' % struct.unpack('>H', h0[8:10])[0])
print('10-12: %i' % struct.unpack('>H', h0[10:12])[0])
print('12-14 Non-Text offset: %i' % struct.unpack('>H', h0[12:14])[0])
print('14-16: %i' % struct.unpack('>H', h0[14:16])[0])
print('16-18: %i' % struct.unpack('>H', h0[16:18])[0])
print('18-20: %i' % struct.unpack('>H', h0[18:20])[0])
print('20-22 Image Count: %i' % struct.unpack('>H', h0[20:22])[0])
print('22-24: %i' % struct.unpack('>H', h0[22:24])[0])
print('24-26 Has Metadata?: %i' % struct.unpack('>H', h0[24:26])[0])
print('26-28: %i' % struct.unpack('>H', h0[26:28])[0])
print('28-30 Footnote Count: %i' % struct.unpack('>H', h0[28:30])[0])
print('30-32 Sidebar Count: %i' % struct.unpack('>H', h0[30:32])[0])
print('32-34 Bookmark Offset: %i' % struct.unpack('>H', h0[32:34])[0])
print('34-36 MAGIC: %i' % struct.unpack('>H', h0[34:36])[0])
print('36-38: %i' % struct.unpack('>H', h0[36:38])[0])
print('38-40: %i' % struct.unpack('>H', h0[38:40])[0])
print('40-42 Image Data Offset: %i' % struct.unpack('>H', h0[40:42])[0])
print('42-44: %i' % struct.unpack('>H', h0[42:44])[0])
print('44-46 Metadata Offset: %i' % struct.unpack('>H', h0[44:46])[0])
print('46-48: %i' % struct.unpack('>H', h0[46:48])[0])
print('48-50 Footnote Offset: %i' % struct.unpack('>H', h0[48:50])[0])
print('50-52 Sidebar Offset: %i' % struct.unpack('>H', h0[50:52])[0])
print('52-54 Last Data Offset: %i' % struct.unpack('>H', h0[52:54])[0])
for i in range(54, 131, 2):
print('%i-%i: %i' % (i, i+2, struct.unpack('>H', h0[i:i+2])[0]))
print('')
def ereader_header_info202(h0):
print('Ereader Record 0 (Header) Info:')
print('')
print('0-2 Version: %i' % struct.unpack('>H', h0[0:2])[0])
print('2-4 Garbage: %i' % struct.unpack('>H', h0[2:4])[0])
print('4-6 Garbage: %i' % struct.unpack('>H', h0[4:6])[0])
print('6-8 Garbage: %i' % struct.unpack('>H', h0[6:8])[0])
print('8-10 Non-Text Offset: %i' % struct.unpack('>H', h0[8:10])[0])
print('10-12: %i' % struct.unpack('>H', h0[10:12])[0])
print('12-14: %i' % struct.unpack('>H', h0[12:14])[0])
print('14-16 Garbage: %i' % struct.unpack('>H', h0[14:16])[0])
print('16-18 Garbage: %i' % struct.unpack('>H', h0[16:18])[0])
print('18-20 Garbage: %i' % struct.unpack('>H', h0[18:20])[0])
print('20-22 Garbage: %i' % struct.unpack('>H', h0[20:22])[0])
print('22-24 Garbage: %i' % struct.unpack('>H', h0[22:24])[0])
print('24-26: %i' % struct.unpack('>H', h0[24:26])[0])
print('26-28: %i' % struct.unpack('>H', h0[26:28])[0])
for i in range(28, 98, 2):
print('%i-%i Garbage: %i' % (i, i+2, struct.unpack('>H', h0[i:i+2])[0]))
print('98-100: %i' % struct.unpack('>H', h0[98:100])[0])
for i in range(100, 110, 2):
print('%i-%i Garbage: %i' % (i, i+2, struct.unpack('>H', h0[i:i+2])[0]))
print('110-112: %i' % struct.unpack('>H', h0[110:112])[0])
print('112-114: %i' % struct.unpack('>H', h0[112:114])[0])
print('114-116 Garbage: %i' % struct.unpack('>H', h0[114:116])[0])
for i in range(116, 202, 2):
print('%i-%i: %i' % (i, i+2, struct.unpack('>H', h0[i:i+2])[0]))
print('')
print('* Garbage: Random values.')
print('')
def section_lengths(header):
print('Section Sizes')
print('')
for i in range(0, header.section_count()):
size = len(header.section_data(i))
if size > 65505:
message = '<--- Over!'
else:
message = ''
print('Section %i: %i %s' % (i, size, message))
def main(args=sys.argv):
if len(args) < 2:
print('Error: requires input file.')
return 1
f = open(sys.argv[1], 'rb')
pheader = PdbHeaderReader(f)
pdb_header_info(pheader)
ereader_header_info(pheader)
section_lengths(pheader)
return 0
if __name__ == '__main__':
sys.exit(main())