diff --git a/legendary/models/json_manifest.py b/legendary/models/json_manifest.py index 54ad2e3..e43ad75 100644 --- a/legendary/models/json_manifest.py +++ b/legendary/models/json_manifest.py @@ -157,15 +157,18 @@ class JSONFML(FML): _fm.chunk_parts = [] _fm.install_tags = _fmj.pop('InstallTags', list()) + _offset = 0 for _cpj in _fmj.pop('FileChunkParts'): _cp = ChunkPart() _cp.guid = guid_from_json(_cpj.pop('Guid')) _cp.offset = blob_to_num(_cpj.pop('Offset')) _cp.size = blob_to_num(_cpj.pop('Size')) + _cp.file_offset = _offset _fm.file_size += _cp.size if _cpj: print(f'Non-read ChunkPart keys: {_cpj.keys()}') _fm.chunk_parts.append(_cp) + _offset += _cp.size if _fmj: print(f'Non-read FileManifest keys: {_fmj.keys()}') diff --git a/legendary/models/manifest.py b/legendary/models/manifest.py index 8622f18..c66b9cb 100644 --- a/legendary/models/manifest.py +++ b/legendary/models/manifest.py @@ -507,13 +507,20 @@ class FML: # Each file is made up of "Chunk Parts" that can be spread across the "chunk stream" for fm in _fml.elements: _elem = struct.unpack(' 0: + logger.warning(f'Did not read {diff} bytes from chunk part!') + bio.seek(diff) # we have to calculate the actual file size ourselves for fm in _fml.elements: @@ -601,10 +608,11 @@ class FileManifest: class ChunkPart: - def __init__(self, guid=None, offset=0, size=0): + def __init__(self, guid=None, offset=0, size=0, file_offset=0): self.guid = guid self.offset = offset self.size = size + self.file_offset = file_offset # caches for things that are "expensive" to compute self._guid_str = None self._guid_num = None @@ -623,8 +631,8 @@ class ChunkPart: def __repr__(self): guid_readable = '-'.join('{:08x}'.format(g) for g in self.guid) - return ''.format( - guid_readable, self.offset, self.size) + return ''.format( + guid_readable, self.offset, self.size, self.file_offset) class CustomFields: diff --git a/legendary/utils/savegame_helper.py b/legendary/utils/savegame_helper.py index 48f4a8f..d7b36e8 100644 --- a/legendary/utils/savegame_helper.py +++ b/legendary/utils/savegame_helper.py @@ -123,7 +123,8 @@ class SaveGameHelper: # create chunk part and write it to chunk buffer cp = ChunkPart(guid=cur_chunk.guid, offset=cur_buffer.tell(), - size=min(remaining, 1024 * 1024 - cur_buffer.tell())) + size=min(remaining, 1024 * 1024 - cur_buffer.tell()), + file_offset=cf.tell()) _tmp = cf.read(cp.size) if not _tmp: self.log.warning(f'Got EOF for "{f.filename}" with {remaining} bytes remaining! '