This commit is contained in:
Nathan Rashleigh committed 2026-05-26 18:14:46 +10:00
1 parent 1e49010aa9
commit 6a6553077b
11 files changed
+1315 -32

No files matched your search

+97 -2
View File
@@ -355,6 +355,8 @@ types:
'page_type::history_playlists': history_playlist_row
'page_type::history_entries': history_entry_row
'page_type::tracks': track_row
'page_type::browse_filter_index': browse_filter_index_row
'page_type::browse_menu': browse_menu_row
doc: |
The actual content of the row, as long as it is present.
-webide-parse-mode: eager
@@ -605,6 +607,78 @@ types:
doc: |
The variable-length string naming the playlist.
browse_filter_index_row:
doc: |
A row in the `browse_filter_index` (was `unknown_17`) table. Lists the columns
that appear in the player's "Filter by ->" sidebar, in display order. The
reverse-engineered semantics: each row enumerates one filterable column. The
first group (`d == 0`) has 12 rows that look like type/icon descriptors; the
second group (`d == 1..10`) defines the navigation entries with `d` as the
sort position. The 22 column ids that appear here are exactly the
"filterable" subset of the 27 columns -- CUE, COMMENTS, DJ PLAY COUNT,
DEFAULT, ALPHABET do not appear. Verified byte-for-byte identical across
multiple working rekordbox exports.
seq:
- id: column_id
type: u2
doc: |
The column this row references; corresponds to `id` in the `columns` table.
- id: secondary_column
type: u2
doc: |
A second column id whose role is not fully nailed down. For rows in the
`d == 0` group it usually equals `column_id + 1`; for the navigation
group it varies. Likely a secondary sort key or an internal ID-lookup
target rather than something rendered to the user (the KEY filter does
not show CUEs even though `secondary_column == CUE` here).
- id: filter_type
type: u2
doc: |
Filter kind code. Observed values: 0x163 (=355) for textual filters,
0x104-0x106 (=260-262) for numeric/enum filters, 0x63 (=99) for
non-leaf navigation entries, 0x263 (=611) for the MATCHING entry,
0x01-0x03 for the ARTIST/ALBUM/TRACK leaf entries.
- id: sort_index
type: u2
doc: |
Zero for the first group, otherwise 1..10 giving the display order of
this row in the top-level filter list (1 = first, 10 = last).
browse_menu_row:
doc: |
A row in the `browse_menu` (was `unknown_18`) table. Together with
`browse_filter_index`, this drives the player's top-level browse navigation.
Semantic model: `display_column` is the column shown in the menu;
`sort_column` is the column used to sort/key it. When the two are equal the
entry opens a drilldown of that column's distinct values (e.g.
`(ARTIST, ARTIST)` -> list of artists). When they differ the entry opens a
flat list of `display_column` rows sorted by `sort_column` (e.g.
`(BPM, TRACK)` -> tracks sorted by BPM). Verified content is identical
across all observed working exports.
seq:
- id: sort_column
type: u2
doc: |
The column used to order the list shown by this menu entry.
- id: display_column
type: u2
doc: |
The column whose rows the entry lists. If `display_column == sort_column`,
you get a drilldown of that column's distinct values; otherwise a flat
list ordered by `sort_column`.
- id: flags
type: u2
doc: |
Two packed bytes. Low byte is non-zero only for the "tracks sorted by
BPM" row (=2, possibly a rendering hint). High byte (0x01..0x07) gives
the display order of the top-level entries (1=DEFAULT, 2=ALPHABET,
3=ARTIST, 4=ALBUM, 5=tracks-by-BPM, 6=BPM-by-rating, 7=cues-by-key).
A value of 1 marks the row as a secondary sort pair rather than a
top-level menu item.
- id: reserved
type: u2
doc: Always zero in observed exports.
history_entry_row:
doc: |
A row that associates a track with a position in a history playlist.
@@ -1138,9 +1212,30 @@ enums:
doc: |
TODO figure out and explain
17:
id: unknown_17
id: browse_filter_index
doc: |
Drives the player's "Filter by ->" sidebar. Each row is four little-endian u2s
`(a, b, c, d)` -- see `browse_filter_index_row` -- where `a` is the column the
menu item shows, `d` is its sort order in the filter list, and `c` is a type
code (0x163/0x104/0x105/0x106 for the various filter kinds). Exactly the
columns not in this table are the "non-filterable" ones (CUE, COMMENTS,
DJ PLAY COUNT, DEFAULT, ALPHABET); 22 of the 27 column ids appear here.
Verified content is identical across multiple working exports, so this is
effectively a fixed table rather than per-library content. Was `unknown_17`.
18:
id: unknown_18
id: browse_menu
doc: |
Drives the player's top-level browse menu. Each row is four little-endian u2s
`(a, b, c, d)` -- see `browse_menu_row` -- where `b` is the column the menu
entry *displays* and `a` is the column it *sorts by*. When `a == b` the entry
opens a drilldown of that column's distinct values (e.g. ARTIST -> list of
artists). When `a != b` the entry opens a flat list of `b` rows sorted by
`a` (e.g. (BPM, TRACK) -> tracks sorted by BPM). Rows split into two groups:
rows where `c == 1` are secondary sort pairs (10 of them); rows where `c`
is `(0x100 * n)` define the top-level menu items with `n` as the display
position (DEFAULT, ALPHABET, ARTIST, ALBUM, "tracks sorted by BPM",
"BPM by rating", "cues by key"). Verified content is identical across all
observed working exports. Was `unknown_18`.
19:
id: history
doc: |