def get_file_content(self, meta): if not isinstance(meta, Metadata): raise ArkError("Expected Metadata instance, not %s" % meta.__class__.__name__) self._file.seek(meta.file_location, os.SEEK_SET) read_size = meta.size data = read_or_raise(self._file, read_size) if meta.encrypted_nbytes: data = xxtea.decrypt(data, self.passwd) if meta.compressed_size != meta.original_filesize: data = zlib.decompress(data) return data[:meta.original_filesize]
def _get_metadata(self): self._file.seek(self.metadata_offset, os.SEEK_SET) size = self.file_count * ArkManager.METADATA_SIZE if size & 3: size &= ~3 size += 4 data = read_or_raise(self._file, size) data = xxtea.decrypt(data, self.passwd) try: self.metadatas = [Metadata(data[i:i + ArkManager.METADATA_SIZE]) for i in range(0, size, ArkManager.METADATA_SIZE)] except: raise ArkError("Unable to decrypt metadatas, bad password or corrupted file")