pyrekordbox 0.2.0__py3-none-any.whl → 0.2.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. docs/Makefile +20 -0
  2. docs/make.bat +35 -0
  3. docs/source/_static/images/anlz_beat.svg +53 -0
  4. docs/source/_static/images/anlz_file.svg +204 -0
  5. docs/source/_static/images/anlz_pco2.svg +138 -0
  6. docs/source/_static/images/anlz_pcob.svg +148 -0
  7. docs/source/_static/images/anlz_pcp2.svg +398 -0
  8. docs/source/_static/images/anlz_pcpt.svg +263 -0
  9. docs/source/_static/images/anlz_ppth.svg +123 -0
  10. docs/source/_static/images/anlz_pqt2.svg +324 -0
  11. docs/source/_static/images/anlz_pqt2_2.svg +253 -0
  12. docs/source/_static/images/anlz_pqtz.svg +140 -0
  13. docs/source/_static/images/anlz_pssi.svg +192 -0
  14. docs/source/_static/images/anlz_pssi_entry.svg +191 -0
  15. docs/source/_static/images/anlz_pvbr.svg +125 -0
  16. docs/source/_static/images/anlz_pwav.svg +130 -0
  17. docs/source/_static/images/anlz_pwv3.svg +139 -0
  18. docs/source/_static/images/anlz_pwv4.svg +139 -0
  19. docs/source/_static/images/anlz_pwv5.svg +139 -0
  20. docs/source/_static/images/anlz_pwv5_entry.svg +100 -0
  21. docs/source/_static/images/anlz_pwv6.svg +130 -0
  22. docs/source/_static/images/anlz_pwv7.svg +139 -0
  23. docs/source/_static/images/anlz_pwvc.svg +125 -0
  24. docs/source/_static/images/anlz_tag.svg +110 -0
  25. docs/source/_static/logos/dark/logo_primary.svg +75 -0
  26. docs/source/_static/logos/light/logo_primary.svg +75 -0
  27. docs/source/_static/logos/mid/logo_primary.svg +75 -0
  28. docs/source/_templates/apidoc/module.rst_t +8 -0
  29. docs/source/_templates/apidoc/package.rst_t +57 -0
  30. docs/source/_templates/apidoc/toc.rst_t +7 -0
  31. docs/source/_templates/autosummary/class.rst +32 -0
  32. docs/source/_templates/autosummary/module.rst +55 -0
  33. docs/source/api.md +18 -0
  34. docs/source/conf.py +178 -0
  35. docs/source/development/changes.md +3 -0
  36. docs/source/development/contributing.md +3 -0
  37. docs/source/formats/anlz.md +634 -0
  38. docs/source/formats/db6.md +1233 -0
  39. docs/source/formats/mysetting.md +392 -0
  40. docs/source/formats/xml.md +376 -0
  41. docs/source/index.md +105 -0
  42. docs/source/installation.md +3 -0
  43. docs/source/quickstart.md +185 -0
  44. docs/source/requirements.txt +7 -0
  45. docs/source/tutorial/anlz.md +7 -0
  46. docs/source/tutorial/configuration.md +66 -0
  47. docs/source/tutorial/db6.md +179 -0
  48. docs/source/tutorial/index.md +20 -0
  49. docs/source/tutorial/mysetting.md +124 -0
  50. docs/source/tutorial/xml.md +140 -0
  51. pyrekordbox/__init__.py +1 -1
  52. pyrekordbox/__main__.py +16 -37
  53. pyrekordbox/_version.py +2 -2
  54. pyrekordbox/anlz/file.py +39 -0
  55. pyrekordbox/anlz/structs.py +3 -5
  56. pyrekordbox/config.py +71 -27
  57. pyrekordbox/db6/database.py +290 -61
  58. pyrekordbox/db6/registry.py +24 -0
  59. pyrekordbox/db6/tables.py +501 -340
  60. pyrekordbox/mysettings/file.py +0 -25
  61. pyrekordbox/utils.py +1 -1
  62. {pyrekordbox-0.2.0.dist-info → pyrekordbox-0.2.2.dist-info}/METADATA +42 -20
  63. pyrekordbox-0.2.2.dist-info/RECORD +80 -0
  64. {pyrekordbox-0.2.0.dist-info → pyrekordbox-0.2.2.dist-info}/top_level.txt +1 -0
  65. tests/test_config.py +175 -0
  66. tests/test_db6.py +95 -0
  67. pyrekordbox-0.2.0.dist-info/RECORD +0 -29
  68. {pyrekordbox-0.2.0.dist-info → pyrekordbox-0.2.2.dist-info}/LICENSE +0 -0
  69. {pyrekordbox-0.2.0.dist-info → pyrekordbox-0.2.2.dist-info}/WHEEL +0 -0
@@ -0,0 +1,1233 @@
1
+ (db6-format)=
2
+ # Rekordbox 6 Database Format
3
+
4
+ With Rekordbox 6 Pioneer switched from using a DeviceSQL database (`.edb`) to SQLite.
5
+ This is an [SQLite3] database encrypted with [SQLCipher4].
6
+
7
+ ## Encryption
8
+
9
+ The new SQLite database is encrypted which means it can't be used without
10
+ the encryption key. Pioneer did this because they prefer that no one outside of
11
+ Pioneer touches it (there is a forum post by Pulse).
12
+ Since your data is stored and used locally, we know that the key must be present
13
+ on our machine. Knowing the key must be local somewhere, gives good hope that you
14
+ can find it. It appears that the key is not license or machine dependent and all
15
+ databases are encrypted with the same key [^cite_ref6].
16
+
17
+ ## Database structure
18
+
19
+ The new SQLite database is clearly structured and easy to parse once it is unlocked.
20
+ Most tables in the database seem to have a few default columns used by Rekordbox
21
+ internally. The last columns of most tables usually are
22
+
23
+ ```{eval-rst}
24
+ .. list-table:: Default columns of database tables
25
+ :widths: 25 75
26
+ :header-rows: 1
27
+
28
+ * - Table Name
29
+ - Description
30
+ * - `UUID`
31
+ - Universally Unique Identifier
32
+ * - `rb_data_status`
33
+ - Unknown
34
+ * - `rb_local_data_status`
35
+ - Unknown
36
+ * - `rb_local_deleted`
37
+ - Unknown
38
+ * - `rb_local_synced`
39
+ - If the entry is synced with the cloud
40
+ * - `usn`
41
+ - Update sequence number
42
+ * - `rb_local_usn`
43
+ - Local update sequence number
44
+ * - `created_at`
45
+ - Creation time of the entry
46
+ * - `updated_at`
47
+ - Last update time of the entry
48
+ ```
49
+
50
+ If a table *does not* use these default columns it is noted in the description of the
51
+ table.
52
+
53
+ ### Collection
54
+
55
+ The main track data of the Rekordbox collection is stored in the `djmdContent` table.
56
+ Some tags are linked to other tables in the database via the `ID` column. These include
57
+
58
+ | Tag | ID | Table |
59
+ |----------|--------------|--------------|
60
+ | Album | `AlbumID` | `djmdAlbum` |
61
+ | Artist | `ArtistID` | `djmdArtist` |
62
+ | Composer | `ComposerID` | `djmdArtist` |
63
+ | Genre | `GenreID` | `djmdGenre` |
64
+ | Key | `KeyID` | `djmdKey` |
65
+ | Label | `LabelID` | `djmdLabel` |
66
+ | Remixer | `RemixerID` | `djmdArtist` |
67
+
68
+ ### Playlists and Histories
69
+
70
+ Playlist-like objects like Playlists and Histories are each stored in two tables,
71
+ `djmd<NAME>` and `djmdSong<NAME>`. Regular playlists, for example, are stored in the tables
72
+ `djmdPlaylist` and `djmdSongPlaylist`.
73
+
74
+ The first table contains the information about each playlist or playlist folder, similar
75
+ to the nodes of the Rekordbox XML format. Each entry contains a `ID`. The second table
76
+ contains the tracks which are contained in all the corresponding playlists. Each entry
77
+ contains a `<NAME>ID`, which links it to a playlist in the first table. The track
78
+ is linked to the `djmdContent` table via the `ContentID`.
79
+
80
+ ## Tables
81
+
82
+ ### djmdActiveCensor
83
+
84
+ This table stores the Active Censor data of Rekordbox. It contains information for
85
+ actively censoring explicit content of tracks in the Rekordbox collection.
86
+ Active Censor items behave like two cue points, between which an effect is applied to
87
+ the audio of a track. The table has the following columns:
88
+
89
+ ```{eval-rst}
90
+ .. list-table:: djmdActiveCensor columns
91
+ :widths: 25 75
92
+ :header-rows: 1
93
+
94
+ * - Table Name
95
+ - Description
96
+ * - `ID`
97
+ - The ID of the Active Censor entry
98
+ * - `ContentID`
99
+ - The ID of the corresponding track
100
+ * - `InMsec`
101
+ - The start time of the section in milli-seconds
102
+ * - `OutMsec`
103
+ - The end time of the section in milli-seconds
104
+ * - `Info`
105
+ -
106
+ * - `ParameterList`
107
+ -
108
+ * - `ContentUUID`
109
+ -
110
+
111
+ ```
112
+
113
+ ### djmdAlbum
114
+
115
+ This table stores the Album data of Rekordbox. Since multiple tracks can be in the
116
+ same album this data is stored in its own table. The table contains all albums found in
117
+ the collection.
118
+
119
+ ```{eval-rst}
120
+ .. list-table:: djmdAlbum columns
121
+ :widths: 25 100
122
+ :header-rows: 1
123
+
124
+ * - Table Name
125
+ - Description
126
+ * - `ID`
127
+ - The ID of the album.
128
+ * - `Name`
129
+ - The name of the album.
130
+ * - `AlbumArtistID`
131
+ - The ID of the album-artist (djmdArtist table)
132
+ * - `ImagePath`
133
+ - The path to the album artwork
134
+ * - `Compilation`
135
+ - Flag if the album is a compilation
136
+ * - `SearchStr`
137
+ - A string somehow used for searching (mostly None)
138
+
139
+ ```
140
+
141
+ ### djmdArtist
142
+
143
+ This table stores the Artist data of Rekordbox. Since multiple tracks can be made by
144
+ the same artist this data is stored in its own table. The table contains all artists
145
+ found in the collection.
146
+
147
+ ```{eval-rst}
148
+ .. list-table:: djmdArtist columns
149
+ :widths: 25 100
150
+ :header-rows: 1
151
+
152
+ * - Column Name
153
+ - Description
154
+ * - `ID`
155
+ - The ID of the artist.
156
+ * - `Name`
157
+ - The name of the artist.
158
+ * - `SearchStr`
159
+ - A string somehow used for searching (mostly None)
160
+
161
+
162
+ ```
163
+
164
+ ### djmdCategory
165
+
166
+ This table stores the Category data of Rekordbox.
167
+
168
+ ```{eval-rst}
169
+ .. list-table:: djmdCategory columns
170
+ :widths: 25 100
171
+ :header-rows: 1
172
+
173
+ * - Column Name
174
+ - Description
175
+ * - `ID`
176
+ - The ID of the category.
177
+ * - `MenuItemID`
178
+ -
179
+ * - `Seq`
180
+ -
181
+ * - `Disable`
182
+ -
183
+ * - `InfoOrder`
184
+ -
185
+
186
+ ```
187
+
188
+ ### djmdCloudProperty
189
+
190
+ This table contains no data and consists of reserved columns.
191
+
192
+ ### djmdColor
193
+
194
+ This table stores the Color data of Rekordbox. The table contains all colors used by
195
+ Rekordbox and for tagging tracks:
196
+
197
+ ```{eval-rst}
198
+ .. list-table:: djmdCategory columns
199
+ :widths: 25 100
200
+ :header-rows: 1
201
+
202
+ * - Column Name
203
+ - Description
204
+ * - `ID`
205
+ - The ID of the color
206
+ * - `ColorCode`
207
+ - Some code for the color
208
+ * - `SortKey`
209
+ - A key used for sorting colors
210
+ * - `Commnt`
211
+ - The name of the color
212
+
213
+ ```
214
+
215
+ ### djmdContent
216
+
217
+ This table stores the main track data of Rekordbox. The table contains most information
218
+ about each track in the collection. Some columns are linked to other tables by the
219
+ corresponding ID.
220
+
221
+ ```{eval-rst}
222
+ .. list-table:: djmdContent columns
223
+ :widths: 1 1 1
224
+ :header-rows: 1
225
+
226
+ * - Column Name
227
+ - Description
228
+ - Notes
229
+ * - `ID`
230
+ - The ID of the content
231
+ - referenced as `ContentID` in other tables
232
+ * - `FolderPath`
233
+ - The full path of the file
234
+ -
235
+ * - `FileNameL`
236
+ - The long file name
237
+ - This is the normal file name
238
+ * - `FileNameS`
239
+ - The short file name
240
+ - mostly empty
241
+ * - `Title`
242
+ - The title of the track
243
+ -
244
+ * - `ArtistID`
245
+ - The ID of the artist of the track
246
+ - Links to `ID` in the `djmdArtist` table
247
+ * - `AlbumID`
248
+ - The album of the track
249
+ - Links to `ID` in the `djmdAlbum` table
250
+ * - `GenreID`
251
+ - The genre of the track
252
+ - Links to `ID` in the `djmdGenre` table
253
+ * - `BPM`
254
+ - The average BPM of the track
255
+ - Unit: Second
256
+ * - `Length`
257
+ - The length of the track
258
+ - Unit: seconds
259
+ * - `TrackNo`
260
+ - Number of the track of the album
261
+ -
262
+ * - `BitRate`
263
+ - Encoding bit rate
264
+ - Unit: Kbps
265
+ * - `BitDepth`
266
+ - Encoding bit depth
267
+ - Unit: Bits
268
+ * - `Commnt`
269
+ - The comments of the track
270
+ -
271
+ * - `FileType`
272
+ - Type of audio file
273
+ - mp3= `0` / `1` , m4a= `4` , wav= `11` , aiff= `12`
274
+ * - `Rating`
275
+ - Rating of the track
276
+ -
277
+ * - `ReleaseYear`
278
+ - Year of release
279
+ -
280
+ * - `RemixerID`
281
+ - The remixer of the track
282
+ - Links to `ID` in the `djmdArtist` table
283
+ * - `LabelID`
284
+ - The record label
285
+ - Links to `ID` in the `djmdLabel` table
286
+ * - `OrgArtistID`
287
+ - The original artist (for remixes)
288
+ - Links to `ID` in the `djmdArtist` table
289
+ * - `KeyID`
290
+ - Tonality (Kind of musical key)
291
+ - Links to `ID` in the `djmdKey` table
292
+ * - `StockDate`
293
+ - ?
294
+ -
295
+ * - `ColorID`
296
+ - Colour for track grouping
297
+ - Links to `ID` in the `djmdColor` table
298
+ * - `DJPlayCount`
299
+ - Play count of the track
300
+ - Not sure if plays in Rekordbox count
301
+ * - `ImagePath`
302
+ - Path to the tracks album artwork
303
+ - The path is relative to the Rekordbox database root
304
+ * - `MasterDBID`
305
+ - The master-ID of the track
306
+ - Not sure whats the difference to `ID`
307
+ * - `MasterSongID`
308
+ - The master-song-ID of the track
309
+ - Not sure whats the difference to `ID` and `MasterDBID`
310
+ * - `AnalysisDataPath`
311
+ - Path to the tracks analysis files (ANLZ)
312
+ - The path is relative to the Rekordbox database root
313
+ * - `SearchStr`
314
+ - Some string used for searching?
315
+ -
316
+ * - `FileSize`
317
+ - The file size of the track
318
+ - Unit: Octet
319
+ * - `DiscNo`
320
+ - Number of the disc of the album
321
+ -
322
+ * - `ComposerID`
323
+ - The composer (or producer) of the track
324
+ - Links to `ID` in the `djmdArtist` table
325
+ * - `Subtitle`
326
+ - The track subtitles
327
+ -
328
+ * - `SampleRate`
329
+ - Frequency of sampling
330
+ - Unit: Hertz
331
+ * - `DisableQuantize`
332
+ - Individual quantize setting fro track
333
+ - If None the global setting is used
334
+ * - `Analysed`
335
+ - Some code how the trck is analyzed
336
+ - Guessing not analyzed= `0` , standard= `105` , advanced= `121`, locked = `233`
337
+ * - `ReleaseDate`
338
+ - Date of track release
339
+ - Format: yyyy-mm-dd; ex.: 2010-08-21
340
+ * - `DateCreated`
341
+ - Date of file creation
342
+ - Format: yyyy-mm-dd; ex.: 2010-08-21
343
+ * - `ContentLink`
344
+ - ?
345
+ -
346
+ * - `Tag`
347
+ - My tag value
348
+ -
349
+ * - `ModifiedByRBM`
350
+ - ?
351
+ -
352
+ * - `HotCueAutoLoad`
353
+ - Individual hot cue auto-load settin
354
+ - Either `'on'` or `'off'`
355
+ * - `DeliveryControl`
356
+ - ?
357
+ -
358
+ * - `DeliveryComment`
359
+ - ?
360
+ -
361
+ * - `CueUpdated`
362
+ - Maybe number of times cues where changed?
363
+ -
364
+ * - `AnalysisUpdated`
365
+ - Flag if track is analyzed in advanced mode
366
+ - advanced= `1`, normal= `0`
367
+ * - `TrackInfoUpdated`
368
+ - Maybe number of times cues where changed?
369
+ -
370
+ * - `Lyricist`
371
+ - The lyricist of the track
372
+ -
373
+ * - `ISRC`
374
+ - The ISRC code of the track
375
+ -
376
+ * - `SamplerTrackInfo`
377
+ - ?
378
+ -
379
+ * - `SamplerPlayOffset`
380
+ - ?
381
+ -
382
+ * - `SamplerGain`
383
+ - ?
384
+ -
385
+ * - `VideoAssociate`
386
+ - ?
387
+ -
388
+ * - `LyricStatus`
389
+ - ?
390
+ -
391
+ * - `ServiceID`
392
+ - ?
393
+ -
394
+ * - `OrgFolderPath`
395
+ - ?
396
+ - Mostly same as `FolderPath`
397
+ * - `Reserved1`
398
+ -
399
+ -
400
+ * - `Reserved2`
401
+ -
402
+ -
403
+ * - `Reserved3`
404
+ -
405
+ -
406
+ * - `Reserved4`
407
+ -
408
+ -
409
+ * - `ExtInfo`
410
+ - ?
411
+ -
412
+ * - `rb_file_id`
413
+ - The Rekordbox ID of the file
414
+ -
415
+ * - `DeviceID`
416
+ - ?
417
+ -
418
+ * - `rb_LocalFolderPath`
419
+ - ?
420
+ -
421
+ * - `SrcID`
422
+ - ?
423
+ -
424
+ * - `SrcTitle`
425
+ - ?
426
+ -
427
+ * - `SrcArtistName`
428
+ - ?
429
+ -
430
+ * - `SrcAlbumName`
431
+ - ?
432
+ -
433
+ * - `SrcLength`
434
+ - ?
435
+ -
436
+
437
+ ```
438
+
439
+ ### djmdCue
440
+
441
+ This table stores the cue points (memory and hotcues) of the tracks in Rekordbox.
442
+
443
+ ```{note}
444
+ Rekordbox internally represents time in "frames", each being 1/150th of a second (6.666ms).
445
+ The `InFrame` and `OutFrame` values use this unit of time. However, when a track is encoded with
446
+ variable bit-rate (VBR) or average bit-rate (ABR), the `InMpegFrame` and `OutMpegFrame` values
447
+ are filled out to assist with correctly seeking. Despite the names, these values are **not** the
448
+ frame indices within the MPEG file, but instead use an alternative timing scheme that is typically
449
+ around 1/75th of a second (13.333ms) per frame, i.e. about half the granularity of normal frames.
450
+ ```
451
+
452
+ ```{eval-rst}
453
+ .. list-table:: djmdCue columns
454
+ :widths: 1 1 1
455
+ :header-rows: 1
456
+
457
+ * - Column Name
458
+ - Description
459
+ - Notes
460
+ * - `ID`
461
+ - The ID of the cue point
462
+ -
463
+ * - `ContentID`
464
+ - The corresponding track of the cue
465
+ - Links to `ID` in the `djmdContent` table
466
+ * - `InMsec`
467
+ - Start time of the cue point
468
+ - Unit: Millisecond
469
+ * - `InFrame`
470
+ - The frame number of the start time
471
+ - One frame is 1/150th of a second
472
+ * - `InMpegFrame`
473
+ - The MPEG frame number of the start time
474
+ - See note above. `0` if not a VBR/ABR MPEG file.
475
+ * - `InMpegAbs`
476
+ - The offset (bytes) in the file where the starting frame appears.
477
+ - `0` if not a VBR/ABR MPEG file.
478
+ * - `OutMsec`
479
+ - End time of the cue point (for loops)
480
+ - Unit: Millisecond, `-1` if not a loop
481
+ * - `OutFrame`
482
+ - The frame number of the end time (for loops)
483
+ - One frame is 1/150th of a second. `0` if not a loop
484
+ * - `OutMpegFrame`
485
+ - The MPEG frame number of the end time (for loops)
486
+ - See note above. `0` if not a loop or VBR/ABR MPEG file
487
+ * - `OutMpegAbs`
488
+ - The offset (bytes) in the file where the ending frame appears.
489
+ - `0` if not a loop or VBR/ABR MPEG file
490
+ * - `Kind`
491
+ - Type of cue point
492
+ - Cue= `0` , Fade-In= `1` , Fade-Out= `2` , Load= `3` , Loop= `4`
493
+ * - `Color`
494
+ - The color ID of the cue point
495
+ - `-1` if no color
496
+ * - `ColorTableIndex`
497
+ - ?
498
+ -
499
+ * - `ActiveLoop`
500
+ - ?
501
+ -
502
+ * - `Comment`
503
+ - Name of comment of cue point
504
+ -
505
+ * - `BeatLoopSize`
506
+ - ?
507
+ -
508
+ * - `CueMicrosec`
509
+ - ?
510
+ -
511
+ * - `InPointSeekInfo`
512
+ - ?
513
+ -
514
+ * - `OutPointSeekInfo`
515
+ - ?
516
+ -
517
+ * - `ContentUUID`
518
+ - The UUID of the track
519
+ - Links to `UUID` in `djmdContent` table
520
+
521
+ ```
522
+
523
+ ### djmdDevice
524
+
525
+ This table stores information about the device(s) where Rekordbox is installed.
526
+
527
+ ```{eval-rst}
528
+ .. list-table:: djmdDevice columns
529
+ :widths: 1 1 1
530
+ :header-rows: 1
531
+
532
+ * - Column Name
533
+ - Description
534
+ - Notes
535
+ * - `ID`
536
+ - The ID of the device
537
+ -
538
+ * - `MasterDBID`
539
+ - The ID of the `master.db` database
540
+ -
541
+ * - `Name`
542
+ - The name of the device
543
+ -
544
+
545
+ ```
546
+
547
+ ### djmdGenre
548
+
549
+ This table stores the genre data of Rekordbox. Since multiple tracks can be the same
550
+ genre data is stored in its own table. The table contains all genres found in the
551
+ collection.
552
+
553
+ ```{eval-rst}
554
+ .. list-table:: djmdDevice columns
555
+ :widths: 1 1 1
556
+ :header-rows: 1
557
+
558
+ * - Column Name
559
+ - Description
560
+ - Notes
561
+ * - `ID`
562
+ - The ID of the genre
563
+ -
564
+ * - `Name`
565
+ - The name of the genre
566
+ -
567
+
568
+ ```
569
+
570
+ ### djmdHistory
571
+
572
+ This table stores the history playlist data of Rekordbox. It does *not* store the
573
+ tracks in the history playlists. These are stored in the `djmdSongHistory` table.
574
+ The items in the table can either be a playlist folder or an actual playlist containing
575
+ tracks.
576
+
577
+ ```{eval-rst}
578
+ .. list-table:: djmdHistory columns
579
+ :widths: 1 1 1
580
+ :header-rows: 1
581
+
582
+ * - Column Name
583
+ - Description
584
+ - Notes
585
+ * - `ID`
586
+ - The ID of the history playlist
587
+ -
588
+ * - `Seq`
589
+ - The number of the the history playlist in the parent folder
590
+ -
591
+ * - `Name`
592
+ - The name of the history playlist
593
+ -
594
+ * - `Attribute`
595
+ - The attributes of the history playlist
596
+ -
597
+ * - `ParentID`
598
+ - The `ID` of the parent history playlist folder
599
+ -
600
+ * - `DateCreated`
601
+ - The date of creation
602
+ -
603
+
604
+ ```
605
+
606
+ ### djmdHotCueBanklist
607
+
608
+ This table stores the history the hot-cue bank list. It does *not* store the
609
+ actual hot-cues. These are stored in the `djmdSongHotCueBanklist` table.
610
+
611
+ ```{eval-rst}
612
+ .. list-table:: djmdHistory columns
613
+ :widths: 1 1 1
614
+ :header-rows: 1
615
+
616
+ * - Column Name
617
+ - Description
618
+ - Notes
619
+ * - `ID`
620
+ - The ID of the hot-cue bank list
621
+ -
622
+ * - `Seq`
623
+ - The number of the the hot-cue bank list in the parent folder
624
+ -
625
+ * - `Name`
626
+ - The name of the hot-cue bank list
627
+ -
628
+ * - `ImagePath`
629
+ - The path of the image of the hot-cue bank list
630
+ -
631
+ * - `Attribute`
632
+ - The attributes of the hot-cue bank list
633
+ -
634
+ * - `ParentID`
635
+ - The `ID` of the parent hot-cue bank list folder
636
+ -
637
+
638
+ ```
639
+
640
+ ### djmdKey
641
+
642
+ This table stores the musical key data of Rekordbox. Since multiple tracks can be
643
+ written in the same key the data is stored in its own table. The table contains all
644
+ keys found in the collection.
645
+
646
+ ```{eval-rst}
647
+ .. list-table:: djmdKey columns
648
+ :widths: 1 1 1
649
+ :header-rows: 1
650
+
651
+ * - Column Name
652
+ - Description
653
+ - Notes
654
+ * - `ID`
655
+ - The ID of the key
656
+ -
657
+ * - `ScaleName`
658
+ - The name of the key
659
+ -
660
+ * - `Seq`
661
+ - The number of the key when sorted
662
+ -
663
+
664
+ ```
665
+
666
+ ### djmdLabel
667
+
668
+ This table stores the label data of Rekordbox. Since multiple tracks can be
669
+ realeased on the same key the data is stored in its own table. The table contains all
670
+ labels found in the collection.
671
+
672
+ ```{eval-rst}
673
+ .. list-table:: djmdLabel columns
674
+ :widths: 1 1 1
675
+ :header-rows: 1
676
+
677
+ * - Column Name
678
+ - Description
679
+ - Notes
680
+ * - `ID`
681
+ - The ID of the label
682
+ -
683
+ * - `Name`
684
+ - The name of the label
685
+ -
686
+
687
+ ```
688
+
689
+ ### djmdMenuItems
690
+
691
+ This table stores the configurable menu items shown in the Rekordbox application.
692
+
693
+ ```{eval-rst}
694
+ .. list-table:: djmdDevice columns
695
+ :widths: 1 1 1
696
+ :header-rows: 1
697
+
698
+ * - Column Name
699
+ - Description
700
+ - Notes
701
+ * - `ID`
702
+ - The ID of the menu item
703
+ -
704
+ * - `Class`
705
+ - The class of the menu item
706
+ -
707
+ * - `Name`
708
+ - The name of the menu item
709
+ -
710
+
711
+
712
+ ```
713
+
714
+ ### djmdMixerParam
715
+
716
+ This table stores the mixer parameters of tracks in the Rekordbox collection.
717
+
718
+ Each of the two gain values are represented by a 32-bit floating point number that is packed into a
719
+ pair of 16-bit integers. The floating point value represents the linear gain factor, which can be
720
+ converted into decibels (dB) by calculating `20.0 * math.log10(f)` where `f` is the gain factor.
721
+
722
+ The auto-gain value is the one shown in the grid edit panel. The peak value does not appear to be
723
+ displayed anywhere in the program, and is most likely used internally for limiting and/or waveform
724
+ scaling.
725
+
726
+ ```{eval-rst}
727
+ .. list-table:: djmdMixerParam columns
728
+ :widths: 1 1 1
729
+ :header-rows: 1
730
+
731
+ * - Column Name
732
+ - Description
733
+ - Notes
734
+ * - `ID`
735
+ - The ID of the mixer parameters
736
+ -
737
+ * - `ContentID`
738
+ - The `ID` of the corrsponding track
739
+ -
740
+ * - `GainHigh`
741
+ - The upper 16 bits of an IEEE754 single-precision floating point number representing the gain.
742
+ - Auto-gain for the track. See note above.
743
+ * - `GainLow`
744
+ - The lower 16 bits of an IEEE754 single-precision floating point number representing the gain.
745
+ - Auto-gain for the track. See note above.
746
+ * - `PeakHigh`
747
+ - The upper 16 bits of an IEEE754 single-precision floating point number representing the peak.
748
+ - Unknown functionality. Maybe some sort of limiter setting. See note above.
749
+ * - `PeakLow`
750
+ - The lower 16 bits of an IEEE754 single-precision floating point number representing the peak.
751
+ - Unknown functionality. Maybe some sort of limiter setting. See note above.
752
+
753
+ ```
754
+
755
+ ### djmdMyTag
756
+
757
+ This table stores the My-Tag data of Rekordbox. It does *not* store the
758
+ tracks for which the My-Tag values are set. These are stored in the `djmdSongMyTag`
759
+ table. The items in the table can either be a My-Tag section or an actual My-Tag value.
760
+
761
+ ```{eval-rst}
762
+ .. list-table:: djmdMyTag columns
763
+ :widths: 1 1 1
764
+ :header-rows: 1
765
+
766
+ * - Column Name
767
+ - Description
768
+ - Notes
769
+ * - `ID`
770
+ - The ID of the My-Tag
771
+ -
772
+ * - `Seq`
773
+ - The number of the My-Tag entry
774
+ - Used for sorting
775
+ * - `Name`
776
+ - The name of the My-Tag
777
+ -
778
+ * - `Attribute`
779
+ - The attributes of the My-Tag
780
+ -
781
+ * - `ParentID`
782
+ - The `ID` of the parent My-Tag section
783
+ -
784
+
785
+ ```
786
+
787
+ ### djmdPlaylist
788
+
789
+ This table stores the playlist data of Rekordbox. It does *not* store the tracks in the
790
+ playlists. These are stored in the `djmdSongPlaylist` table. The items in the table can
791
+ either be a playlist folder or an actual playlist containing tracks.
792
+
793
+ ```{eval-rst}
794
+ .. list-table:: djmdPlaylist columns
795
+ :widths: 1 1 1
796
+ :header-rows: 1
797
+
798
+ * - Column Name
799
+ - Description
800
+ - Notes
801
+ * - `ID`
802
+ - The ID of the playlist
803
+ -
804
+ * - `Seq`
805
+ - The number of the the playlist in the parent folder
806
+ -
807
+ * - `Name`
808
+ - The name of the playlist
809
+ -
810
+ * - `ImagePath`
811
+ - The path to the image file of the playlist
812
+ -
813
+ * - `Attribute`
814
+ - The type of playlist
815
+ - 0: playlist, 1: folder, 4: smart playlist
816
+ * - `ParentID`
817
+ - The `ID` of the parent playlist folder
818
+ -
819
+ * - `SmartList`
820
+ - The conditions for a smart list (if used)
821
+ - Saved as a XML string
822
+
823
+ ```
824
+
825
+ ### djmdProperty
826
+
827
+ This table stores internal properties of the Rekordbox application. Most columns of it
828
+ are reserved.
829
+
830
+ ```{important}
831
+ This table does not use the default columns the other tables use. Therefore *all*
832
+ columns in the table are shown below
833
+ ```
834
+
835
+ ```{eval-rst}
836
+ .. list-table:: djmdProperty columns
837
+ :widths: 1 1 1
838
+ :header-rows: 1
839
+
840
+ * - Column Name
841
+ - Description
842
+ - Notes
843
+ * - `DBID`
844
+ - The ID of the `master.db` database
845
+ -
846
+ * - `DBVersion`
847
+ - The version of the `master.db` database
848
+ -
849
+ * - `BaseDBDrive`
850
+ - The default drive where the `master.db` database is located
851
+ -
852
+ * - `CurrentDBDrive`
853
+ - The current drive where the `master.db` database is located
854
+ -
855
+ * - `Reserved1`
856
+ -
857
+ -
858
+ * - `Reserved2`
859
+ -
860
+ -
861
+ * - `Reserved3`
862
+ -
863
+ -
864
+ * - `Reserved4`
865
+ -
866
+ -
867
+ * - `Reserved5`
868
+ -
869
+ -
870
+ * - `created_at`
871
+ - Creation time of the entry
872
+ -
873
+ * - `updated_at`
874
+ - Last update time of the entry
875
+ -
876
+
877
+ ```
878
+
879
+ ### djmdRelatedTracks
880
+
881
+ This table stores the related tracks of the tracks in Rekordbox. It does *not* store
882
+ the actual related tracks, but rather behaves like a playlist.
883
+ The related tracks are stored in the `djmdSongRelatedTracks` table. The items in the table can
884
+ either be a folder or an actual list containing the related tracks.
885
+
886
+ ```{eval-rst}
887
+ .. list-table:: djmdRelatedTracks columns
888
+ :widths: 1 1 1
889
+ :header-rows: 1
890
+
891
+ * - Column Name
892
+ - Description
893
+ - Notes
894
+ * - `ID`
895
+ - The ID of the related tracks list
896
+ -
897
+ * - `Seq`
898
+ - The number of the related tracks list in the parent folder
899
+ -
900
+ * - `Name`
901
+ - The name of the related tracks list
902
+ -
903
+ * - `Attribute`
904
+ - The attributes of the related tracks list
905
+ -
906
+ * - `ParentID`
907
+ - The `ID` of the parent related tracks list
908
+ -
909
+ * - `Criteria`
910
+ - The criteria used for finding the lated tracks in the list
911
+ -
912
+
913
+ ```
914
+
915
+ ### djmdSampler
916
+
917
+ This table stores the sampler items of Rekordbox. It does *not* store the actual
918
+ samples, but rather behaves like a playlist of samples. The samples are stored in the
919
+ `djmdSongSampler` table. The items in the table can either be a folder or an actual list
920
+ containing the samples.
921
+
922
+ ```{eval-rst}
923
+ .. list-table:: djmdSampler columns
924
+ :widths: 1 1 1
925
+ :header-rows: 1
926
+
927
+ * - Column Name
928
+ - Description
929
+ - Notes
930
+ * - `ID`
931
+ - The ID of the sample list
932
+ -
933
+ * - `Seq`
934
+ - The number of the sample list in the parent folder
935
+ -
936
+ * - `Name`
937
+ - The name of the sample list
938
+ -
939
+ * - `Attribute`
940
+ - The attributes of the sample list
941
+ -
942
+ * - `ParentID`
943
+ - The `ID` of the parent sample list
944
+ -
945
+
946
+ ```
947
+
948
+ ### djmdSongHistory
949
+
950
+ This table stores tracks contained in the history lists in the `djmdHistory` table.
951
+
952
+ ```{eval-rst}
953
+ .. list-table:: djmdSongHistory columns
954
+ :widths: 1 1 1
955
+ :header-rows: 1
956
+
957
+ * - Column Name
958
+ - Description
959
+ - Notes
960
+ * - `ID`
961
+ - The ID of the track in a history
962
+ -
963
+ * - `HistoryID`
964
+ - The ID of the history containing the track
965
+ - Links to `ID` in the `djmdHistory` table
966
+ * - `ContentID`
967
+ - The corresponding track
968
+ - Links to `ID` in the `djmdContent` table
969
+ * - `TrackNo`
970
+ - The number of the track in the history list
971
+ -
972
+
973
+ ```
974
+
975
+ ### djmdSongHotCueBanklist
976
+
977
+ This table stores the hot cue entries contained in the hot-cue bank lists in the
978
+ `djmdHotCueBanklist` table.
979
+
980
+ ```{note}
981
+ Rekordbox internally represents time in "frames", each being 1/150th of a second (6.666ms).
982
+ The `InFrame` and `OutFrame` values use this unit of time. However, when a track is encoded with
983
+ variable bit-rate (VBR) or average bit-rate (ABR), the `InMpegFrame` and `OutMpegFrame` values
984
+ are filled out to assist with correctly seeking. Despite the names, these values are **not** the
985
+ frame indices within the MPEG file, but instead use an alternative timing scheme that is typically
986
+ around 1/75th of a second (13.333ms) per frame, i.e. about half the granularity of normal frames.
987
+ ```
988
+
989
+ ```{eval-rst}
990
+ .. list-table:: djmdSongHotCueBanklist columns
991
+ :widths: 1 1 1
992
+ :header-rows: 1
993
+
994
+ * - Column Name
995
+ - Description
996
+ - Notes
997
+ * - `ID`
998
+ - The ID of the hot-cue bank list entry
999
+ -
1000
+ * - `HotCueBanklistID`
1001
+ - The ID of the hot-cue bank list containing the entry
1002
+ - Links to `ID` in the `djmdHotCueBanklist` table
1003
+ * - `ContentID`
1004
+ - The corresponding track
1005
+ - Links to `ID` in the `djmdContent` table
1006
+ * - `TrackNo`
1007
+ - The number of the hot-cue bank list entry
1008
+ -
1009
+ * - `CueID`
1010
+ - The ID of the corresponding cue item
1011
+ - Links to `ID` in the `djmdCues` table
1012
+ * - `InMsec`
1013
+ - Start time of the cue point
1014
+ - Unit: Millisecond
1015
+ * - `InFrame`
1016
+ - The frame number of the start time
1017
+ - One frame is 1/150th of a second.
1018
+ * - `InMpegFrame`
1019
+ - The MPEG frame number of the start time
1020
+ - See note above. `0` if not a VBR/ABR MPEG file
1021
+ * - `InMpegAbs`
1022
+ - ?
1023
+ - `0` if not a VBR/ABR MPEG file
1024
+ * - `OutMsec`
1025
+ - End time of the cue point (for loops)
1026
+ - Unit: Millisecond, `-1` if not a loop
1027
+ * - `OutFrame`
1028
+ - The frame number of the end time (for loops)
1029
+ - One frame is 1/150th of a second. `0` if not a loop
1030
+ * - `OutMpegFrame`
1031
+ - The MPEG frame number of the end time (for loops)
1032
+ - See note above. `0` if not a VBR/ABR MPEG file or if not a loop.
1033
+ * - `OutMpegAbs`
1034
+ - ?
1035
+ - `0` if not a loop or VBR/ABR MPEG file
1036
+ * - `Color`
1037
+ - The color ID of the cue point
1038
+ - `-1` if no color
1039
+ * - `ColorTableIndex`
1040
+ - ?
1041
+ -
1042
+ * - `ActiveLoop`
1043
+ - ?
1044
+ -
1045
+ * - `Comment`
1046
+ - Name of comment of cue point
1047
+ -
1048
+ * - `BeatLoopSize`
1049
+ - ?
1050
+ -
1051
+ * - `CueMicrosec`
1052
+ - ?
1053
+ -
1054
+ * - `InPointSeekInfo`
1055
+ - ?
1056
+ -
1057
+ * - `OutPointSeekInfo`
1058
+ - ?
1059
+ -
1060
+ * - `HotCueBanklistUUID`
1061
+ - The UUID of the hot-cue bank list
1062
+ - Links to `UUID` in `djmdHotCueBanklist` table
1063
+
1064
+ ```
1065
+
1066
+ ### djmdSongMyTag
1067
+
1068
+ This table stores the My-tag values of tracks linked to in the `djmdMyTag` table.
1069
+
1070
+ ```{eval-rst}
1071
+ .. list-table:: djmdSongMyTag columns
1072
+ :widths: 1 1 1
1073
+ :header-rows: 1
1074
+
1075
+ * - Column Name
1076
+ - Description
1077
+ - Notes
1078
+ * - `ID`
1079
+ - The ID of the My-Tag value
1080
+ -
1081
+ * - `MyTagID`
1082
+ - The ID of the My-Tag group containing the item
1083
+ - Links to `ID` in the `djmdMyTag` table
1084
+ * - `ContentID`
1085
+ - The corresponding track
1086
+ - Links to `ID` in the `djmdContent` table
1087
+ * - `TrackNo`
1088
+ - The number of the My-Tag for a track
1089
+ -
1090
+
1091
+ ```
1092
+
1093
+ ### djmdSongPlaylist
1094
+
1095
+ This table stores tracks contained in the playlists in the `djmdPlaylist` table.
1096
+
1097
+ ```{eval-rst}
1098
+ .. list-table:: djmdSongPlaylist columns
1099
+ :widths: 1 1 1
1100
+ :header-rows: 1
1101
+
1102
+ * - Column Name
1103
+ - Description
1104
+ - Notes
1105
+ * - `ID`
1106
+ - The ID of the track entry in a playlist
1107
+ -
1108
+ * - `PlaylistID`
1109
+ - The ID of the playlist containing the track
1110
+ - Links to `ID` in the `djmdHistory` table
1111
+ * - `ContentID`
1112
+ - The corresponding track
1113
+ - Links to `ID` in the `djmdContent` table
1114
+ * - `TrackNo`
1115
+ - The number of the track in the playlist
1116
+ -
1117
+
1118
+ ```
1119
+
1120
+ ### djmdSongRelatedTracks
1121
+
1122
+ This table stores tracks contained in the related tracks lists in the `djmdRelatedTracks`
1123
+ table.
1124
+
1125
+ ```{eval-rst}
1126
+ .. list-table:: djmdSongRelatedTracks columns
1127
+ :widths: 1 1 1
1128
+ :header-rows: 1
1129
+
1130
+ * - Column Name
1131
+ - Description
1132
+ - Notes
1133
+ * - `ID`
1134
+ - The ID of the related track entry
1135
+ -
1136
+ * - `SongRelatedTracksID`
1137
+ - The ID of the related tracks list containing the entry
1138
+ - Links to `ID` in the `djmdRelatedTracks` table
1139
+ * - `ContentID`
1140
+ - The corresponding track
1141
+ - Links to `ID` in the `djmdContent` table
1142
+ * - `TrackNo`
1143
+ - The number of the track in the related tracks list
1144
+ -
1145
+
1146
+ ```
1147
+
1148
+ ### djmdSongSampler
1149
+
1150
+ This table stores samples contained in the samples lists in the `djmdSampler` table.
1151
+
1152
+ ```{eval-rst}
1153
+ .. list-table:: djmdSongSampler columns
1154
+ :widths: 1 1 1
1155
+ :header-rows: 1
1156
+
1157
+ * - Column Name
1158
+ - Description
1159
+ - Notes
1160
+ * - `ID`
1161
+ - The ID of the sample entry
1162
+ -
1163
+ * - `SamplerID`
1164
+ - The ID of the samples list containing the entry
1165
+ - Links to `ID` in the `djmdSampler` table
1166
+ * - `ContentID`
1167
+ - The corresponding track (or sample)
1168
+ - Links to `ID` in the `djmdContent` table
1169
+ * - `TrackNo`
1170
+ - The number of the sample in the sample list
1171
+ -
1172
+
1173
+ ```
1174
+
1175
+ ### djmdSongTagList
1176
+
1177
+ This table is not well understood.
1178
+
1179
+ ```{eval-rst}
1180
+ .. list-table:: djmdSongTagList columns
1181
+ :widths: 1 1 1
1182
+ :header-rows: 1
1183
+
1184
+ * - Column Name
1185
+ - Description
1186
+ - Notes
1187
+ * - `ID`
1188
+ - The ID of the entries in the tag list
1189
+ -
1190
+ * - `ContentID`
1191
+ - The corresponding track
1192
+ - Links to `ID` in the `djmdContent` table
1193
+ * - `TrackNo`
1194
+ - The number of the entry in the tag list
1195
+ -
1196
+
1197
+ ```
1198
+
1199
+ ### djmdSort
1200
+
1201
+ This table stores information for sorting menu items contained in the `djmdMenuItems`
1202
+ table in Rekordbox.
1203
+
1204
+ ```{eval-rst}
1205
+ .. list-table:: djmdSort columns
1206
+ :widths: 1 1 1
1207
+ :header-rows: 1
1208
+
1209
+ * - Column Name
1210
+ - Description
1211
+ - Notes
1212
+ * - `ID`
1213
+ - The ID of the sorting entry
1214
+ -
1215
+ * - `MenuItemID`
1216
+ - The ID of the corresponding menu item
1217
+ - Links to `ID` in the `djmdMenuItems` table
1218
+ * - `Seq`
1219
+ - The number of the entry in the list
1220
+ -
1221
+ * - `Disable`
1222
+ - Flag if the menu item is disabled or not
1223
+ -
1224
+
1225
+ ```
1226
+
1227
+ ## References
1228
+
1229
+ [^cite_ref6]: Technical inspection of Rekordbox 6 and its new internals. Christiaan Maks. 2020.
1230
+ <https://rekord.cloud/blog/technical-inspection-of-rekordbox-6-and-its-new-internals>.
1231
+
1232
+ [sqlcipher4]: https://www.zetetic.net/sqlcipher
1233
+ [sqlite3]: https://www.sqlite.org/index.html