mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Checkpoint for changing computers
This commit is contained in:
parent
76b3759947
commit
a48282500f
@ -25,20 +25,6 @@ XHTML_DECL = """<?xml version="1.0" encoding="UTF-8" ?>
|
|||||||
"http://openebook.org/dtds/oeb-1.0.1/oebdoc101.dtd">
|
"http://openebook.org/dtds/oeb-1.0.1/oebdoc101.dtd">
|
||||||
"""
|
"""
|
||||||
|
|
||||||
class DirectoryEntry(object):
|
|
||||||
def __init__(self, name, section, offset, size):
|
|
||||||
self.name = name
|
|
||||||
self.section = section
|
|
||||||
self.offset = offset
|
|
||||||
self.size = size
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<DirectoryEntry name='%s' section='%d' offset='%d' size='%d'>" \
|
|
||||||
% (self.name, self.section, self.offset, self.size)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return repr(self)
|
|
||||||
|
|
||||||
def u32(bytes):
|
def u32(bytes):
|
||||||
return struct.unpack('<L', bytes[:4])[0]
|
return struct.unpack('<L', bytes[:4])[0]
|
||||||
|
|
||||||
@ -302,6 +288,20 @@ class UnBinary(object):
|
|||||||
state = 'get attr'
|
state = 'get attr'
|
||||||
return index
|
return index
|
||||||
|
|
||||||
|
class DirectoryEntry(object):
|
||||||
|
def __init__(self, name, section, offset, size):
|
||||||
|
self.name = name
|
||||||
|
self.section = section
|
||||||
|
self.offset = offset
|
||||||
|
self.size = size
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "DirectoryEntry(name=%s, section=%d, offset=%d, size=%d)" \
|
||||||
|
% (repr(self.name), self.section, self.offset, self.size)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return repr(self)
|
||||||
|
|
||||||
class ManifestItem(object):
|
class ManifestItem(object):
|
||||||
def __init__(self, original, internal, mime_type, offset, root, state):
|
def __init__(self, original, internal, mime_type, offset, root, state):
|
||||||
self.original = original
|
self.original = original
|
||||||
@ -310,8 +310,7 @@ class ManifestItem(object):
|
|||||||
self.offset = offset
|
self.offset = offset
|
||||||
self.root = root
|
self.root = root
|
||||||
self.state = state
|
self.state = state
|
||||||
self.prefix = 'images' \
|
self.prefix = state if state in ('images', 'css') else ''
|
||||||
if state == 'images' else 'css' if state == 'css' else ''
|
|
||||||
self.prefix = self.prefix + os.sep if self.prefix else ''
|
self.prefix = self.prefix + os.sep if self.prefix else ''
|
||||||
self.path = self.prefix + self.original
|
self.path = self.prefix + self.original
|
||||||
|
|
||||||
@ -321,7 +320,8 @@ class ManifestItem(object):
|
|||||||
return self.internal == other
|
return self.internal == other
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return self.internal + u'->' + self.path
|
return "ManifestItem(internal='%s', path='%s')" \
|
||||||
|
% (repr(self.internal), repr(self.path))
|
||||||
|
|
||||||
def preserve(function):
|
def preserve(function):
|
||||||
def wrapper(self, *args, **kwargs):
|
def wrapper(self, *args, **kwargs):
|
||||||
@ -383,6 +383,7 @@ class LitFile(object):
|
|||||||
return property(fget=fget)
|
return property(fget=fget)
|
||||||
guid = guid()
|
guid = guid()
|
||||||
|
|
||||||
|
|
||||||
def header():
|
def header():
|
||||||
@preserve
|
@preserve
|
||||||
def fget(self):
|
def fget(self):
|
||||||
@ -403,6 +404,19 @@ class LitFile(object):
|
|||||||
self.read_secondary_header()
|
self.read_secondary_header()
|
||||||
self.read_header_pieces()
|
self.read_header_pieces()
|
||||||
|
|
||||||
|
@preserve
|
||||||
|
def __len__(self):
|
||||||
|
self._stream.seek(0, 2)
|
||||||
|
return self._stream.tell()
|
||||||
|
|
||||||
|
@preserve
|
||||||
|
def _read_raw(self, offset, size):
|
||||||
|
self._stream.seek(offset)
|
||||||
|
return self._stream.read(size)
|
||||||
|
|
||||||
|
def _read_content(self, offset, size):
|
||||||
|
return self._read_raw(self.content_offset + offset, size)
|
||||||
|
|
||||||
@preserve
|
@preserve
|
||||||
def read_secondary_header(self):
|
def read_secondary_header(self):
|
||||||
self._stream.seek(self.hdr_len + self.num_pieces*self.PIECE_SIZE)
|
self._stream.seek(self.hdr_len + self.num_pieces*self.PIECE_SIZE)
|
||||||
@ -462,7 +476,7 @@ class LitFile(object):
|
|||||||
self.piece4_guid = piece
|
self.piece4_guid = piece
|
||||||
|
|
||||||
def read_directory(self, piece):
|
def read_directory(self, piece):
|
||||||
self.entries = []
|
self.entries = {}
|
||||||
if not piece.startswith('IFCM'):
|
if not piece.startswith('IFCM'):
|
||||||
raise LitError('Header piece #1 is not main directory.')
|
raise LitError('Header piece #1 is not main directory.')
|
||||||
chunk_size, num_chunks = int32(piece[8:12]), int32(piece[24:28])
|
chunk_size, num_chunks = int32(piece[8:12]), int32(piece[24:28])
|
||||||
@ -507,7 +521,7 @@ class LitFile(object):
|
|||||||
self.read_manifest(entry)
|
self.read_manifest(entry)
|
||||||
elif name == '/meta':
|
elif name == '/meta':
|
||||||
self.read_meta(entry)
|
self.read_meta(entry)
|
||||||
self.entries.append(entry)
|
self.entries[name] = entry
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
if not hasattr(self, 'sections'):
|
if not hasattr(self, 'sections'):
|
||||||
@ -590,14 +604,17 @@ class LitFile(object):
|
|||||||
|
|
||||||
@preserve
|
@preserve
|
||||||
def read_image(self, internal_name):
|
def read_image(self, internal_name):
|
||||||
cover_entry = None
|
cover_entry = self.entries[internal_name]
|
||||||
for entry in self.entries:
|
|
||||||
if internal_name in entry.name:
|
|
||||||
cover_entry = entry
|
|
||||||
break
|
|
||||||
self._stream.seek(self.content_offset + cover_entry.offset)
|
self._stream.seek(self.content_offset + cover_entry.offset)
|
||||||
return self._stream.read(cover_entry.size)
|
return self._stream.read(cover_entry.size)
|
||||||
|
|
||||||
|
def get_file(self, name):
|
||||||
|
entry = self.entries[name]
|
||||||
|
if entry.section == 0:
|
||||||
|
return self._read_content(entry.offset, entry.size)
|
||||||
|
section = self.get_section(entry.section)
|
||||||
|
return section[entry.offset:entry.offset+entry.size]
|
||||||
|
|
||||||
def get_metadata(stream):
|
def get_metadata(stream):
|
||||||
try:
|
try:
|
||||||
litfile = LitFile(stream)
|
litfile = LitFile(stream)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user