1
0
mirror of https://github.com/Escartem/AnimeWwise.git synced 2026-06-04 23:40:25 +08:00

better error handling

This commit is contained in:
Escartem
2025-01-07 14:42:02 +01:00
parent 982bf81c27
commit f28afbb87c
5 changed files with 27 additions and 16 deletions

10
bnk.py
View File

@@ -2,24 +2,27 @@
import io import io
from filereader import FileReader from filereader import FileReader
def bnk2wem(data): def bnk2wem(data, name):
# gets raw data from object # gets raw data from object
reader = FileReader(io.BytesIO(data), "little") reader = FileReader(io.BytesIO(data), "little", name=name)
bkhd_signature = reader.ReadBytes(4) bkhd_signature = reader.ReadBytes(4)
if bkhd_signature != b"\x42\x4B\x48\x44": if bkhd_signature != b"\x42\x4B\x48\x44":
raise Exception("not a valid bnk") print(f"[WARNING] invalid bkhd signature at {reader.GetName()}")
return []
bkhd_size = reader.ReadUInt32() bkhd_size = reader.ReadUInt32()
reader.ReadBytes(bkhd_size) reader.ReadBytes(bkhd_size)
if reader.GetBufferPos() == reader.GetStreamLength(): if reader.GetBufferPos() == reader.GetStreamLength():
print(f"[WARNING] empty bnk file at {reader.GetName()}")
return [] # empty bnk return [] # empty bnk
didx_signature = reader.ReadBytes(4) didx_signature = reader.ReadBytes(4)
if didx_signature != b"\x44\x49\x44\x58": if didx_signature != b"\x44\x49\x44\x58":
print(f"[WARNING] invalid didx signature at {reader.GetName()}")
return [] # invalid index signature (hirc block instead ?) return [] # invalid index signature (hirc block instead ?)
didx_size = reader.ReadUInt32() didx_size = reader.ReadUInt32()
@@ -35,6 +38,7 @@ def bnk2wem(data):
data_signature = reader.ReadBytes(4) data_signature = reader.ReadBytes(4)
if data_signature != b"\x44\x41\x54\x41": if data_signature != b"\x44\x41\x54\x41":
print(f"[WARNING] invalid data signature at {reader.GetName()}")
return [] # invalid data signature (missing sector ?) return [] # invalid data signature (missing sector ?)
data_size = reader.ReadUInt32() data_size = reader.ReadUInt32()

View File

@@ -11,7 +11,12 @@ from filereader import FileReader
cwd = os.getcwd() cwd = os.getcwd()
path = lambda *args: os.path.join(*args) path = lambda *args: os.path.join(*args)
call = lambda args: subprocess.call(args, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
def call(args):
try:
subprocess.call(args, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
except Exception as e:
print(f"[WARNING] failed to extract, {e}")
class WwiseExtract: class WwiseExtract:
def __init__(self): def __init__(self):
@@ -170,6 +175,9 @@ class WwiseExtract:
wem_data = data[file_data["offset"]:file_data["offset"]+file_data["size"]] wem_data = data[file_data["offset"]:file_data["offset"]+file_data["size"]]
parsed_wem = wwise.parse_wwise(FileReader(io.BytesIO(wem_data), "little", name=f"{file[3]}:{file[0]}:{file[1]}")) parsed_wem = wwise.parse_wwise(FileReader(io.BytesIO(wem_data), "little", name=f"{file[3]}:{file[0]}:{file[1]}"))
if not parsed_wem:
continue
file_data["metadata"] = parsed_wem file_data["metadata"] = parsed_wem
if key is not None: if key is not None:

View File

@@ -11,8 +11,7 @@ class FileReader:
def __init__(self, file, endianness:str, name:str=None): def __init__(self, file, endianness:str, name:str=None):
self.stream = file self.stream = file
self.endianness = endianness self.endianness = endianness
if name: self.name = name
self.name = name
def _read(self, mode:str, bufferLength:int, endianness:str=None, pos:int=None) -> bytes: def _read(self, mode:str, bufferLength:int, endianness:str=None, pos:int=None) -> bytes:
# endianness override # endianness override

View File

@@ -220,7 +220,7 @@ def extract_sector(section_size, is_sounds, is_externals, ext, endianness, lang_
bnk_data = reader.ReadBytes(size) bnk_data = reader.ReadBytes(size)
reader.SetBufferPos(pos) reader.SetBufferPos(pos)
wems = bnk2wem(bnk_data) wems = bnk2wem(bnk_data, f"{filename}@{pos}.{size}")
for wem in wems: for wem in wems:
wwise_data.append([f"{os.path.basename(name).split('.')[0]}_{wem[0]}.wem", offset+wem[1], wem[2], filename]) wwise_data.append([f"{os.path.basename(name).split('.')[0]}_{wem[0]}.wem", offset+wem[1], wem[2], filename])

View File

@@ -23,7 +23,7 @@ def parse_wwise(reader):
if reader.GetStreamLength() == 0: if reader.GetStreamLength() == 0:
print(f"[WARNING] null stream size at {reader.GetName()}, unreadable block") print(f"[WARNING] null stream size at {reader.GetName()}, unreadable block")
return metadata return None
header = reader.ReadBytes(4) header = reader.ReadBytes(4)
@@ -34,7 +34,7 @@ def parse_wwise(reader):
reader.endianness = "little" reader.endianness = "little"
else: else:
print(f"[WARNING] invalid header {header} at {reader.GetName()}, assuming unreadable") print(f"[WARNING] invalid header {header} at {reader.GetName()}, assuming unreadable")
return metadata return None
# additional check # additional check
reader.SetBufferPos(0x08) reader.SetBufferPos(0x08)
@@ -42,7 +42,7 @@ def parse_wwise(reader):
if check != b"WAVE" and check != "XWMA": if check != b"WAVE" and check != "XWMA":
print(f"[WARNING] invalid check mark {check}, assuming unreadable") print(f"[WARNING] invalid check mark {check}, assuming unreadable")
return metadata return None
# read chunks # read chunks
reader.SetBufferPos(0x0C) reader.SetBufferPos(0x0C)
@@ -71,7 +71,7 @@ def parse_wwise(reader):
fmt_length = chunks["fmt"]["length"] fmt_length = chunks["fmt"]["length"]
if fmt_length < 0x10: if fmt_length < 0x10:
print(f"[WARNING] invalid fmt chunk length {fmt_length} at {reader.GetName()}, skipping") print(f"[WARNING] invalid fmt chunk length {fmt_length} at {reader.GetName()}, skipping")
return metadata return None
reader.SetBufferPos(chunks["fmt"]["offset"]) reader.SetBufferPos(chunks["fmt"]["offset"])
@@ -94,7 +94,7 @@ def parse_wwise(reader):
if metadata["format"] == 0x0166: if metadata["format"] == 0x0166:
print(f"[WARNING] XMA2WAVEFORMATEX in fmt at {reader.GetName()}") print(f"[WARNING] XMA2WAVEFORMATEX in fmt at {reader.GetName()}")
return metadata return None
# parse codec # parse codec
codecs = { codecs = {
@@ -122,7 +122,7 @@ def parse_wwise(reader):
if metadata["format"] not in codecs: if metadata["format"] not in codecs:
print(f'[WARNING] unknown codec {metadata["format"]} at {reader.GetName()}') print(f'[WARNING] unknown codec {metadata["format"]} at {reader.GetName()}')
return metadata return None
codec = codecs[metadata["format"]] codec = codecs[metadata["format"]]
@@ -153,18 +153,18 @@ def parse_wwise(reader):
elif metadata["codec"] == "VORBIS": elif metadata["codec"] == "VORBIS":
if (metadata["blockSize"] != 0 or metadata["bitsPerSample"] != 0): if (metadata["blockSize"] != 0 or metadata["bitsPerSample"] != 0):
print(f"[WARNING] worbis type at {reader.GetName()}, skipping") print(f"[WARNING] worbis type at {reader.GetName()}, skipping")
return metadata return None
if "vorb" in chunks: if "vorb" in chunks:
# vorb chunk only in wwise earlier to 2012, therefore impossible for mihoyo games # vorb chunk only in wwise earlier to 2012, therefore impossible for mihoyo games
print(f"[WARNING] found vorb chunk at {reader.GetName()}, is this the correct game ?") print(f"[WARNING] found vorb chunk at {reader.GetName()}, is this the correct game ?")
return metadata return None
extra_offset = chunks["fmt"]["offset"] + 0x18 extra_offset = chunks["fmt"]["offset"] + 0x18
if metadata["extraSize"] != 0x30: if metadata["extraSize"] != 0x30:
print(f"[WARNING] unknown extra wwise size at {reader.GetName()}, skipping") print(f"[WARNING] unknown extra wwise size at {reader.GetName()}, skipping")
return metadata return None
data_offset = 0x10 data_offset = 0x10
blocks_offset = 0x28 blocks_offset = 0x28