kaitai py
This commit is contained in:
1 parent
6a32066069
commit
32adb5ddac
16 files changed
+3969
-82
No files matched your search
@@ -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()
|
||||
Reference in new issue
Block a user