Update pzztool.py

This commit is contained in:
tmpz23 2021-11-22 23:09:53 +01:00 committed by GitHub
parent 0a890b6b50
commit 7fad884fc5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -21,13 +21,28 @@ BIT_COMPRESSION_FLAG = 0x40000000
FILE_LENGTH_MASK = 0x3FFFFFFF FILE_LENGTH_MASK = 0x3FFFFFFF
CHUNK_SIZE = 0x800 CHUNK_SIZE = 0x800
TPL_MAGIC_NUMBER = b"\x00\x20\xAF\x30" # http://virtualre.rf.gd/index.php/TPL_(Format_de_fichier) TPL_MAGIC_NUMBER = b"\x00\x20\xAF\x30" # http://virtualre.rf.gd/index.php/TPL_(Format_de_fichier)
CHD_MAGIC_NUMBER = b"Head"
BIN_HITS_MAGICNUMBER = b"STIH"
TSB_MAGIC_NUMBER = b"TSBD"
def get_file_path(file_content: bytes, path: Path):
def get_file_ext(file_content: bytes): if path.name[5:7] == "pl": # si c'est un plxxxx
if path.name[0:3] == "000":
return path.with_name(path.name + "data").with_suffix(".bin")
if path.name[0:3] == "002":
return path.with_name(path.name + "hit").with_suffix(".bin")
if path.name[0:3] == "003":
return path.with_name(path.name + "mot").with_suffix(".bin")
if file_content.startswith(TPL_MAGIC_NUMBER): if file_content.startswith(TPL_MAGIC_NUMBER):
return ".tpl" return path.with_suffix(".tpl")
if file_content.startswith(CHD_MAGIC_NUMBER):
return path.with_suffix(".chd")
if file_content.startswith(TSB_MAGIC_NUMBER):
return path.with_suffix(".tsb")
if file_content.startswith(BIN_HITS_MAGICNUMBER):
return path.with_suffix(".bin")
# Par défaut # Par défaut
return ".dat" return path.with_suffix(".dat")
# Non implémenté : pour supprimer le pad à la fin des fichiers unpack # Non implémenté : pour supprimer le pad à la fin des fichiers unpack
# Les fichiers sans pad se terminent éventuellement par des b"\x00" # Les fichiers sans pad se terminent éventuellement par des b"\x00"
@ -227,7 +242,7 @@ def pzz_unpack(pzz_path: Path, dest_folder: Path, auto_decompress: bool = False)
if not auto_decompress and compression_status != 'U': if not auto_decompress and compression_status != 'U':
file_path = file_path.with_suffix(".pzzp") file_path = file_path.with_suffix(".pzzp")
else: else:
file_path = file_path.with_suffix(get_file_ext(file_content)) file_path = get_file_path(file_content, file_path)
file_path.write_bytes(file_content) file_path.write_bytes(file_content)
@ -358,7 +373,7 @@ if __name__ == '__main__':
logging.warning(f"Ignored - {p_input} - bad extension - must be a pzzp") logging.warning(f"Ignored - {p_input} - bad extension - must be a pzzp")
else: else:
output_file_content = pzz_decompress(p_input.read_bytes()) output_file_content = pzz_decompress(p_input.read_bytes())
p_output = p_output.with_suffix(get_file_ext(output_file_content)) p_output = get_file_path(output_file_content, p_output)
logging.info(f"Decompressing {p_input} in {p_output}") logging.info(f"Decompressing {p_input} in {p_output}")
p_output.write_bytes(output_file_content) p_output.write_bytes(output_file_content)
elif args.batch_compress: elif args.batch_compress:
@ -384,7 +399,7 @@ if __name__ == '__main__':
continue continue
logging.info(f"Decompressing {filename}") logging.info(f"Decompressing {filename}")
uncompressed_content = pzz_decompress((p_input / filename).read_bytes()) uncompressed_content = pzz_decompress((p_input / filename).read_bytes())
uncompressed_path = p_output / Path(filename).with_suffix(get_file_ext(uncompressed_content)) uncompressed_path = get_file_path(uncompressed_content, p_output / Path(filename))
uncompressed_path.write_bytes(uncompressed_content) uncompressed_path.write_bytes(uncompressed_content)
elif args.pack: elif args.pack:
logging.info("### Pack") logging.info("### Pack")