pyrekordbox 0.3.2__tar.gz → 0.4.1__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 (333) hide show
  1. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.github/workflows/tests.yml +1 -1
  2. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.pre-commit-config.yaml +2 -2
  3. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/CHANGELOG.md +67 -1
  4. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/PKG-INFO +26 -39
  5. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/README.md +22 -37
  6. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/formats/db6.md +5 -5
  7. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/installation.md +5 -5
  8. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/db6.md +28 -0
  9. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyproject.toml +32 -5
  10. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/__init__.py +8 -8
  11. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/__main__.py +3 -2
  12. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/_version.py +9 -4
  13. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/anlz/__init__.py +3 -2
  14. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/anlz/file.py +4 -2
  15. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/anlz/tags.py +8 -16
  16. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/config.py +116 -47
  17. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/__init__.py +2 -2
  18. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/aux_files.py +3 -2
  19. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/database.py +130 -177
  20. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/registry.py +1 -0
  21. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/smartlist.py +9 -11
  22. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/tables.py +112 -132
  23. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/logger.py +0 -1
  24. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/mysettings/__init__.py +5 -4
  25. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/mysettings/file.py +3 -1
  26. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/rbxml.py +8 -12
  27. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/utils.py +4 -3
  28. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox.egg-info/PKG-INFO +26 -39
  29. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox.egg-info/SOURCES.txt +0 -1
  30. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox.egg-info/requires.txt +1 -0
  31. pyrekordbox-0.4.1/pyrekordbox.egg-info/top_level.txt +1 -0
  32. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/requirements.txt +1 -0
  33. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/test_anlz.py +3 -1
  34. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/test_config.py +92 -21
  35. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/test_db6.py +85 -17
  36. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/test_mysetting.py +5 -3
  37. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/test_xml.py +3 -1
  38. pyrekordbox-0.3.2/pyrekordbox/xml.py +0 -8
  39. pyrekordbox-0.3.2/pyrekordbox.egg-info/top_level.txt +0 -4
  40. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  41. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
  42. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  43. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.github/workflows/codeql.yml +0 -0
  44. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.github/workflows/pypi-publish.yml +0 -0
  45. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.gitignore +0 -0
  46. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.readthedocs.yaml +0 -0
  47. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/DEVSETTING.DAT +0 -0
  48. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/DJMMYSETTING.DAT +0 -0
  49. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/MYSETTING.DAT +0 -0
  50. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/MYSETTING2.DAT +0 -0
  51. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.2EX +0 -0
  52. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.DAT +0 -0
  53. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.EXT +0 -0
  54. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.2EX +0 -0
  55. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.DAT +0 -0
  56. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.EXT +0 -0
  57. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.2EX +0 -0
  58. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.DAT +0 -0
  59. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.EXT +0 -0
  60. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.2EX +0 -0
  61. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.DAT +0 -0
  62. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.EXT +0 -0
  63. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.2EX +0 -0
  64. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.DAT +0 -0
  65. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.EXT +0 -0
  66. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.2EX +0 -0
  67. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.DAT +0 -0
  68. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.EXT +0 -0
  69. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/rekordbox/export.pdb +0 -0
  70. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/rekordbox/exportExt.pdb +0 -0
  71. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/DEVSETTING.DAT +0 -0
  72. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/DJMMYSETTING.DAT +0 -0
  73. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/MYSETTING.DAT +0 -0
  74. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/MYSETTING2.DAT +0 -0
  75. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/beat_fx_quantize/off/DJMMYSETTING.DAT +0 -0
  76. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/beat_fx_quantize/on/DJMMYSETTING.DAT +0 -0
  77. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve/linear/DJMMYSETTING.DAT +0 -0
  78. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_bottom/DJMMYSETTING.DAT +0 -0
  79. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_top/DJMMYSETTING.DAT +0 -0
  80. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/exponential/DJMMYSETTING.DAT +0 -0
  81. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/linear/DJMMYSETTING.DAT +0 -0
  82. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/smooth/DJMMYSETTING.DAT +0 -0
  83. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/cross_fader_curve/constant/DJMMYSETTING.DAT +0 -0
  84. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/cross_fader_curve/fast_cut/DJMMYSETTING.DAT +0 -0
  85. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/cross_fader_curve/slow_cut/DJMMYSETTING.DAT +0 -0
  86. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/five/DJMMYSETTING.DAT +0 -0
  87. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/four/DJMMYSETTING.DAT +0 -0
  88. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/one/DJMMYSETTING.DAT +0 -0
  89. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/three/DJMMYSETTING.DAT +0 -0
  90. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/two/DJMMYSETTING.DAT +0 -0
  91. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/white/DJMMYSETTING.DAT +0 -0
  92. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/headphones_mono_split/mono_split/DJMMYSETTING.DAT +0 -0
  93. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/headphones_mono_split/stereo/DJMMYSETTING.DAT +0 -0
  94. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/headphones_pre_eq/post_eq/DJMMYSETTING.DAT +0 -0
  95. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/headphones_pre_eq/pre_eq/DJMMYSETTING.DAT +0 -0
  96. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/indicator_brightness/one/DJMMYSETTING.DAT +0 -0
  97. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/indicator_brightness/three/DJMMYSETTING.DAT +0 -0
  98. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/indicator_brightness/two/DJMMYSETTING.DAT +0 -0
  99. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/mic_low_cut/off/DJMMYSETTING.DAT +0 -0
  100. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/mic_low_cut/on/DJMMYSETTING.DAT +0 -0
  101. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_button_type/toggle/DJMMYSETTING.DAT +0 -0
  102. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_button_type/trigger/DJMMYSETTING.DAT +0 -0
  103. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/eight/DJMMYSETTING.DAT +0 -0
  104. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/eleven/DJMMYSETTING.DAT +0 -0
  105. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/fifteen/DJMMYSETTING.DAT +0 -0
  106. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/five/DJMMYSETTING.DAT +0 -0
  107. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/four/DJMMYSETTING.DAT +0 -0
  108. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/fourteen/DJMMYSETTING.DAT +0 -0
  109. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/nine/DJMMYSETTING.DAT +0 -0
  110. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/one/DJMMYSETTING.DAT +0 -0
  111. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/seven/DJMMYSETTING.DAT +0 -0
  112. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/six/DJMMYSETTING.DAT +0 -0
  113. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/sixteen/DJMMYSETTING.DAT +0 -0
  114. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/ten/DJMMYSETTING.DAT +0 -0
  115. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/thirteen/DJMMYSETTING.DAT +0 -0
  116. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/three/DJMMYSETTING.DAT +0 -0
  117. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/twelve/DJMMYSETTING.DAT +0 -0
  118. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/two/DJMMYSETTING.DAT +0 -0
  119. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_level/minus_12db/DJMMYSETTING.DAT +0 -0
  120. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_level/minus_18db/DJMMYSETTING.DAT +0 -0
  121. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_level/minus_24db/DJMMYSETTING.DAT +0 -0
  122. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_level/minus_6db/DJMMYSETTING.DAT +0 -0
  123. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_mode/advanced/DJMMYSETTING.DAT +0 -0
  124. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_mode/normal/DJMMYSETTING.DAT +0 -0
  125. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue/off/MYSETTING.DAT +0 -0
  126. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue/on/MYSETTING.DAT +0 -0
  127. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/memory/MYSETTING.DAT +0 -0
  128. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_36db/MYSETTING.DAT +0 -0
  129. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_42db/MYSETTING.DAT +0 -0
  130. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_48db/MYSETTING.DAT +0 -0
  131. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_54db/MYSETTING.DAT +0 -0
  132. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_60db/MYSETTING.DAT +0 -0
  133. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_66db/MYSETTING.DAT +0 -0
  134. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_72db/MYSETTING.DAT +0 -0
  135. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_78db/MYSETTING.DAT +0 -0
  136. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/disc_slot_illumination/bright/MYSETTING.DAT +0 -0
  137. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/disc_slot_illumination/dark/MYSETTING.DAT +0 -0
  138. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/disc_slot_illumination/off/MYSETTING.DAT +0 -0
  139. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/eject_lock/lock/MYSETTING.DAT +0 -0
  140. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/eject_lock/unlock/MYSETTING.DAT +0 -0
  141. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/hotcue_autoload/off/MYSETTING.DAT +0 -0
  142. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/hotcue_autoload/on/MYSETTING.DAT +0 -0
  143. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/hotcue_autoload/rekordbox/MYSETTING.DAT +0 -0
  144. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/hotcue_color/off/MYSETTING.DAT +0 -0
  145. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/hotcue_color/on/MYSETTING.DAT +0 -0
  146. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_mode/cdj/MYSETTING.DAT +0 -0
  147. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_mode/vinyl/MYSETTING.DAT +0 -0
  148. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_ring_brightness/bright/MYSETTING.DAT +0 -0
  149. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_ring_brightness/dark/MYSETTING.DAT +0 -0
  150. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_ring_brightness/off/MYSETTING.DAT +0 -0
  151. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_ring_indicator/off/MYSETTING.DAT +0 -0
  152. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_ring_indicator/on/MYSETTING.DAT +0 -0
  153. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/chinese_simplified/MYSETTING.DAT +0 -0
  154. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/chinese_traditional/MYSETTING.DAT +0 -0
  155. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/czech/MYSETTING.DAT +0 -0
  156. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/danish/MYSETTING.DAT +0 -0
  157. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/dutch/MYSETTING.DAT +0 -0
  158. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/english/MYSETTING.DAT +0 -0
  159. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/french/MYSETTING.DAT +0 -0
  160. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/german/MYSETTING.DAT +0 -0
  161. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/greek/MYSETTING.DAT +0 -0
  162. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/hungarian/MYSETTING.DAT +0 -0
  163. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/italian/MYSETTING.DAT +0 -0
  164. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/japanese/MYSETTING.DAT +0 -0
  165. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/korean/MYSETTING.DAT +0 -0
  166. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/portuguese/MYSETTING.DAT +0 -0
  167. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/russian/MYSETTING.DAT +0 -0
  168. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/spanish/MYSETTING.DAT +0 -0
  169. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/swedish/MYSETTING.DAT +0 -0
  170. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/turkish/MYSETTING.DAT +0 -0
  171. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/lcd_brightness/five/MYSETTING.DAT +0 -0
  172. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/lcd_brightness/four/MYSETTING.DAT +0 -0
  173. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/lcd_brightness/one/MYSETTING.DAT +0 -0
  174. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/lcd_brightness/three/MYSETTING.DAT +0 -0
  175. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/lcd_brightness/two/MYSETTING.DAT +0 -0
  176. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/master_tempo/off/MYSETTING.DAT +0 -0
  177. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/master_tempo/on/MYSETTING.DAT +0 -0
  178. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/needle_lock/lock/MYSETTING.DAT +0 -0
  179. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/needle_lock/unlock/MYSETTING.DAT +0 -0
  180. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/on_air_display/off/MYSETTING.DAT +0 -0
  181. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/on_air_display/on/MYSETTING.DAT +0 -0
  182. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/phase_meter/type1/MYSETTING.DAT +0 -0
  183. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/phase_meter/type2/MYSETTING.DAT +0 -0
  184. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/play_mode/continue_/MYSETTING.DAT +0 -0
  185. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/play_mode/single/MYSETTING.DAT +0 -0
  186. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize/off/MYSETTING.DAT +0 -0
  187. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize/on/MYSETTING.DAT +0 -0
  188. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize_beat_value/eighth/MYSETTING.DAT +0 -0
  189. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize_beat_value/half/MYSETTING.DAT +0 -0
  190. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize_beat_value/one/MYSETTING.DAT +0 -0
  191. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize_beat_value/quarter/MYSETTING.DAT +0 -0
  192. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/slip_flashing/off/MYSETTING.DAT +0 -0
  193. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/slip_flashing/on/MYSETTING.DAT +0 -0
  194. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/sync/off/MYSETTING.DAT +0 -0
  195. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/sync/on/MYSETTING.DAT +0 -0
  196. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/tempo_range/six/MYSETTING.DAT +0 -0
  197. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/tempo_range/sixteen/MYSETTING.DAT +0 -0
  198. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/tempo_range/ten/MYSETTING.DAT +0 -0
  199. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/tempo_range/wide/MYSETTING.DAT +0 -0
  200. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/time_mode/elapsed/MYSETTING.DAT +0 -0
  201. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/time_mode/remain/MYSETTING.DAT +0 -0
  202. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/eight/MYSETTING2.DAT +0 -0
  203. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/four/MYSETTING2.DAT +0 -0
  204. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/half/MYSETTING2.DAT +0 -0
  205. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/one/MYSETTING2.DAT +0 -0
  206. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixteen/MYSETTING2.DAT +0 -0
  207. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixtyfour/MYSETTING2.DAT +0 -0
  208. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/thirtytwo/MYSETTING2.DAT +0 -0
  209. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/two/MYSETTING2.DAT +0 -0
  210. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_display_mode/artwork/MYSETTING2.DAT +0 -0
  211. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_display_mode/auto/MYSETTING2.DAT +0 -0
  212. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_display_mode/info/MYSETTING2.DAT +0 -0
  213. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_display_mode/simple/MYSETTING2.DAT +0 -0
  214. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_lcd_brightness/five/MYSETTING2.DAT +0 -0
  215. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_lcd_brightness/four/MYSETTING2.DAT +0 -0
  216. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_lcd_brightness/one/MYSETTING2.DAT +0 -0
  217. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_lcd_brightness/three/MYSETTING2.DAT +0 -0
  218. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_lcd_brightness/two/MYSETTING2.DAT +0 -0
  219. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/pad_button_brightness/four/MYSETTING2.DAT +0 -0
  220. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/pad_button_brightness/one/MYSETTING2.DAT +0 -0
  221. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/pad_button_brightness/three/MYSETTING2.DAT +0 -0
  222. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/pad_button_brightness/two/MYSETTING2.DAT +0 -0
  223. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/release/MYSETTING2.DAT +0 -0
  224. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch/MYSETTING2.DAT +0 -0
  225. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch_release/MYSETTING2.DAT +0 -0
  226. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/waveform/phase_meter/MYSETTING2.DAT +0 -0
  227. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/waveform/waveform/MYSETTING2.DAT +0 -0
  228. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/waveform_divisions/phrase/MYSETTING2.DAT +0 -0
  229. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/waveform_divisions/time_scale/MYSETTING2.DAT +0 -0
  230. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/DEVSETTING.DAT +0 -0
  231. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/ExtData.edb +0 -0
  232. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/MYSETTING.DAT +0 -0
  233. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.DAT +0 -0
  234. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.EXT +0 -0
  235. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.DAT +0 -0
  236. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.EXT +0 -0
  237. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.DAT +0 -0
  238. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.EXT +0 -0
  239. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.DAT +0 -0
  240. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.EXT +0 -0
  241. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.DAT +0 -0
  242. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.EXT +0 -0
  243. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.DAT +0 -0
  244. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.EXT +0 -0
  245. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/datafile.edb +0 -0
  246. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/masterPlaylists3.xml +0 -0
  247. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/database.xml +0 -0
  248. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/datafile.edb +0 -0
  249. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/DEVSETTING.DAT +0 -0
  250. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/DJMMYSETTING.DAT +0 -0
  251. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/MYSETTING.DAT +0 -0
  252. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/MYSETTING2.DAT +0 -0
  253. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/masterPlaylists3.xml +0 -0
  254. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/masterPlaylists6.xml +0 -0
  255. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.2EX +0 -0
  256. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.DAT +0 -0
  257. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.EXT +0 -0
  258. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.2EX +0 -0
  259. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.DAT +0 -0
  260. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.EXT +0 -0
  261. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.2EX +0 -0
  262. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.DAT +0 -0
  263. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.EXT +0 -0
  264. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.2EX +0 -0
  265. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.DAT +0 -0
  266. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.EXT +0 -0
  267. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.2EX +0 -0
  268. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.DAT +0 -0
  269. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.EXT +0 -0
  270. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.2EX +0 -0
  271. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.DAT +0 -0
  272. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.EXT +0 -0
  273. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/database.xml +0 -0
  274. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/masterPlaylists6_template.xml +0 -0
  275. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/master_locked.db +0 -0
  276. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/master_unlocked.db +0 -0
  277. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/CONTRIBUTING.md +0 -0
  278. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/LICENSE +0 -0
  279. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/Makefile +0 -0
  280. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/make.bat +0 -0
  281. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_beat.svg +0 -0
  282. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_file.svg +0 -0
  283. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pco2.svg +0 -0
  284. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pcob.svg +0 -0
  285. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pcp2.svg +0 -0
  286. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pcpt.svg +0 -0
  287. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_ppth.svg +0 -0
  288. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pqt2.svg +0 -0
  289. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pqt2_2.svg +0 -0
  290. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pqtz.svg +0 -0
  291. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pssi.svg +0 -0
  292. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pssi_entry.svg +0 -0
  293. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pvbr.svg +0 -0
  294. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwav.svg +0 -0
  295. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv3.svg +0 -0
  296. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv4.svg +0 -0
  297. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv5.svg +0 -0
  298. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv5_entry.svg +0 -0
  299. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv6.svg +0 -0
  300. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv7.svg +0 -0
  301. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwvc.svg +0 -0
  302. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_tag.svg +0 -0
  303. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/x64dbg_rb_key.png +0 -0
  304. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/logos/dark/logo_primary.svg +0 -0
  305. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/logos/light/logo_primary.svg +0 -0
  306. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/logos/mid/logo_primary.svg +0 -0
  307. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_templates/apidoc/module.rst_t +0 -0
  308. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_templates/apidoc/package.rst_t +0 -0
  309. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_templates/apidoc/toc.rst_t +0 -0
  310. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_templates/autosummary/class.rst +0 -0
  311. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_templates/autosummary/module.rst +0 -0
  312. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/api.md +0 -0
  313. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/conf.py +0 -0
  314. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/development/changes.md +0 -0
  315. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/development/contributing.md +0 -0
  316. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/formats/anlz.md +0 -0
  317. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/formats/mysetting.md +0 -0
  318. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/formats/xml.md +0 -0
  319. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/index.md +0 -0
  320. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/key.md +0 -0
  321. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/quickstart.md +0 -0
  322. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/requirements.txt +0 -0
  323. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/anlz.md +0 -0
  324. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/configuration.md +0 -0
  325. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/index.md +0 -0
  326. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/mysetting.md +0 -0
  327. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/xml.md +0 -0
  328. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/anlz/structs.py +0 -0
  329. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/mysettings/structs.py +0 -0
  330. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox.egg-info/dependency_links.txt +0 -0
  331. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox.egg-info/not-zip-safe +0 -0
  332. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/setup.cfg +0 -0
  333. {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/__init__.py +0 -0
@@ -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.11.4
17
17
  hooks:
18
18
  # Run the linter.
19
19
  - id: ruff
@@ -1,5 +1,69 @@
1
1
  # What's New
2
2
 
3
+
4
+ <a name="v0.4.1"></a>
5
+ ## [v0.4.1] - 2025-04-20
6
+
7
+ This release improves database functionality by allowing commits when playlists are missing in
8
+ XML (with warnings for non-special playlists), adds timezone support for date fields,
9
+ and fixes date format issues.
10
+ Configuration enhancements include relocating the pyrekordbox cache file to the user's
11
+ appdata directory and fixing an asar file decoding error.
12
+
13
+ ### Improvements/Bug Fixes
14
+
15
+ - **db:** **allow commiting if playlist is not found in XML ([#149](https://github.com/dylanljones/pyrekordbox/issues/149))**
16
+ This fixes an issue where the changes to the DB can not be commited if the playlist is missing
17
+ in the playlist-xml. A warning is now shown instead. The warning is not shown for special
18
+ playlists.
19
+ - **db:** **add timezone support and fix date format issue ([#161](https://github.com/dylanljones/pyrekordbox/issues/161))**
20
+ Date formats in the DB are now converted to the local timezone. It is now also possible to read date fields with other formats.
21
+ - **config:** **move pyrekordbox cache file to appdir**
22
+ The cache file is now stored in the appdata directory of the user.
23
+ This avoids writing to the pyrekordbox package directory.
24
+ - **config:** **fix asar file decoding error ([#154](https://github.com/dylanljones/pyrekordbox/issues/154))**
25
+
26
+
27
+ <a name="v0.4.0"></a>
28
+ ## [v0.4.0] - 2025-02-12
29
+
30
+ This release adds the ability to create new tracks in the Rekordbox v6 database.
31
+ It also adds support for Rekordbox 7 and fixes various bugs.
32
+
33
+ ### New Features
34
+
35
+ - **db:** **add method for creating tracks ([#121](https://github.com/dylanljones/pyrekordbox/pull/121))**
36
+ New tracks can now be created and added to the Rekordbox collection.
37
+ Note that the user still has to reload tags/analyze the newly added tracks in Rekordbox.
38
+ - **config:** **add Rekordbox 7 support ([#133](https://github.com/dylanljones/pyrekordbox/issues/133))**
39
+
40
+ ### Improvements/Bug Fixes
41
+
42
+ - **db:** **fix missing proxy association in table dict**
43
+ The association proxies were missing in the `to_dict` method.
44
+ The keys are now also cached.
45
+ - **db:** **fix an error with .aif file extension ([#138](https://github.com/dylanljones/pyrekordbox/pull/138))**
46
+ - **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))**
47
+ Fix smartlists not always working correctly due to unneccessary bit shift for specific MyTag values
48
+ - **db:** **fix different timezone assertion ([#137](https://github.com/dylanljones/pyrekordbox/pull/137))**
49
+ Allow different timezones other than "+00:00" in the datetime format of the DB.
50
+ - **xml:** **save xml as utf-8 ([#135](https://github.com/dylanljones/pyrekordbox/pull/135))**
51
+ - **build:** **use pre-built sqlcipher wheels as dependency ([#134](https://github.com/dylanljones/pyrekordbox/pull/134))**
52
+ The sqlcipher dependency can now be installed using pre-built wheels with included sqlcipher binaries. This makes the whole library installable via pip!
53
+ - **xml:** **remove deprecated `xml` module**
54
+ - **db:** **remove deprecated `open_rekordbox_database` method**
55
+
56
+ ### Documentation
57
+
58
+ - **db:** **add documentation for adding tracks**
59
+ - **db:** **add more info to djmdContent table**
60
+
61
+ ### BREAKING CHANGE
62
+
63
+ Remove deprecated `open_rekordbox_database` method. Use the `Rekordbox6Database` database handler instead!
64
+ Remove deprecated `xml` module. Use the `rbxml` module instead!
65
+
66
+
3
67
  <a name="v0.3.2"></a>
4
68
  ## [v0.3.2] - 2024-01-05
5
69
 
@@ -570,7 +634,9 @@ This release contains documentation fixes.
570
634
  - **add missing djmd tables to `master.db` database documentation**
571
635
 
572
636
 
573
- [Unreleased]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.2...HEAD
637
+ [Unreleased]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.1...HEAD
638
+ [v0.4.1]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.0...v0.4.1
639
+ [v0.4.0]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.2...v0.4.0
574
640
  [v0.3.2]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.1...v0.3.2
575
641
  [v0.3.1]: https://github.com/dylanljones/pyrekordbox/compare/0.3.0...v0.3.1
576
642
  [0.3.0]: https://github.com/dylanljones/pyrekordbox/compare/0.2.3...0.3.0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pyrekordbox
3
- Version: 0.3.2
3
+ Version: 0.4.1
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
@@ -54,12 +54,14 @@ 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
60
61
  Requires-Dist: hypothesis>=6.0.0; extra == "test"
61
62
  Requires-Dist: pytest>=6.2.0; extra == "test"
62
63
  Requires-Dist: pytest-cov; extra == "test"
64
+ Dynamic: license-file
63
65
 
64
66
 
65
67
  <p align="center">
@@ -85,11 +87,11 @@ Pioneers Rekordbox DJ Software. It currently supports
85
87
  - Analysis files (ANLZ)
86
88
  - My-Setting files
87
89
 
88
- Tested Rekordbox versions: ``5.8.6 | 6.5.3 | 6.7.7``
90
+ Tested Rekordbox versions: ``5.8.6 | 6.7.7 | 7.0.9``
89
91
 
90
-
91
- |⚠️| 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! |
92
- |----|:----------------------------------------------------------------------------------------------------------------------------------------------------------------|
92
+ > [!WARNING]
93
+ > This project is still under development and might contain bugs or have breaking API changes in the future.
94
+ > Check the [changelog][CHANGELOG] for recent changes!
93
95
 
94
96
 
95
97
  ## 🔧 Installation
@@ -107,40 +109,20 @@ where `VERSION` is a release, tag or branch name.
107
109
 
108
110
  ### Dependencies
109
111
 
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
112
 
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].
113
+ Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
114
+ Pyrekordbox tries to install pre-built wheels with included sqlcipher binaries via the [sqlcipher3-wheels] package.
115
+ If this fails, it can be installed manually following the [installation guide][installation].
136
116
 
137
117
 
138
118
  ## 🚀 Quick-Start
139
119
 
140
120
  [Read the full documentation on ReadTheDocs!][documentation]
141
121
 
142
- | ❗ | Please make sure to back up your Rekordbox collection before making changes with pyrekordbox or developing/testing new features. The backup dialog can be found under "File" > "Library" > "Backup Library" |
143
- |----|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
122
+ > [!CAUTION]
123
+ > Please make sure to back up your Rekordbox collection before making changes with pyrekordbox
124
+ > or developing/testing new features.
125
+ > The backup dialog can be found under "File" > "Library" > "Backup Library"
144
126
 
145
127
 
146
128
  ### Configuration
@@ -166,10 +148,10 @@ Alternatively the two paths can be specified in a configuration file under the s
166
148
  pyrekordbox.cfg and pyrekordbox.yaml.
167
149
 
168
150
 
169
- ### Rekordbox 6 database
151
+ ### Rekordbox 6/7 database
170
152
 
171
- Rekordbox 6 now uses a SQLite database for storing the collection content.
172
- Unfortunatly, the new `master.db` SQLite database is encrypted using
153
+ Rekordbox 6 and 7 use a SQLite database for storing the collection content.
154
+ Unfortunatly, the `master.db` SQLite database is encrypted using
173
155
  [SQLCipher][sqlcipher], which means it can't be used without the encryption key.
174
156
  However, since your data is stored and used locally, the key must be present on the
175
157
  machine running Rekordbox.
@@ -195,10 +177,15 @@ can be changed via the corresponding property of the object:
195
177
  ````python
196
178
  content = db.get_content()[0]
197
179
  content.Title = "New Title"
180
+ db.commit()
198
181
  ````
199
- Some fields are stored as references to other tables, for example the artist of a track.
200
- Check the [documentation][db6-doc] of the corresponding object for more information.
182
+
183
+ > [!NOTE]
184
+ > Some fields are stored as references to other tables, for example the artist of a track.
185
+ > Check the [documentation][db6-doc] of the corresponding object for more information.
186
+
201
187
  So far only a few tables support adding or deleting entries:
188
+ - ``DjmdContent``: Tracks
202
189
  - ``DjmdPlaylist``: Playlists/Playlist Folders
203
190
  - ``DjmdSongPlaylist``: Songs in a playlist
204
191
  - ``DjmdAlbum``: Albums
@@ -388,7 +375,7 @@ the CI setup since it requires a working Rekordbox installation.
388
375
 
389
376
  [repo]: https://github.com/dylanljones/pyrekordbox
390
377
  [sqlcipher]: https://www.zetetic.net/sqlcipher/open-source/
391
- [sqlcipher3]: https://github.com/coleifer/sqlcipher3
378
+ [sqlcipher3-wheels]: https://github.com/laggykiller/sqlcipher3
392
379
  [rekordcrate]: https://github.com/Holzhaus/rekordcrate
393
380
  [crate-digger]: https://github.com/Deep-Symmetry/crate-digger
394
381
  [supbox]: https://github.com/gabek/supbox
@@ -22,11 +22,11 @@ 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
-
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! |
29
- |----|:----------------------------------------------------------------------------------------------------------------------------------------------------------------|
27
+ > [!WARNING]
28
+ > This project is still under development and might contain bugs or have breaking API changes in the future.
29
+ > Check the [changelog][CHANGELOG] for recent changes!
30
30
 
31
31
 
32
32
  ## 🔧 Installation
@@ -44,40 +44,20 @@ 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
76
54
 
77
55
  [Read the full documentation on ReadTheDocs!][documentation]
78
56
 
79
- | ❗ | Please make sure to back up your Rekordbox collection before making changes with pyrekordbox or developing/testing new features. The backup dialog can be found under "File" > "Library" > "Backup Library" |
80
- |----|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
57
+ > [!CAUTION]
58
+ > Please make sure to back up your Rekordbox collection before making changes with pyrekordbox
59
+ > or developing/testing new features.
60
+ > The backup dialog can be found under "File" > "Library" > "Backup Library"
81
61
 
82
62
 
83
63
  ### Configuration
@@ -103,10 +83,10 @@ Alternatively the two paths can be specified in a configuration file under the s
103
83
  pyrekordbox.cfg and pyrekordbox.yaml.
104
84
 
105
85
 
106
- ### Rekordbox 6 database
86
+ ### Rekordbox 6/7 database
107
87
 
108
- Rekordbox 6 now uses a SQLite database for storing the collection content.
109
- Unfortunatly, the new `master.db` SQLite database is encrypted using
88
+ Rekordbox 6 and 7 use a SQLite database for storing the collection content.
89
+ Unfortunatly, the `master.db` SQLite database is encrypted using
110
90
  [SQLCipher][sqlcipher], which means it can't be used without the encryption key.
111
91
  However, since your data is stored and used locally, the key must be present on the
112
92
  machine running Rekordbox.
@@ -132,10 +112,15 @@ can be changed via the corresponding property of the object:
132
112
  ````python
133
113
  content = db.get_content()[0]
134
114
  content.Title = "New Title"
115
+ db.commit()
135
116
  ````
136
- Some fields are stored as references to other tables, for example the artist of a track.
137
- Check the [documentation][db6-doc] of the corresponding object for more information.
117
+
118
+ > [!NOTE]
119
+ > Some fields are stored as references to other tables, for example the artist of a track.
120
+ > Check the [documentation][db6-doc] of the corresponding object for more information.
121
+
138
122
  So far only a few tables support adding or deleting entries:
123
+ - ``DjmdContent``: Tracks
139
124
  - ``DjmdPlaylist``: Playlists/Playlist Folders
140
125
  - ``DjmdSongPlaylist``: Songs in a playlist
141
126
  - ``DjmdAlbum``: Albums
@@ -325,7 +310,7 @@ the CI setup since it requires a working Rekordbox installation.
325
310
 
326
311
  [repo]: https://github.com/dylanljones/pyrekordbox
327
312
  [sqlcipher]: https://www.zetetic.net/sqlcipher/open-source/
328
- [sqlcipher3]: https://github.com/coleifer/sqlcipher3
313
+ [sqlcipher3-wheels]: https://github.com/laggykiller/sqlcipher3
329
314
  [rekordcrate]: https://github.com/Holzhaus/rekordcrate
330
315
  [crate-digger]: https://github.com/Deep-Symmetry/crate-digger
331
316
  [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
  - ?
@@ -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
@@ -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"
@@ -91,7 +93,7 @@ exclude = [
91
93
  "*/_version.py",
92
94
  "docs/*",
93
95
  ]
94
- line-length = 88
96
+ line-length = 100
95
97
  indent-width = 4
96
98
 
97
99
  [tool.ruff.lint]
@@ -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
  {
@@ -1,8 +1,13 @@
1
- # file generated by setuptools_scm
1
+ # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
+
4
+ __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
5
+
3
6
  TYPE_CHECKING = False
4
7
  if TYPE_CHECKING:
5
- from typing import Tuple, Union
8
+ from typing import Tuple
9
+ from typing import Union
10
+
6
11
  VERSION_TUPLE = Tuple[Union[int, str], ...]
7
12
  else:
8
13
  VERSION_TUPLE = object
@@ -12,5 +17,5 @@ __version__: str
12
17
  __version_tuple__: VERSION_TUPLE
13
18
  version_tuple: VERSION_TUPLE
14
19
 
15
- __version__ = version = '0.3.2'
16
- __version_tuple__ = version_tuple = (0, 3, 2)
20
+ __version__ = version = '0.4.1'
21
+ __version_tuple__ = version_tuple = (0, 4, 1)
@@ -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
@@ -6,10 +6,12 @@ import logging
6
6
  from collections import abc
7
7
  from pathlib import Path
8
8
  from typing import Union
9
- from .tags import TAGS
10
- from . import structs
9
+
11
10
  from construct import Int16ub
12
11
 
12
+ from . import structs
13
+ from .tags import TAGS
14
+
13
15
  logger = logging.getLogger(__name__)
14
16
 
15
17
  XOR_MASK = bytearray.fromhex("CB E1 EE FA E5 EE AD EE E9 D2 E9 EB E1 E9 F3 E8 E9 F4 E1")