kaitai py

This commit is contained in:
Nathan Rashleigh committed 2026-05-26 16:27:47 +10:00
1 parent 6a32066069
commit 32adb5ddac
16 files changed
+3969 -82

No files matched your search

+57
View File
@@ -0,0 +1,57 @@
"""Parse two .pdb files with the kaitai schema and summarise differences."""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent / "src"))
from io import BytesIO
from kaitaistruct import KaitaiStream
from kaitai.rekordbox_pdb import RekordboxPdb
PAGE_TYPE_NAMES = {t.value: t.name for t in RekordboxPdb.PageType}
def summarise(path: Path):
data = path.read_bytes()
pdb = RekordboxPdb(is_ext=False, _io=KaitaiStream(BytesIO(data)))
print(f"\n=== {path} ({path.stat().st_size} bytes) ===")
print(f"page_size={pdb.len_page} num_tables={pdb.num_tables} next_unused_page={pdb.next_unused_page} sequence={pdb.sequence}")
for tbl in pdb.tables:
ptype = PAGE_TYPE_NAMES.get(tbl.type.value, str(tbl.type))
page_count = 0
row_count = 0
err = None
try:
ref = tbl.first_page
while True:
page = ref.body
page_count += 1
if page.is_data_page:
for rg in page.row_groups:
for rpw in rg.rows:
if rpw.present:
row_count += 1
if ref.index == tbl.last_page.index:
break
ref = page.next_page
if page_count > 5000:
break
except Exception as e:
err = f"{type(e).__name__}: {e}"
line = f" {ptype:24s} first={tbl.first_page.index:>4} last={tbl.last_page.index:>4} pages={page_count:>3} rows={row_count}"
if err:
line += f" ERR={err}"
print(line)
return pdb
def main():
base = Path(__file__).parent
ref = base / "data/MAPLE/PIONEER/rekordbox/export.pdb"
ours = base / "data/usb/PIONEER/rekordbox/export.pdb"
summarise(ref)
summarise(ours)
if __name__ == "__main__":
main()