81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
"""Build a maple export.pdb from the SAME tracks as the real rekordbox AceMo
|
|
export, so the two can be diffed and the maple pdb tested on a player against
|
|
the audio/USBANLZ already on the USB.
|
|
|
|
Reads metadata out of data/acemo/PIONEER/rekordbox/export.pdb (the real export)
|
|
and reconstructs an identical-content maple Database, then writes
|
|
captures/maple_acemo.pdb.
|
|
"""
|
|
import sys
|
|
from io import BytesIO
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(ROOT / "src"))
|
|
|
|
from kaitaistruct import KaitaiStream
|
|
from kaitai.rekordbox_pdb import RekordboxPdb
|
|
from maple.model import Album, Artist, Artwork, Database, Key, Track
|
|
from maple.pdb.writer import write_pdb
|
|
|
|
REAL = ROOT / "data/acemo/PIONEER/rekordbox/export.pdb"
|
|
OUT = ROOT / "captures/maple_acemo.pdb"
|
|
PT = {t.value: t.name for t in RekordboxPdb.PageType}
|
|
|
|
|
|
def _rows(tbl):
|
|
out, ref = [], tbl.first_page
|
|
while True:
|
|
pg = ref.body
|
|
if pg.is_data_page:
|
|
for rg in pg.row_groups:
|
|
for r in rg.rows:
|
|
if r.present:
|
|
out.append(r.body)
|
|
if ref.index == tbl.last_page.index:
|
|
break
|
|
ref = pg.next_page
|
|
return out
|
|
|
|
|
|
def _txt(v):
|
|
try:
|
|
return v.body.text
|
|
except Exception:
|
|
return ""
|
|
|
|
|
|
def main():
|
|
pdb = RekordboxPdb(is_ext=False, _io=KaitaiStream(BytesIO(REAL.read_bytes())))
|
|
by = {PT.get(t.type.value): _rows(t) for t in pdb.tables}
|
|
|
|
db = Database()
|
|
for a in by.get("artists", []):
|
|
db.artists.append(Artist(id=a.id, name=_txt(a.name)))
|
|
for a in by.get("albums", []):
|
|
db.albums.append(Album(id=a.id, name=_txt(a.name), artist_id=a.artist_id))
|
|
for k in by.get("keys", []):
|
|
db.keys.append(Key(id=k.id, name=_txt(k.name), id2=k.id2))
|
|
for a in by.get("artwork", []):
|
|
db.artwork.append(Artwork(id=a.id, path=_txt(a.path)))
|
|
for t in by.get("tracks", []):
|
|
db.tracks.append(Track(
|
|
id=t.id, title=_txt(t.title), artist_id=t.artist_id, album_id=t.album_id,
|
|
filename=_txt(t.filename), file_path=_txt(t.file_path), file_size=t.file_size,
|
|
sample_rate=t.sample_rate, sample_depth=t.sample_depth, bitrate=t.bitrate,
|
|
duration=t.duration, track_number=t.track_number, year=t.year,
|
|
disc_number=t.disc_number, tempo=t.tempo, comment=_txt(t.comment),
|
|
date_added=_txt(t.date_added), release_date=_txt(t.release_date),
|
|
mix_name=_txt(t.mix_name), analyze_path=_txt(t.analyze_path),
|
|
analyze_date=_txt(t.analyze_date), artwork_id=t.artwork_id, genre_id=t.genre_id))
|
|
|
|
write_pdb(db, OUT)
|
|
sz = OUT.stat().st_size
|
|
print(f"wrote {OUT} ({sz} bytes, page-mult={sz % 4096 == 0}) "
|
|
f"tracks={len(db.tracks)} artists={len(db.artists)} albums={len(db.albums)} "
|
|
f"keys={len(db.keys)} artwork={len(db.artwork)}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|