diff --git a/scripts/extract_ktsl2stbin_opus.py b/scripts/extract_ktsl2stbin_opus.py new file mode 100755 index 0000000..324a567 --- /dev/null +++ b/scripts/extract_ktsl2stbin_opus.py @@ -0,0 +1,106 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i python3 -p python3 +import struct +import sys +import pathlib + + +def crc32ogg(seq): + crc = 0 + for b in seq: + crc ^= b << 24 + for _ in range(8): + crc = (crc << 1) ^ 0x104C11DB7 if crc & 0x80000000 else crc << 1 + return crc + + +def paginate(sequence: int, content: bytes): + # Version, flags, position, serial number, sequence number, checksum, segments, segment table + flags = 2 if sequence == 0 else 0 + page = bytearray( + b"OggS" + + struct.pack( + "I", ktss[offset : offset + 4]) + out.write(paginate(sequence, ktss[offset + 8 : offset + 8 + packet_len])) + + offset += packet_len + 8 + sequence += 1 + + +# i don't care about efficiency +data = open(sys.argv[1], "rb").read() +outdir = pathlib.Path(sys.argv[2]) + +if data[:4] != b"KTSR": + raise Exception("what are you doing") + +# there's some more stuff but i don't care, go straight to the entry +off = 0x40 +idx = 0 +while off < len(data): + + if data[off + 0x40 : off + 0x44] != b"KTSS": + raise Exception("oh no offset broken") + + (entry_size,) = struct.unpack("