diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py index 711aef6586..4d149042cc 100644 --- a/src/calibre/ebooks/lit/reader.py +++ b/src/calibre/ebooks/lit/reader.py @@ -25,20 +25,6 @@ XHTML_DECL = """ "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 "" \ - % (self.name, self.section, self.offset, self.size) - - def __str__(self): - return repr(self) - def u32(bytes): return struct.unpack('' + self.path + return "ManifestItem(internal='%s', path='%s')" \ + % (repr(self.internal), repr(self.path)) def preserve(function): def wrapper(self, *args, **kwargs): @@ -382,6 +382,7 @@ class LitFile(object): return self._stream.read(16) return property(fget=fget) guid = guid() + def header(): @preserve @@ -403,6 +404,19 @@ class LitFile(object): self.read_secondary_header() 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 def read_secondary_header(self): self._stream.seek(self.hdr_len + self.num_pieces*self.PIECE_SIZE) @@ -462,7 +476,7 @@ class LitFile(object): self.piece4_guid = piece def read_directory(self, piece): - self.entries = [] + self.entries = {} if not piece.startswith('IFCM'): raise LitError('Header piece #1 is not main directory.') chunk_size, num_chunks = int32(piece[8:12]), int32(piece[24:28]) @@ -507,7 +521,7 @@ class LitFile(object): self.read_manifest(entry) elif name == '/meta': self.read_meta(entry) - self.entries.append(entry) + self.entries[name] = entry i += 1 if not hasattr(self, 'sections'): @@ -590,14 +604,17 @@ class LitFile(object): @preserve def read_image(self, internal_name): - cover_entry = None - for entry in self.entries: - if internal_name in entry.name: - cover_entry = entry - break + cover_entry = self.entries[internal_name] self._stream.seek(self.content_offset + cover_entry.offset) 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): try: litfile = LitFile(stream)