#!/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("