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:
10
bnk.py
10
bnk.py
@@ -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()
|
||||||
|
|||||||
10
extract.py
10
extract.py
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|||||||
18
wwise.py
18
wwise.py
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user