From 6e50a386ec18649b954da9c734c4e3bec44a7617 Mon Sep 17 00:00:00 2001 From: Artemis Tosini Date: Thu, 4 Apr 2024 06:05:35 +0000 Subject: [PATCH] wtf how does this work --- scripts/extract_ktsl2stbin_opus.py | 106 +++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100755 scripts/extract_ktsl2stbin_opus.py 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("