pyrekordbox 0.3.1__tar.gz → 0.4.0__tar.gz

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 (334) hide show
  1. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.github/workflows/pypi-publish.yml +2 -4
  2. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.github/workflows/tests.yml +1 -1
  3. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.pre-commit-config.yaml +2 -2
  4. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/CHANGELOG.md +84 -5
  5. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/CONTRIBUTING.md +13 -2
  6. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/LICENSE +1 -1
  7. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/PKG-INFO +17 -33
  8. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/README.md +13 -30
  9. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/formats/db6.md +7 -7
  10. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/installation.md +5 -5
  11. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/quickstart.md +4 -0
  12. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/tutorial/db6.md +28 -0
  13. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyproject.toml +31 -4
  14. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/__init__.py +8 -8
  15. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/__main__.py +3 -2
  16. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/_version.py +2 -2
  17. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/anlz/__init__.py +3 -2
  18. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/anlz/file.py +4 -2
  19. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/anlz/tags.py +3 -1
  20. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/config.py +79 -23
  21. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/db6/__init__.py +2 -2
  22. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/db6/aux_files.py +3 -2
  23. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/db6/database.py +227 -143
  24. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/db6/registry.py +1 -0
  25. pyrekordbox-0.4.0/pyrekordbox/db6/smartlist.py +375 -0
  26. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/db6/tables.py +81 -20
  27. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/logger.py +0 -1
  28. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/mysettings/__init__.py +5 -4
  29. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/mysettings/file.py +3 -1
  30. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/rbxml.py +5 -3
  31. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/utils.py +4 -3
  32. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox.egg-info/PKG-INFO +17 -33
  33. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox.egg-info/SOURCES.txt +1 -2
  34. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox.egg-info/requires.txt +1 -0
  35. pyrekordbox-0.4.0/pyrekordbox.egg-info/top_level.txt +1 -0
  36. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/requirements.txt +1 -0
  37. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/tests/test_anlz.py +3 -1
  38. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/tests/test_config.py +92 -15
  39. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/tests/test_db6.py +140 -16
  40. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/tests/test_mysetting.py +5 -3
  41. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/tests/test_xml.py +3 -1
  42. pyrekordbox-0.3.1/pyrekordbox/db6/smart_playlist.py +0 -333
  43. pyrekordbox-0.3.1/pyrekordbox/xml.py +0 -8
  44. pyrekordbox-0.3.1/pyrekordbox.egg-info/top_level.txt +0 -4
  45. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  46. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
  47. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  48. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.github/workflows/codeql.yml +0 -0
  49. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.gitignore +0 -0
  50. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.readthedocs.yaml +0 -0
  51. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/DEVSETTING.DAT +0 -0
  52. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/DJMMYSETTING.DAT +0 -0
  53. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/MYSETTING.DAT +0 -0
  54. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/MYSETTING2.DAT +0 -0
  55. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.2EX +0 -0
  56. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.DAT +0 -0
  57. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.EXT +0 -0
  58. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.2EX +0 -0
  59. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.DAT +0 -0
  60. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.EXT +0 -0
  61. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.2EX +0 -0
  62. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.DAT +0 -0
  63. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.EXT +0 -0
  64. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.2EX +0 -0
  65. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.DAT +0 -0
  66. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.EXT +0 -0
  67. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.2EX +0 -0
  68. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.DAT +0 -0
  69. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.EXT +0 -0
  70. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.2EX +0 -0
  71. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.DAT +0 -0
  72. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.EXT +0 -0
  73. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/rekordbox/export.pdb +0 -0
  74. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/export/PIONEER/rekordbox/exportExt.pdb +0 -0
  75. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/DEVSETTING.DAT +0 -0
  76. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/DJMMYSETTING.DAT +0 -0
  77. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/MYSETTING.DAT +0 -0
  78. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/MYSETTING2.DAT +0 -0
  79. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/beat_fx_quantize/off/DJMMYSETTING.DAT +0 -0
  80. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/beat_fx_quantize/on/DJMMYSETTING.DAT +0 -0
  81. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/channel_fader_curve/linear/DJMMYSETTING.DAT +0 -0
  82. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_bottom/DJMMYSETTING.DAT +0 -0
  83. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_top/DJMMYSETTING.DAT +0 -0
  84. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/exponential/DJMMYSETTING.DAT +0 -0
  85. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/linear/DJMMYSETTING.DAT +0 -0
  86. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/smooth/DJMMYSETTING.DAT +0 -0
  87. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/cross_fader_curve/constant/DJMMYSETTING.DAT +0 -0
  88. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/cross_fader_curve/fast_cut/DJMMYSETTING.DAT +0 -0
  89. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/cross_fader_curve/slow_cut/DJMMYSETTING.DAT +0 -0
  90. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/display_brightness/five/DJMMYSETTING.DAT +0 -0
  91. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/display_brightness/four/DJMMYSETTING.DAT +0 -0
  92. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/display_brightness/one/DJMMYSETTING.DAT +0 -0
  93. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/display_brightness/three/DJMMYSETTING.DAT +0 -0
  94. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/display_brightness/two/DJMMYSETTING.DAT +0 -0
  95. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/display_brightness/white/DJMMYSETTING.DAT +0 -0
  96. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/headphones_mono_split/mono_split/DJMMYSETTING.DAT +0 -0
  97. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/headphones_mono_split/stereo/DJMMYSETTING.DAT +0 -0
  98. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/headphones_pre_eq/post_eq/DJMMYSETTING.DAT +0 -0
  99. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/headphones_pre_eq/pre_eq/DJMMYSETTING.DAT +0 -0
  100. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/indicator_brightness/one/DJMMYSETTING.DAT +0 -0
  101. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/indicator_brightness/three/DJMMYSETTING.DAT +0 -0
  102. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/indicator_brightness/two/DJMMYSETTING.DAT +0 -0
  103. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/mic_low_cut/off/DJMMYSETTING.DAT +0 -0
  104. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/mic_low_cut/on/DJMMYSETTING.DAT +0 -0
  105. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_button_type/toggle/DJMMYSETTING.DAT +0 -0
  106. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_button_type/trigger/DJMMYSETTING.DAT +0 -0
  107. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/eight/DJMMYSETTING.DAT +0 -0
  108. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/eleven/DJMMYSETTING.DAT +0 -0
  109. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/fifteen/DJMMYSETTING.DAT +0 -0
  110. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/five/DJMMYSETTING.DAT +0 -0
  111. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/four/DJMMYSETTING.DAT +0 -0
  112. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/fourteen/DJMMYSETTING.DAT +0 -0
  113. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/nine/DJMMYSETTING.DAT +0 -0
  114. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/one/DJMMYSETTING.DAT +0 -0
  115. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/seven/DJMMYSETTING.DAT +0 -0
  116. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/six/DJMMYSETTING.DAT +0 -0
  117. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/sixteen/DJMMYSETTING.DAT +0 -0
  118. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/ten/DJMMYSETTING.DAT +0 -0
  119. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/thirteen/DJMMYSETTING.DAT +0 -0
  120. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/three/DJMMYSETTING.DAT +0 -0
  121. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/twelve/DJMMYSETTING.DAT +0 -0
  122. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/midi_channel/two/DJMMYSETTING.DAT +0 -0
  123. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/talk_over_level/minus_12db/DJMMYSETTING.DAT +0 -0
  124. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/talk_over_level/minus_18db/DJMMYSETTING.DAT +0 -0
  125. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/talk_over_level/minus_24db/DJMMYSETTING.DAT +0 -0
  126. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/talk_over_level/minus_6db/DJMMYSETTING.DAT +0 -0
  127. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/talk_over_mode/advanced/DJMMYSETTING.DAT +0 -0
  128. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/djmmysetting/talk_over_mode/normal/DJMMYSETTING.DAT +0 -0
  129. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/auto_cue/off/MYSETTING.DAT +0 -0
  130. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/auto_cue/on/MYSETTING.DAT +0 -0
  131. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/auto_cue_level/memory/MYSETTING.DAT +0 -0
  132. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/auto_cue_level/minus_36db/MYSETTING.DAT +0 -0
  133. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/auto_cue_level/minus_42db/MYSETTING.DAT +0 -0
  134. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/auto_cue_level/minus_48db/MYSETTING.DAT +0 -0
  135. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/auto_cue_level/minus_54db/MYSETTING.DAT +0 -0
  136. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/auto_cue_level/minus_60db/MYSETTING.DAT +0 -0
  137. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/auto_cue_level/minus_66db/MYSETTING.DAT +0 -0
  138. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/auto_cue_level/minus_72db/MYSETTING.DAT +0 -0
  139. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/auto_cue_level/minus_78db/MYSETTING.DAT +0 -0
  140. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/disc_slot_illumination/bright/MYSETTING.DAT +0 -0
  141. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/disc_slot_illumination/dark/MYSETTING.DAT +0 -0
  142. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/disc_slot_illumination/off/MYSETTING.DAT +0 -0
  143. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/eject_lock/lock/MYSETTING.DAT +0 -0
  144. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/eject_lock/unlock/MYSETTING.DAT +0 -0
  145. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/hotcue_autoload/off/MYSETTING.DAT +0 -0
  146. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/hotcue_autoload/on/MYSETTING.DAT +0 -0
  147. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/hotcue_autoload/rekordbox/MYSETTING.DAT +0 -0
  148. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/hotcue_color/off/MYSETTING.DAT +0 -0
  149. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/hotcue_color/on/MYSETTING.DAT +0 -0
  150. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/jog_mode/cdj/MYSETTING.DAT +0 -0
  151. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/jog_mode/vinyl/MYSETTING.DAT +0 -0
  152. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/jog_ring_brightness/bright/MYSETTING.DAT +0 -0
  153. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/jog_ring_brightness/dark/MYSETTING.DAT +0 -0
  154. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/jog_ring_brightness/off/MYSETTING.DAT +0 -0
  155. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/jog_ring_indicator/off/MYSETTING.DAT +0 -0
  156. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/jog_ring_indicator/on/MYSETTING.DAT +0 -0
  157. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/chinese_simplified/MYSETTING.DAT +0 -0
  158. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/chinese_traditional/MYSETTING.DAT +0 -0
  159. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/czech/MYSETTING.DAT +0 -0
  160. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/danish/MYSETTING.DAT +0 -0
  161. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/dutch/MYSETTING.DAT +0 -0
  162. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/english/MYSETTING.DAT +0 -0
  163. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/french/MYSETTING.DAT +0 -0
  164. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/german/MYSETTING.DAT +0 -0
  165. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/greek/MYSETTING.DAT +0 -0
  166. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/hungarian/MYSETTING.DAT +0 -0
  167. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/italian/MYSETTING.DAT +0 -0
  168. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/japanese/MYSETTING.DAT +0 -0
  169. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/korean/MYSETTING.DAT +0 -0
  170. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/portuguese/MYSETTING.DAT +0 -0
  171. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/russian/MYSETTING.DAT +0 -0
  172. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/spanish/MYSETTING.DAT +0 -0
  173. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/swedish/MYSETTING.DAT +0 -0
  174. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/language/turkish/MYSETTING.DAT +0 -0
  175. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/lcd_brightness/five/MYSETTING.DAT +0 -0
  176. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/lcd_brightness/four/MYSETTING.DAT +0 -0
  177. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/lcd_brightness/one/MYSETTING.DAT +0 -0
  178. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/lcd_brightness/three/MYSETTING.DAT +0 -0
  179. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/lcd_brightness/two/MYSETTING.DAT +0 -0
  180. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/master_tempo/off/MYSETTING.DAT +0 -0
  181. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/master_tempo/on/MYSETTING.DAT +0 -0
  182. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/needle_lock/lock/MYSETTING.DAT +0 -0
  183. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/needle_lock/unlock/MYSETTING.DAT +0 -0
  184. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/on_air_display/off/MYSETTING.DAT +0 -0
  185. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/on_air_display/on/MYSETTING.DAT +0 -0
  186. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/phase_meter/type1/MYSETTING.DAT +0 -0
  187. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/phase_meter/type2/MYSETTING.DAT +0 -0
  188. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/play_mode/continue_/MYSETTING.DAT +0 -0
  189. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/play_mode/single/MYSETTING.DAT +0 -0
  190. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/quantize/off/MYSETTING.DAT +0 -0
  191. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/quantize/on/MYSETTING.DAT +0 -0
  192. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/quantize_beat_value/eighth/MYSETTING.DAT +0 -0
  193. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/quantize_beat_value/half/MYSETTING.DAT +0 -0
  194. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/quantize_beat_value/one/MYSETTING.DAT +0 -0
  195. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/quantize_beat_value/quarter/MYSETTING.DAT +0 -0
  196. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/slip_flashing/off/MYSETTING.DAT +0 -0
  197. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/slip_flashing/on/MYSETTING.DAT +0 -0
  198. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/sync/off/MYSETTING.DAT +0 -0
  199. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/sync/on/MYSETTING.DAT +0 -0
  200. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/tempo_range/six/MYSETTING.DAT +0 -0
  201. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/tempo_range/sixteen/MYSETTING.DAT +0 -0
  202. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/tempo_range/ten/MYSETTING.DAT +0 -0
  203. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/tempo_range/wide/MYSETTING.DAT +0 -0
  204. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/time_mode/elapsed/MYSETTING.DAT +0 -0
  205. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting/time_mode/remain/MYSETTING.DAT +0 -0
  206. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/beat_jump_beat_value/eight/MYSETTING2.DAT +0 -0
  207. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/beat_jump_beat_value/four/MYSETTING2.DAT +0 -0
  208. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/beat_jump_beat_value/half/MYSETTING2.DAT +0 -0
  209. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/beat_jump_beat_value/one/MYSETTING2.DAT +0 -0
  210. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixteen/MYSETTING2.DAT +0 -0
  211. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixtyfour/MYSETTING2.DAT +0 -0
  212. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/beat_jump_beat_value/thirtytwo/MYSETTING2.DAT +0 -0
  213. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/beat_jump_beat_value/two/MYSETTING2.DAT +0 -0
  214. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/jog_display_mode/artwork/MYSETTING2.DAT +0 -0
  215. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/jog_display_mode/auto/MYSETTING2.DAT +0 -0
  216. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/jog_display_mode/info/MYSETTING2.DAT +0 -0
  217. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/jog_display_mode/simple/MYSETTING2.DAT +0 -0
  218. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/jog_lcd_brightness/five/MYSETTING2.DAT +0 -0
  219. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/jog_lcd_brightness/four/MYSETTING2.DAT +0 -0
  220. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/jog_lcd_brightness/one/MYSETTING2.DAT +0 -0
  221. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/jog_lcd_brightness/three/MYSETTING2.DAT +0 -0
  222. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/jog_lcd_brightness/two/MYSETTING2.DAT +0 -0
  223. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/pad_button_brightness/four/MYSETTING2.DAT +0 -0
  224. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/pad_button_brightness/one/MYSETTING2.DAT +0 -0
  225. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/pad_button_brightness/three/MYSETTING2.DAT +0 -0
  226. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/pad_button_brightness/two/MYSETTING2.DAT +0 -0
  227. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/release/MYSETTING2.DAT +0 -0
  228. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch/MYSETTING2.DAT +0 -0
  229. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch_release/MYSETTING2.DAT +0 -0
  230. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/waveform/phase_meter/MYSETTING2.DAT +0 -0
  231. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/waveform/waveform/MYSETTING2.DAT +0 -0
  232. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/waveform_divisions/phrase/MYSETTING2.DAT +0 -0
  233. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/mysettings/mysetting2/waveform_divisions/time_scale/MYSETTING2.DAT +0 -0
  234. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/DEVSETTING.DAT +0 -0
  235. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/ExtData.edb +0 -0
  236. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/MYSETTING.DAT +0 -0
  237. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.DAT +0 -0
  238. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.EXT +0 -0
  239. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.DAT +0 -0
  240. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.EXT +0 -0
  241. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.DAT +0 -0
  242. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.EXT +0 -0
  243. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.DAT +0 -0
  244. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.EXT +0 -0
  245. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.DAT +0 -0
  246. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.EXT +0 -0
  247. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.DAT +0 -0
  248. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.EXT +0 -0
  249. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/datafile.edb +0 -0
  250. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/backup/masterPlaylists3.xml +0 -0
  251. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/database.xml +0 -0
  252. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 5/datafile.edb +0 -0
  253. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/DEVSETTING.DAT +0 -0
  254. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/DJMMYSETTING.DAT +0 -0
  255. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/MYSETTING.DAT +0 -0
  256. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/MYSETTING2.DAT +0 -0
  257. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/masterPlaylists3.xml +0 -0
  258. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/masterPlaylists6.xml +0 -0
  259. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.2EX +0 -0
  260. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.DAT +0 -0
  261. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.EXT +0 -0
  262. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.2EX +0 -0
  263. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.DAT +0 -0
  264. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.EXT +0 -0
  265. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.2EX +0 -0
  266. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.DAT +0 -0
  267. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.EXT +0 -0
  268. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.2EX +0 -0
  269. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.DAT +0 -0
  270. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.EXT +0 -0
  271. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.2EX +0 -0
  272. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.DAT +0 -0
  273. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.EXT +0 -0
  274. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.2EX +0 -0
  275. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.DAT +0 -0
  276. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.EXT +0 -0
  277. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/database.xml +0 -0
  278. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/masterPlaylists6_template.xml +0 -0
  279. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/master_locked.db +0 -0
  280. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/.testdata/rekordbox 6/master_unlocked.db +0 -0
  281. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/Makefile +0 -0
  282. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/make.bat +0 -0
  283. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_beat.svg +0 -0
  284. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_file.svg +0 -0
  285. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pco2.svg +0 -0
  286. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pcob.svg +0 -0
  287. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pcp2.svg +0 -0
  288. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pcpt.svg +0 -0
  289. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_ppth.svg +0 -0
  290. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pqt2.svg +0 -0
  291. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pqt2_2.svg +0 -0
  292. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pqtz.svg +0 -0
  293. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pssi.svg +0 -0
  294. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pssi_entry.svg +0 -0
  295. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pvbr.svg +0 -0
  296. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pwav.svg +0 -0
  297. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pwv3.svg +0 -0
  298. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pwv4.svg +0 -0
  299. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pwv5.svg +0 -0
  300. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pwv5_entry.svg +0 -0
  301. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pwv6.svg +0 -0
  302. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pwv7.svg +0 -0
  303. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_pwvc.svg +0 -0
  304. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/anlz_tag.svg +0 -0
  305. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/images/x64dbg_rb_key.png +0 -0
  306. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/logos/dark/logo_primary.svg +0 -0
  307. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/logos/light/logo_primary.svg +0 -0
  308. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_static/logos/mid/logo_primary.svg +0 -0
  309. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_templates/apidoc/module.rst_t +0 -0
  310. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_templates/apidoc/package.rst_t +0 -0
  311. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_templates/apidoc/toc.rst_t +0 -0
  312. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_templates/autosummary/class.rst +0 -0
  313. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/_templates/autosummary/module.rst +0 -0
  314. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/api.md +0 -0
  315. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/conf.py +0 -0
  316. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/development/changes.md +0 -0
  317. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/development/contributing.md +0 -0
  318. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/formats/anlz.md +0 -0
  319. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/formats/mysetting.md +0 -0
  320. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/formats/xml.md +0 -0
  321. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/index.md +0 -0
  322. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/key.md +0 -0
  323. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/requirements.txt +0 -0
  324. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/tutorial/anlz.md +0 -0
  325. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/tutorial/configuration.md +0 -0
  326. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/tutorial/index.md +0 -0
  327. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/tutorial/mysetting.md +0 -0
  328. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/docs/source/tutorial/xml.md +0 -0
  329. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/anlz/structs.py +0 -0
  330. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox/mysettings/structs.py +0 -0
  331. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox.egg-info/dependency_links.txt +0 -0
  332. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/pyrekordbox.egg-info/not-zip-safe +0 -0
  333. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/setup.cfg +0 -0
  334. {pyrekordbox-0.3.1 → pyrekordbox-0.4.0}/tests/__init__.py +0 -0
@@ -1,6 +1,4 @@
1
- # This workflow will upload a Python Package using Twine when a release is created
2
- # For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
3
-
1
+ # This workflow will upload a Python Package when a release is created
4
2
 
5
3
  name: Upload Python Package to PyPi
6
4
 
@@ -13,7 +11,7 @@ on:
13
11
 
14
12
  jobs:
15
13
  build:
16
- name: Build and publish Python Package to PyPi
14
+ name: Build Python Package
17
15
  runs-on: ubuntu-latest
18
16
  steps:
19
17
  - name: get latest release with tag
@@ -43,7 +43,7 @@ jobs:
43
43
  strategy:
44
44
  matrix:
45
45
  os: [windows-latest, macos-latest]
46
- python-version: ["3.8", "3.12"] # check oldest and latest supported version
46
+ python-version: ["3.8", "3.13"] # check oldest and latest supported version
47
47
  other-os: [true]
48
48
 
49
49
  runs-on: ${{ matrix.os }}
@@ -3,7 +3,7 @@
3
3
 
4
4
  repos:
5
5
  - repo: https://github.com/pre-commit/pre-commit-hooks
6
- rev: v4.5.0
6
+ rev: v5.0.0
7
7
  hooks:
8
8
  - id: end-of-file-fixer
9
9
  - id: trailing-whitespace
@@ -13,7 +13,7 @@ repos:
13
13
  - id: check-yaml
14
14
 
15
15
  - repo: https://github.com/astral-sh/ruff-pre-commit
16
- rev: v0.1.9
16
+ rev: v0.9.6
17
17
  hooks:
18
18
  # Run the linter.
19
19
  - id: ruff
@@ -1,12 +1,89 @@
1
1
  # What's New
2
2
 
3
- <a name="0.3.1"></a>
4
- ## [0.3.1] - 2023-12-28
3
+ <a name="v0.4.0"></a>
4
+ ## [v0.4.0] - 2025-02-12
5
+
6
+ This release adds the ability to create new tracks in the Rekordbox v6 database.
7
+ It also adds support for Rekordbox 7 and fixes various bugs.
8
+
9
+ ### New Features
10
+
11
+ - **db:** **add method for creating tracks ([#121](https://github.com/dylanljones/pyrekordbox/pull/121))**
12
+ New tracks can now be created and added to the Rekordbox collection.
13
+ Note that the user still has to reload tags/analyze the newly added tracks in Rekordbox.
14
+ - **config:** **add Rekordbox 7 support ([#133](https://github.com/dylanljones/pyrekordbox/issues/133))**
15
+
16
+ ### Improvements/Bug Fixes
17
+
18
+ - **db:** **fix missing proxy association in table dict**
19
+ The association proxies were missing in the `to_dict` method.
20
+ The keys are now also cached.
21
+ - **db:** **fix an error with .aif file extension ([#138](https://github.com/dylanljones/pyrekordbox/pull/138))**
22
+ - **db:** **fix to smartlist not always working correctly due to unneccessary bit shift for specific MyTag values ([#142](https://github.com/dylanljones/pyrekordbox/pull/142))**
23
+ Fix smartlists not always working correctly due to unneccessary bit shift for specific MyTag values
24
+ - **db:** **fix different timezone assertion ([#137](https://github.com/dylanljones/pyrekordbox/pull/137))**
25
+ Allow different timezones other than "+00:00" in the datetime format of the DB.
26
+ - **xml:** **save xml as utf-8 ([#135](https://github.com/dylanljones/pyrekordbox/pull/135))**
27
+ - **build:** **use pre-built sqlcipher wheels as dependency ([#134](https://github.com/dylanljones/pyrekordbox/pull/134))**
28
+ The sqlcipher dependency can now be installed using pre-built wheels with included sqlcipher binaries. This makes the whole library installable via pip!
29
+ - **xml:** **remove deprecated `xml` module**
30
+ - **db:** **remove deprecated `open_rekordbox_database` method**
31
+
32
+ ### Documentation
33
+
34
+ - **db:** **add documentation for adding tracks**
35
+ - **db:** **add more info to djmdContent table**
36
+
37
+ ### BREAKING CHANGE
38
+
39
+ Remove deprecated `open_rekordbox_database` method. Use the `Rekordbox6Database` database handler instead!
40
+ Remove deprecated `xml` module. Use the `rbxml` module instead!
41
+
42
+
43
+ <a name="v0.3.2"></a>
44
+ ## [v0.3.2] - 2024-01-05
45
+
46
+ This release fixes smart-playlist related bugs and improves the
47
+ database table relationships.
48
+
49
+ ### New Features
50
+
51
+ - **db:** **Add method for creating smart playlists**
52
+ This will set the ID in the smart list to the newly created playlist ID before generating the XML string
53
+
54
+ ### Improvements/Bug Fixes
55
+
56
+ - **db:** **add missing UUID entries**
57
+ The UUID was not set when creating the following db entries:
58
+ - album
59
+ - artist
60
+ - genre
61
+ - label
62
+ - **db:** **add missing relationships in `DjmdContent`**
63
+ Linked tables and corresponding relationships:
64
+ - `DjmdCue`: `Cues`
65
+ - `DjmdSongMyTag`: `MyTags`
66
+ - `DjmdActiveCensor`: `ActiveCensors`
67
+ - `DjmdMixerParam`: `MixerParams`
68
+ - **db:** **add My-Tag names association to the `DjmdContent` table**
69
+ It is now possible to get a list of the corresponding My-tag names from the `DjmdContent` instance.
70
+ - **db:** **add album artist association to the `DjmdAlbum` and `DjmdContent` tables**
71
+ It is now possible to get the album artist instance or name directly from the `DjmdContent` instance.
72
+ - **db:** **fix smart list filter bugs ([#110](https://github.com/dylanljones/pyrekordbox/discussions/110))**
73
+
74
+ ### Documentation
75
+
76
+ - **db:** **fix `Kind` notes in `DjmdCue` table**
77
+
78
+
79
+ <a name="v0.3.1"></a>
80
+ ## [v0.3.1] - 2023-12-28
5
81
 
6
82
  This release improves the Rekordbox v6 database key extraction and
7
83
  adds a new handler for smart playlists.
8
84
 
9
85
  ### New Features
86
+
10
87
  - **add method to return the contents of a playlist in the RBv6 db directly**
11
88
  The database can now be queried directly for the contents contained in a playlist.
12
89
  This works for regular playlists as well as for smart playlists.
@@ -14,7 +91,7 @@ adds a new handler for smart playlists.
14
91
  - **add RBv6 smart playlist handler**
15
92
  Add a handler for the smart playlists of Rekordbox. The conditions are stored as an
16
93
  XML string. The smart playlist handler supports parsing and writing the XML string.
17
- - **add DB key extraction method for newer Rekordbox versions ([#97](https://github.com/dylanljones/pyrekordbox/issues/97)).**
94
+ - **add DB key extraction method for newer Rekordbox versions ([#97](https://github.com/dylanljones/pyrekordbox/discussions/97)).**
18
95
  The key can now also be extracted with newer Rekordbox versions.
19
96
  `frida` is used to inject code to intercept the key when the DB is opened.
20
97
 
@@ -533,8 +610,10 @@ This release contains documentation fixes.
533
610
  - **add missing djmd tables to `master.db` database documentation**
534
611
 
535
612
 
536
- [Unreleased]: https://github.com/dylanljones/pyrekordbox/compare/0.3.1...HEAD
537
- [0.3.1]: https://github.com/dylanljones/pyrekordbox/compare/0.3.0...0.3.1
613
+ [Unreleased]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.0...HEAD
614
+ [v0.4.0]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.2...v0.4.0
615
+ [v0.3.2]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.1...v0.3.2
616
+ [v0.3.1]: https://github.com/dylanljones/pyrekordbox/compare/0.3.0...v0.3.1
538
617
  [0.3.0]: https://github.com/dylanljones/pyrekordbox/compare/0.2.3...0.3.0
539
618
  [0.2.3]: https://github.com/dylanljones/pyrekordbox/compare/0.2.2...0.2.3
540
619
  [0.2.2]: https://github.com/dylanljones/pyrekordbox/compare/0.2.1...0.2.2
@@ -22,7 +22,7 @@ $ pre-commit install
22
22
  A format influenced by [Angular commit message].
23
23
 
24
24
  ```text
25
- <type>: <subject>
25
+ <type>(<scope>): <subject>
26
26
  <BLANK LINE>
27
27
  <body>
28
28
  <BLANK LINE>
@@ -42,7 +42,18 @@ Must be one of the following:
42
42
  - **build:** Updating Makefile etc, no production code changes
43
43
  - **test:** Adding missing tests or correcting existing tests
44
44
  - **update** Other configurations updates
45
- - **auto** Mostly used by automatic commits (for example from GitHub workflows)
45
+
46
+ ### Scope (optional)
47
+
48
+ The scope should specify the affected part of the project.
49
+ The following is a list of possible scopes:
50
+
51
+ - **config**: Configuration handling
52
+ - **xml**: Rekordbox XML database handling
53
+ - **db**: Rekordbox v6 database handling
54
+ - **anlz**: ANLZ file handling
55
+ - **mysetting**: MySettings file handling
56
+
46
57
 
47
58
  ### Subject
48
59
 
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2022-2023, Dylan Jones
3
+ Copyright (c) 2022-2024, Dylan Jones
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,11 +1,11 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: pyrekordbox
3
- Version: 0.3.1
3
+ Version: 0.4.0
4
4
  Summary: Inofficial Python package for interacting with the library of Pioneers Rekordbox DJ software.
5
5
  Author-email: Dylan Jones <dylanljones94@gmail.com>
6
6
  License: MIT License
7
7
 
8
- Copyright (c) 2022-2023, Dylan Jones
8
+ Copyright (c) 2022-2024, Dylan Jones
9
9
 
10
10
  Permission is hereby granted, free of charge, to any person obtaining a copy
11
11
  of this software and associated documentation files (the "Software"), to deal
@@ -54,6 +54,7 @@ Requires-Dist: numpy>=1.19.0
54
54
  Requires-Dist: packaging
55
55
  Requires-Dist: psutil>=5.9.0
56
56
  Requires-Dist: sqlalchemy>=2.0.0
57
+ Requires-Dist: sqlcipher3-wheels
57
58
  Requires-Dist: frida-tools
58
59
  Requires-Dist: python-dateutil
59
60
  Provides-Extra: test
@@ -85,7 +86,7 @@ Pioneers Rekordbox DJ Software. It currently supports
85
86
  - Analysis files (ANLZ)
86
87
  - My-Setting files
87
88
 
88
- Tested Rekordbox versions: ``5.8.6 | 6.5.3 | 6.7.7``
89
+ Tested Rekordbox versions: ``5.8.6 | 6.7.7 | 7.0.9``
89
90
 
90
91
 
91
92
  |⚠️| This project is still under development and might contain bugs or have breaking API changes in the future. Check the [changelog][CHANGELOG] for recent changes! |
@@ -107,32 +108,10 @@ where `VERSION` is a release, tag or branch name.
107
108
 
108
109
  ### Dependencies
109
110
 
110
- Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
111
- Pyrekordbox makes no attempt to download/install SQLCipher, as it is a
112
- pure Python package - whereas the SQLCipher/sqlcipher3 installation is
113
- platform-dependent and can not be installed via ``pip``.
114
-
115
- #### Windows
116
-
117
- SQLCipher can be used by building the libary against an amalgamation with [sqlcipher3].
118
- For a detailed instruction, see the [installation guide][installation].
119
-
120
- #### MacOS
121
111
 
122
- For MacOS follow these steps:
123
-
124
- 1) Install [Homebrew](https://brew.sh) if you do not have it on your machine.
125
- 2) Install SQLCipher with `brew install SQLCipher`.
126
- 3) With the python environment you are using to run pyrekordbox active execute the following:
127
- ```shell
128
- git clone https://github.com/coleifer/sqlcipher3
129
- cd sqlcipher3
130
- SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py build
131
- SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py install
132
- ```
133
- Make sure the `C_INCLUDE` and `LIBRARY_PATH` point to the installed SQLCipher path. It may differ on your machine.
134
- If you are having issues installing [sqlcipher3] on M1 Macs please refer to the
135
- [installation guide][installation].
112
+ Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
113
+ Pyrekordbox tries to install pre-built wheels with included sqlcipher binaries via the [sqlcipher3-wheels] package.
114
+ If this fails, it can be installed manually following the [installation guide][installation].
136
115
 
137
116
 
138
117
  ## 🚀 Quick-Start
@@ -166,10 +145,10 @@ Alternatively the two paths can be specified in a configuration file under the s
166
145
  pyrekordbox.cfg and pyrekordbox.yaml.
167
146
 
168
147
 
169
- ### Rekordbox 6 database
148
+ ### Rekordbox 6/7 database
170
149
 
171
- Rekordbox 6 now uses a SQLite database for storing the collection content.
172
- Unfortunatly, the new `master.db` SQLite database is encrypted using
150
+ Rekordbox 6 and 7 use a SQLite database for storing the collection content.
151
+ Unfortunatly, the `master.db` SQLite database is encrypted using
173
152
  [SQLCipher][sqlcipher], which means it can't be used without the encryption key.
174
153
  However, since your data is stored and used locally, the key must be present on the
175
154
  machine running Rekordbox.
@@ -199,8 +178,13 @@ content.Title = "New Title"
199
178
  Some fields are stored as references to other tables, for example the artist of a track.
200
179
  Check the [documentation][db6-doc] of the corresponding object for more information.
201
180
  So far only a few tables support adding or deleting entries:
181
+ - ``DjmdContent``: Tracks
202
182
  - ``DjmdPlaylist``: Playlists/Playlist Folders
203
183
  - ``DjmdSongPlaylist``: Songs in a playlist
184
+ - ``DjmdAlbum``: Albums
185
+ - ``DjmdArtist``: Artists
186
+ - ``DjmdGenre``: Genres
187
+ - ``DjmdLabel``: Labels
204
188
 
205
189
  If the automatic key extraction fails the command line interface of ``pyrekordbox``
206
190
  provides a command for downloading the key from known sources and writing it to the
@@ -384,7 +368,7 @@ the CI setup since it requires a working Rekordbox installation.
384
368
 
385
369
  [repo]: https://github.com/dylanljones/pyrekordbox
386
370
  [sqlcipher]: https://www.zetetic.net/sqlcipher/open-source/
387
- [sqlcipher3]: https://github.com/coleifer/sqlcipher3
371
+ [sqlcipher3-wheels]: https://github.com/laggykiller/sqlcipher3
388
372
  [rekordcrate]: https://github.com/Holzhaus/rekordcrate
389
373
  [crate-digger]: https://github.com/Deep-Symmetry/crate-digger
390
374
  [supbox]: https://github.com/gabek/supbox
@@ -22,7 +22,7 @@ Pioneers Rekordbox DJ Software. It currently supports
22
22
  - Analysis files (ANLZ)
23
23
  - My-Setting files
24
24
 
25
- Tested Rekordbox versions: ``5.8.6 | 6.5.3 | 6.7.7``
25
+ Tested Rekordbox versions: ``5.8.6 | 6.7.7 | 7.0.9``
26
26
 
27
27
 
28
28
  |⚠️| This project is still under development and might contain bugs or have breaking API changes in the future. Check the [changelog][CHANGELOG] for recent changes! |
@@ -44,32 +44,10 @@ where `VERSION` is a release, tag or branch name.
44
44
 
45
45
  ### Dependencies
46
46
 
47
- Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
48
- Pyrekordbox makes no attempt to download/install SQLCipher, as it is a
49
- pure Python package - whereas the SQLCipher/sqlcipher3 installation is
50
- platform-dependent and can not be installed via ``pip``.
51
-
52
- #### Windows
53
-
54
- SQLCipher can be used by building the libary against an amalgamation with [sqlcipher3].
55
- For a detailed instruction, see the [installation guide][installation].
56
-
57
- #### MacOS
58
47
 
59
- For MacOS follow these steps:
60
-
61
- 1) Install [Homebrew](https://brew.sh) if you do not have it on your machine.
62
- 2) Install SQLCipher with `brew install SQLCipher`.
63
- 3) With the python environment you are using to run pyrekordbox active execute the following:
64
- ```shell
65
- git clone https://github.com/coleifer/sqlcipher3
66
- cd sqlcipher3
67
- SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py build
68
- SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py install
69
- ```
70
- Make sure the `C_INCLUDE` and `LIBRARY_PATH` point to the installed SQLCipher path. It may differ on your machine.
71
- If you are having issues installing [sqlcipher3] on M1 Macs please refer to the
72
- [installation guide][installation].
48
+ Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
49
+ Pyrekordbox tries to install pre-built wheels with included sqlcipher binaries via the [sqlcipher3-wheels] package.
50
+ If this fails, it can be installed manually following the [installation guide][installation].
73
51
 
74
52
 
75
53
  ## 🚀 Quick-Start
@@ -103,10 +81,10 @@ Alternatively the two paths can be specified in a configuration file under the s
103
81
  pyrekordbox.cfg and pyrekordbox.yaml.
104
82
 
105
83
 
106
- ### Rekordbox 6 database
84
+ ### Rekordbox 6/7 database
107
85
 
108
- Rekordbox 6 now uses a SQLite database for storing the collection content.
109
- Unfortunatly, the new `master.db` SQLite database is encrypted using
86
+ Rekordbox 6 and 7 use a SQLite database for storing the collection content.
87
+ Unfortunatly, the `master.db` SQLite database is encrypted using
110
88
  [SQLCipher][sqlcipher], which means it can't be used without the encryption key.
111
89
  However, since your data is stored and used locally, the key must be present on the
112
90
  machine running Rekordbox.
@@ -136,8 +114,13 @@ content.Title = "New Title"
136
114
  Some fields are stored as references to other tables, for example the artist of a track.
137
115
  Check the [documentation][db6-doc] of the corresponding object for more information.
138
116
  So far only a few tables support adding or deleting entries:
117
+ - ``DjmdContent``: Tracks
139
118
  - ``DjmdPlaylist``: Playlists/Playlist Folders
140
119
  - ``DjmdSongPlaylist``: Songs in a playlist
120
+ - ``DjmdAlbum``: Albums
121
+ - ``DjmdArtist``: Artists
122
+ - ``DjmdGenre``: Genres
123
+ - ``DjmdLabel``: Labels
141
124
 
142
125
  If the automatic key extraction fails the command line interface of ``pyrekordbox``
143
126
  provides a command for downloading the key from known sources and writing it to the
@@ -321,7 +304,7 @@ the CI setup since it requires a working Rekordbox installation.
321
304
 
322
305
  [repo]: https://github.com/dylanljones/pyrekordbox
323
306
  [sqlcipher]: https://www.zetetic.net/sqlcipher/open-source/
324
- [sqlcipher3]: https://github.com/coleifer/sqlcipher3
307
+ [sqlcipher3-wheels]: https://github.com/laggykiller/sqlcipher3
325
308
  [rekordcrate]: https://github.com/Holzhaus/rekordcrate
326
309
  [crate-digger]: https://github.com/Deep-Symmetry/crate-digger
327
310
  [supbox]: https://github.com/gabek/supbox
@@ -270,7 +270,7 @@ corresponding ID.
270
270
  -
271
271
  * - `FileType`
272
272
  - Type of audio file
273
- - mp3= `0` / `1` , m4a= `4` , wav= `11` , aiff= `12`
273
+ - mp3= `0` / `1` , m4a= `4` , flac= `5` , wav= `11` , aiff= `12`
274
274
  * - `Rating`
275
275
  - Rating of the track
276
276
  -
@@ -302,8 +302,8 @@ corresponding ID.
302
302
  - Path to the tracks album artwork
303
303
  - The path is relative to the Rekordbox database root
304
304
  * - `MasterDBID`
305
- - The master-ID of the track
306
- - Not sure whats the difference to `ID`
305
+ - The database where the track is stored
306
+ - Links to `DBID` in the `DjmdProperty` table
307
307
  * - `MasterSongID`
308
308
  - The master-song-ID of the track
309
309
  - Not sure whats the difference to `ID` and `MasterDBID`
@@ -341,7 +341,7 @@ corresponding ID.
341
341
  - Date of file creation
342
342
  - Format: yyyy-mm-dd; ex.: 2010-08-21
343
343
  * - `ContentLink`
344
- - ?
344
+ - Link to the `rb_local_usn` of `TRACK` in `DjmdMenuItems`?
345
345
  -
346
346
  * - `Tag`
347
347
  - My tag value
@@ -413,7 +413,7 @@ corresponding ID.
413
413
  - The Rekordbox ID of the file
414
414
  -
415
415
  * - `DeviceID`
416
- - ?
416
+ - The ID of the DjmdDevice this track is stored on.
417
417
  -
418
418
  * - `rb_LocalFolderPath`
419
419
  - ?
@@ -488,8 +488,8 @@ around 1/75th of a second (13.333ms) per frame, i.e. about half the granularity
488
488
  - The offset (bytes) in the file where the ending frame appears.
489
489
  - `0` if not a loop or VBR/ABR MPEG file
490
490
  * - `Kind`
491
- - Type of cue point
492
- - Cue= `0` , Fade-In= `1` , Fade-Out= `2` , Load= `3` , Loop= `4`
491
+ - Type and/or number of cue point
492
+ - `0` if memory cue, otherwise the number of Hot Cue
493
493
  * - `Color`
494
494
  - The color ID of the cue point
495
495
  - `-1` if no color
@@ -23,9 +23,8 @@ $ pip install .
23
23
  ## Installing SQLCipher
24
24
 
25
25
  Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
26
- Pyrekordbox makes no attempt to download/install SQLCipher, as it is a
27
- pure Python package - whereas the SQLCipher/sqlcipher3 installation is
28
- platform-dependent and can not be installed easily via ``pip``.
26
+ Pyrekordbox tries to install pre-built wheels with included sqlcipher binaries via the [sqlcipher3-wheels] package.
27
+ If this fails, it can be installed manually following the instructions below.
29
28
 
30
29
  [sqlcipher3] can either be built with the system [SQLCipher][sqlcipher] or built against
31
30
  a statically linked amalgamation of the SQLite3 source code.
@@ -186,8 +185,8 @@ For building [sqlcipher3] against the system SQLCipher installation on MacOS fol
186
185
  ```shell
187
186
  git clone https://github.com/coleifer/sqlcipher3
188
187
  cd sqlcipher3
189
- SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py build
190
- SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py install
188
+ SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==5 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py build
189
+ SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==5 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py install
191
190
  ```
192
191
  Make sure the `C_INCLUDE` and `LIBRARY_PATH` point to the installed SQLCipher path. It may differ on your machine.
193
192
 
@@ -269,3 +268,4 @@ c.execute("PRAGMA key='password'")
269
268
  [Pypi]: https://pypi.org/project/pyrekordbox/
270
269
  [GitHub]: https://github.com/dylanljones/pyrekordbox
271
270
  [sqlcipher]: https://www.zetetic.net/sqlcipher/open-source/
271
+ [sqlcipher3-wheels]: https://github.com/laggykiller/sqlcipher3
@@ -73,6 +73,10 @@ Check the [documentation](#db6-format) of the corresponding object for more info
73
73
  So far only a few tables support adding or deleting entries:
74
74
  - ``DjmdPlaylist``: Playlists/Playlist Folders
75
75
  - ``DjmdSongPlaylist``: Songs in a playlist
76
+ - ``DjmdAlbum``: Albums
77
+ - ``DjmdArtist``: Artists
78
+ - ``DjmdGenre``: Genres
79
+ - ``DjmdLabel``: Labels
76
80
 
77
81
  ````{important}
78
82
  Starting from Rekordbox version ``6.6.5`` Pioneer obfuscated the ``app.asar`` file
@@ -160,6 +160,34 @@ song = playlist.Songs[0]
160
160
  db.remove_from_playlist(playlist, song)
161
161
  ````
162
162
 
163
+ ### Tracks
164
+
165
+ New tracks can be added to your rekordbox collection by calling the `db.add_content()` method:
166
+
167
+ ```python
168
+ track = db.add_content("/Users/deadmau5/Downloads/Banger.mp3")
169
+ ```
170
+
171
+ This creates a new [DjmdContent] instance and adds it to the [djmdContent-table]. This
172
+ track will appear in your rekordbox collection, but the track metadata (title, artist,
173
+ etc.) will be blank. To load this data, simply right click the track and select the
174
+ `Reload Tag` menu option. rekordbox will correctly populate the metadata, including
175
+ creating any related table data for things like artist and album.
176
+
177
+ The `db.add_content()` method accepts `**kwargs` which are passed on to the [DjmdContent]
178
+ instance. You can use these keyword arguments if you want to populate some of the track
179
+ metadata right away. However, things like [DjmdArtist] and [DjmdAlbum] are foreign keys to
180
+ other tables, so make sure you create these objects first and pass the objects via kwargs,
181
+ rather than passing plain strings. A plain string will work for `Title`, however.
182
+
183
+ ```python
184
+ db.add_content("/Users/deadmau5/Downloads/Banger.mp3", Title="Banger")
185
+ ```
186
+
187
+ Populating the [DjmdContent] metadata directly from the track file is not currently
188
+ supported, but it will hopefully be included in a future release.
189
+
190
+
163
191
  ```{note}
164
192
  More coming soon!
165
193
  ```
@@ -36,6 +36,7 @@ dependencies = [
36
36
  "packaging",
37
37
  "psutil>=5.9.0",
38
38
  "sqlalchemy>=2.0.0",
39
+ "sqlcipher3-wheels",
39
40
  "frida-tools",
40
41
  "python-dateutil",
41
42
  ]
@@ -69,8 +70,9 @@ platforms = ["any"]
69
70
  zip-safe = false
70
71
  include-package-data = true
71
72
 
72
- [tool.setuptools.packages]
73
- find = {}
73
+ [tool.setuptools.packages.find]
74
+ where = ["."]
75
+ include = ["pyrekordbox", "pyrekordbox.*"]
74
76
 
75
77
  [tool.setuptools_scm]
76
78
  write_to = "pyrekordbox/_version.py"
@@ -99,20 +101,45 @@ select = [
99
101
  "F", # flake8
100
102
  "E", # pycodestyle Errors
101
103
  "W", # pycodestyle Warnings
102
- # "I", # isort
104
+ "I", # isort
105
+ "NPY", # Numpy
106
+ "N", # pep8-naming
107
+ "D", # pydocstyle
103
108
  ]
104
109
  ignore = [
105
110
  "E203", # Whitespace before ':'
111
+ "D100", # Missing docstring in public module
112
+ "D101", # Missing docstring in public class
113
+ "D102", # Missing docstring in public method
114
+ "D103", # Missing docstring in public function
115
+ "D104", # Missing docstring in public package
116
+ "D105", # Missing docstring in magic method
117
+ "D106", # Missing docstring in public nested class
118
+ "D107", # Missing docstring in __init__
119
+ "D401", # First line should be in imperative mood
120
+ "D403", # First word of the first line should be capitalized
121
+ "D404", # First word of the docstring should not be "This"
122
+ #"N802", # Function name should be lowercase
123
+ #"N803", # Argument name should be lowercase
124
+ "N813", # Camelcase imported as lowercase
125
+ #"N815", # Variable in class scope should not be mixedCase
126
+ "N818", # Exception name should be named with an Error suffix
106
127
  ]
107
128
  fixable = ["ALL"] # Allow fix for all enabled rules (when `--fix`) is provided.
108
129
  unfixable = []
109
130
 
110
131
  [tool.ruff.lint.per-file-ignores]
111
132
  "*__init__.py" = ["F401"]
133
+ "rbxml.py" = ["N803"]
134
+ "tables.py" = ["N802", "N815"]
135
+
136
+
137
+ [tool.ruff.lint.pydocstyle]
138
+ convention = "numpy"
112
139
 
113
140
  [tool.ruff.lint.isort]
114
141
  combine-as-imports = true
115
- # length-sort = true
142
+ length-sort = false
116
143
 
117
144
  [tool.ruff.format]
118
145
  quote-style = "double"
@@ -2,19 +2,19 @@
2
2
  # Author: Dylan Jones
3
3
  # Date: 2022-04-10
4
4
 
5
+ from .anlz import AnlzFile, get_anlz_paths, read_anlz_files, walk_anlz_paths
6
+ from .config import get_config, show_config, update_config
7
+ from .db6 import Rekordbox6Database
5
8
  from .logger import logger
6
- from .config import show_config, get_config, update_config
7
- from .rbxml import RekordboxXml, XmlDuplicateError, XmlAttributeKeyError
8
- from .anlz import get_anlz_paths, walk_anlz_paths, read_anlz_files, AnlzFile
9
9
  from .mysettings import (
10
+ DevSettingFile,
11
+ DjmMySettingFile,
12
+ MySetting2File,
13
+ MySettingFile,
10
14
  get_mysetting_paths,
11
15
  read_mysetting_file,
12
- MySettingFile,
13
- MySetting2File,
14
- DjmMySettingFile,
15
- DevSettingFile,
16
16
  )
17
- from .db6 import Rekordbox6Database, open_rekordbox_database
17
+ from .rbxml import RekordboxXml, XmlAttributeKeyError, XmlDuplicateError
18
18
 
19
19
  try:
20
20
  from ._version import version as __version__
@@ -4,11 +4,12 @@
4
4
 
5
5
  import os
6
6
  import re
7
- import sys
8
7
  import shutil
8
+ import sys
9
9
  import urllib.request
10
10
  from pathlib import Path
11
- from pyrekordbox.config import write_db6_key_cache, _cache_file
11
+
12
+ from pyrekordbox.config import _cache_file, write_db6_key_cache
12
13
 
13
14
  KEY_SOURCES = [
14
15
  {
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.3.1'
16
- __version_tuple__ = version_tuple = (0, 3, 1)
15
+ __version__ = version = '0.4.0'
16
+ __version_tuple__ = version_tuple = (0, 4, 0)
@@ -5,6 +5,7 @@
5
5
  import re
6
6
  from pathlib import Path
7
7
  from typing import Union
8
+
8
9
  from . import structs
9
10
  from .file import AnlzFile
10
11
 
@@ -77,7 +78,7 @@ def walk_anlz_dirs(root_dir: Union[str, Path]):
77
78
  The path of the root directory.
78
79
 
79
80
  Yields
80
- -------
81
+ ------
81
82
  anlz_dir : str
82
83
  The path of a directory containing ANLZ files
83
84
  """
@@ -96,7 +97,7 @@ def walk_anlz_paths(root_dir: Union[str, Path]):
96
97
  The path of the root directory.
97
98
 
98
99
  Yields
99
- -------
100
+ ------
100
101
  anlz_dir : str
101
102
  The path of a directory containing ANLZ files.
102
103
  anlz_files : Sequence of str