pyrekordbox 0.4.0__tar.gz → 0.4.2__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.4.0 → pyrekordbox-0.4.2}/.github/workflows/tests.yml +3 -1
  2. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.pre-commit-config.yaml +1 -1
  3. pyrekordbox-0.4.2/.testdata/empty.mp3 +0 -0
  4. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/CHANGELOG.md +43 -1
  5. {pyrekordbox-0.4.0/pyrekordbox.egg-info → pyrekordbox-0.4.2}/PKG-INFO +16 -9
  6. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/README.md +13 -7
  7. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/formats/db6.md +1 -1
  8. pyrekordbox-0.4.2/docs/source/tutorial/anlz.md +88 -0
  9. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/tutorial/mysetting.md +17 -1
  10. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyproject.toml +1 -1
  11. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/__main__.py +3 -2
  12. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/_version.py +9 -4
  13. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/anlz/tags.py +5 -15
  14. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/config.py +50 -33
  15. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/database.py +41 -78
  16. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/smartlist.py +2 -5
  17. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/tables.py +72 -120
  18. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/rbxml.py +11 -16
  19. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2/pyrekordbox.egg-info}/PKG-INFO +16 -9
  20. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/SOURCES.txt +2 -0
  21. pyrekordbox-0.4.2/tests/test_cli.py +31 -0
  22. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/tests/test_config.py +3 -9
  23. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/tests/test_db6.py +34 -0
  24. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/tests/test_xml.py +59 -1
  25. pyrekordbox-0.4.0/docs/source/tutorial/anlz.md +0 -7
  26. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  27. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
  28. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  29. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.github/workflows/codeql.yml +0 -0
  30. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.github/workflows/pypi-publish.yml +0 -0
  31. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.gitignore +0 -0
  32. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.readthedocs.yaml +0 -0
  33. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/DEVSETTING.DAT +0 -0
  34. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/DJMMYSETTING.DAT +0 -0
  35. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/MYSETTING.DAT +0 -0
  36. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/MYSETTING2.DAT +0 -0
  37. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.2EX +0 -0
  38. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.DAT +0 -0
  39. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.EXT +0 -0
  40. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.2EX +0 -0
  41. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.DAT +0 -0
  42. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.EXT +0 -0
  43. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.2EX +0 -0
  44. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.DAT +0 -0
  45. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.EXT +0 -0
  46. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.2EX +0 -0
  47. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.DAT +0 -0
  48. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.EXT +0 -0
  49. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.2EX +0 -0
  50. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.DAT +0 -0
  51. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.EXT +0 -0
  52. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.2EX +0 -0
  53. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.DAT +0 -0
  54. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.EXT +0 -0
  55. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/rekordbox/export.pdb +0 -0
  56. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/rekordbox/exportExt.pdb +0 -0
  57. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/DEVSETTING.DAT +0 -0
  58. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/DJMMYSETTING.DAT +0 -0
  59. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/MYSETTING.DAT +0 -0
  60. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/MYSETTING2.DAT +0 -0
  61. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/beat_fx_quantize/off/DJMMYSETTING.DAT +0 -0
  62. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/beat_fx_quantize/on/DJMMYSETTING.DAT +0 -0
  63. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve/linear/DJMMYSETTING.DAT +0 -0
  64. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_bottom/DJMMYSETTING.DAT +0 -0
  65. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_top/DJMMYSETTING.DAT +0 -0
  66. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/exponential/DJMMYSETTING.DAT +0 -0
  67. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/linear/DJMMYSETTING.DAT +0 -0
  68. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/smooth/DJMMYSETTING.DAT +0 -0
  69. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/cross_fader_curve/constant/DJMMYSETTING.DAT +0 -0
  70. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/cross_fader_curve/fast_cut/DJMMYSETTING.DAT +0 -0
  71. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/cross_fader_curve/slow_cut/DJMMYSETTING.DAT +0 -0
  72. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/five/DJMMYSETTING.DAT +0 -0
  73. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/four/DJMMYSETTING.DAT +0 -0
  74. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/one/DJMMYSETTING.DAT +0 -0
  75. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/three/DJMMYSETTING.DAT +0 -0
  76. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/two/DJMMYSETTING.DAT +0 -0
  77. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/white/DJMMYSETTING.DAT +0 -0
  78. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_mono_split/mono_split/DJMMYSETTING.DAT +0 -0
  79. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_mono_split/stereo/DJMMYSETTING.DAT +0 -0
  80. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_pre_eq/post_eq/DJMMYSETTING.DAT +0 -0
  81. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_pre_eq/pre_eq/DJMMYSETTING.DAT +0 -0
  82. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/indicator_brightness/one/DJMMYSETTING.DAT +0 -0
  83. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/indicator_brightness/three/DJMMYSETTING.DAT +0 -0
  84. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/indicator_brightness/two/DJMMYSETTING.DAT +0 -0
  85. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/mic_low_cut/off/DJMMYSETTING.DAT +0 -0
  86. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/mic_low_cut/on/DJMMYSETTING.DAT +0 -0
  87. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_button_type/toggle/DJMMYSETTING.DAT +0 -0
  88. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_button_type/trigger/DJMMYSETTING.DAT +0 -0
  89. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/eight/DJMMYSETTING.DAT +0 -0
  90. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/eleven/DJMMYSETTING.DAT +0 -0
  91. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/fifteen/DJMMYSETTING.DAT +0 -0
  92. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/five/DJMMYSETTING.DAT +0 -0
  93. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/four/DJMMYSETTING.DAT +0 -0
  94. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/fourteen/DJMMYSETTING.DAT +0 -0
  95. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/nine/DJMMYSETTING.DAT +0 -0
  96. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/one/DJMMYSETTING.DAT +0 -0
  97. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/seven/DJMMYSETTING.DAT +0 -0
  98. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/six/DJMMYSETTING.DAT +0 -0
  99. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/sixteen/DJMMYSETTING.DAT +0 -0
  100. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/ten/DJMMYSETTING.DAT +0 -0
  101. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/thirteen/DJMMYSETTING.DAT +0 -0
  102. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/three/DJMMYSETTING.DAT +0 -0
  103. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/twelve/DJMMYSETTING.DAT +0 -0
  104. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/two/DJMMYSETTING.DAT +0 -0
  105. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_12db/DJMMYSETTING.DAT +0 -0
  106. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_18db/DJMMYSETTING.DAT +0 -0
  107. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_24db/DJMMYSETTING.DAT +0 -0
  108. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_6db/DJMMYSETTING.DAT +0 -0
  109. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_mode/advanced/DJMMYSETTING.DAT +0 -0
  110. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_mode/normal/DJMMYSETTING.DAT +0 -0
  111. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue/off/MYSETTING.DAT +0 -0
  112. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue/on/MYSETTING.DAT +0 -0
  113. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/memory/MYSETTING.DAT +0 -0
  114. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_36db/MYSETTING.DAT +0 -0
  115. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_42db/MYSETTING.DAT +0 -0
  116. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_48db/MYSETTING.DAT +0 -0
  117. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_54db/MYSETTING.DAT +0 -0
  118. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_60db/MYSETTING.DAT +0 -0
  119. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_66db/MYSETTING.DAT +0 -0
  120. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_72db/MYSETTING.DAT +0 -0
  121. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_78db/MYSETTING.DAT +0 -0
  122. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/disc_slot_illumination/bright/MYSETTING.DAT +0 -0
  123. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/disc_slot_illumination/dark/MYSETTING.DAT +0 -0
  124. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/disc_slot_illumination/off/MYSETTING.DAT +0 -0
  125. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/eject_lock/lock/MYSETTING.DAT +0 -0
  126. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/eject_lock/unlock/MYSETTING.DAT +0 -0
  127. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_autoload/off/MYSETTING.DAT +0 -0
  128. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_autoload/on/MYSETTING.DAT +0 -0
  129. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_autoload/rekordbox/MYSETTING.DAT +0 -0
  130. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_color/off/MYSETTING.DAT +0 -0
  131. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_color/on/MYSETTING.DAT +0 -0
  132. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_mode/cdj/MYSETTING.DAT +0 -0
  133. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_mode/vinyl/MYSETTING.DAT +0 -0
  134. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_brightness/bright/MYSETTING.DAT +0 -0
  135. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_brightness/dark/MYSETTING.DAT +0 -0
  136. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_brightness/off/MYSETTING.DAT +0 -0
  137. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_indicator/off/MYSETTING.DAT +0 -0
  138. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_indicator/on/MYSETTING.DAT +0 -0
  139. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/chinese_simplified/MYSETTING.DAT +0 -0
  140. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/chinese_traditional/MYSETTING.DAT +0 -0
  141. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/czech/MYSETTING.DAT +0 -0
  142. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/danish/MYSETTING.DAT +0 -0
  143. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/dutch/MYSETTING.DAT +0 -0
  144. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/english/MYSETTING.DAT +0 -0
  145. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/french/MYSETTING.DAT +0 -0
  146. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/german/MYSETTING.DAT +0 -0
  147. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/greek/MYSETTING.DAT +0 -0
  148. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/hungarian/MYSETTING.DAT +0 -0
  149. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/italian/MYSETTING.DAT +0 -0
  150. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/japanese/MYSETTING.DAT +0 -0
  151. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/korean/MYSETTING.DAT +0 -0
  152. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/portuguese/MYSETTING.DAT +0 -0
  153. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/russian/MYSETTING.DAT +0 -0
  154. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/spanish/MYSETTING.DAT +0 -0
  155. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/swedish/MYSETTING.DAT +0 -0
  156. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/turkish/MYSETTING.DAT +0 -0
  157. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/five/MYSETTING.DAT +0 -0
  158. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/four/MYSETTING.DAT +0 -0
  159. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/one/MYSETTING.DAT +0 -0
  160. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/three/MYSETTING.DAT +0 -0
  161. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/two/MYSETTING.DAT +0 -0
  162. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/master_tempo/off/MYSETTING.DAT +0 -0
  163. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/master_tempo/on/MYSETTING.DAT +0 -0
  164. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/needle_lock/lock/MYSETTING.DAT +0 -0
  165. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/needle_lock/unlock/MYSETTING.DAT +0 -0
  166. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/on_air_display/off/MYSETTING.DAT +0 -0
  167. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/on_air_display/on/MYSETTING.DAT +0 -0
  168. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/phase_meter/type1/MYSETTING.DAT +0 -0
  169. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/phase_meter/type2/MYSETTING.DAT +0 -0
  170. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/play_mode/continue_/MYSETTING.DAT +0 -0
  171. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/play_mode/single/MYSETTING.DAT +0 -0
  172. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize/off/MYSETTING.DAT +0 -0
  173. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize/on/MYSETTING.DAT +0 -0
  174. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/eighth/MYSETTING.DAT +0 -0
  175. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/half/MYSETTING.DAT +0 -0
  176. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/one/MYSETTING.DAT +0 -0
  177. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/quarter/MYSETTING.DAT +0 -0
  178. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/slip_flashing/off/MYSETTING.DAT +0 -0
  179. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/slip_flashing/on/MYSETTING.DAT +0 -0
  180. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/sync/off/MYSETTING.DAT +0 -0
  181. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/sync/on/MYSETTING.DAT +0 -0
  182. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/six/MYSETTING.DAT +0 -0
  183. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/sixteen/MYSETTING.DAT +0 -0
  184. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/ten/MYSETTING.DAT +0 -0
  185. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/wide/MYSETTING.DAT +0 -0
  186. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/time_mode/elapsed/MYSETTING.DAT +0 -0
  187. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/time_mode/remain/MYSETTING.DAT +0 -0
  188. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/eight/MYSETTING2.DAT +0 -0
  189. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/four/MYSETTING2.DAT +0 -0
  190. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/half/MYSETTING2.DAT +0 -0
  191. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/one/MYSETTING2.DAT +0 -0
  192. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixteen/MYSETTING2.DAT +0 -0
  193. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixtyfour/MYSETTING2.DAT +0 -0
  194. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/thirtytwo/MYSETTING2.DAT +0 -0
  195. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/two/MYSETTING2.DAT +0 -0
  196. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/artwork/MYSETTING2.DAT +0 -0
  197. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/auto/MYSETTING2.DAT +0 -0
  198. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/info/MYSETTING2.DAT +0 -0
  199. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/simple/MYSETTING2.DAT +0 -0
  200. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/five/MYSETTING2.DAT +0 -0
  201. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/four/MYSETTING2.DAT +0 -0
  202. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/one/MYSETTING2.DAT +0 -0
  203. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/three/MYSETTING2.DAT +0 -0
  204. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/two/MYSETTING2.DAT +0 -0
  205. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/four/MYSETTING2.DAT +0 -0
  206. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/one/MYSETTING2.DAT +0 -0
  207. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/three/MYSETTING2.DAT +0 -0
  208. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/two/MYSETTING2.DAT +0 -0
  209. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/release/MYSETTING2.DAT +0 -0
  210. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch/MYSETTING2.DAT +0 -0
  211. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch_release/MYSETTING2.DAT +0 -0
  212. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform/phase_meter/MYSETTING2.DAT +0 -0
  213. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform/waveform/MYSETTING2.DAT +0 -0
  214. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform_divisions/phrase/MYSETTING2.DAT +0 -0
  215. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform_divisions/time_scale/MYSETTING2.DAT +0 -0
  216. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/DEVSETTING.DAT +0 -0
  217. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/ExtData.edb +0 -0
  218. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/MYSETTING.DAT +0 -0
  219. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.DAT +0 -0
  220. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.EXT +0 -0
  221. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.DAT +0 -0
  222. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.EXT +0 -0
  223. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.DAT +0 -0
  224. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.EXT +0 -0
  225. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.DAT +0 -0
  226. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.EXT +0 -0
  227. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.DAT +0 -0
  228. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.EXT +0 -0
  229. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.DAT +0 -0
  230. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.EXT +0 -0
  231. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/datafile.edb +0 -0
  232. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/masterPlaylists3.xml +0 -0
  233. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/database.xml +0 -0
  234. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/datafile.edb +0 -0
  235. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/DEVSETTING.DAT +0 -0
  236. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/DJMMYSETTING.DAT +0 -0
  237. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/MYSETTING.DAT +0 -0
  238. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/MYSETTING2.DAT +0 -0
  239. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/masterPlaylists3.xml +0 -0
  240. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/masterPlaylists6.xml +0 -0
  241. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.2EX +0 -0
  242. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.DAT +0 -0
  243. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.EXT +0 -0
  244. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.2EX +0 -0
  245. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.DAT +0 -0
  246. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.EXT +0 -0
  247. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.2EX +0 -0
  248. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.DAT +0 -0
  249. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.EXT +0 -0
  250. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.2EX +0 -0
  251. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.DAT +0 -0
  252. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.EXT +0 -0
  253. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.2EX +0 -0
  254. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.DAT +0 -0
  255. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.EXT +0 -0
  256. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.2EX +0 -0
  257. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.DAT +0 -0
  258. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.EXT +0 -0
  259. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/database.xml +0 -0
  260. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/masterPlaylists6_template.xml +0 -0
  261. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/master_locked.db +0 -0
  262. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/master_unlocked.db +0 -0
  263. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/CONTRIBUTING.md +0 -0
  264. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/LICENSE +0 -0
  265. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/Makefile +0 -0
  266. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/make.bat +0 -0
  267. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_beat.svg +0 -0
  268. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_file.svg +0 -0
  269. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pco2.svg +0 -0
  270. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pcob.svg +0 -0
  271. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pcp2.svg +0 -0
  272. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pcpt.svg +0 -0
  273. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_ppth.svg +0 -0
  274. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pqt2.svg +0 -0
  275. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pqt2_2.svg +0 -0
  276. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pqtz.svg +0 -0
  277. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pssi.svg +0 -0
  278. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pssi_entry.svg +0 -0
  279. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pvbr.svg +0 -0
  280. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwav.svg +0 -0
  281. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv3.svg +0 -0
  282. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv4.svg +0 -0
  283. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv5.svg +0 -0
  284. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv5_entry.svg +0 -0
  285. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv6.svg +0 -0
  286. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv7.svg +0 -0
  287. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwvc.svg +0 -0
  288. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_tag.svg +0 -0
  289. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/x64dbg_rb_key.png +0 -0
  290. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/logos/dark/logo_primary.svg +0 -0
  291. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/logos/light/logo_primary.svg +0 -0
  292. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/logos/mid/logo_primary.svg +0 -0
  293. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_templates/apidoc/module.rst_t +0 -0
  294. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_templates/apidoc/package.rst_t +0 -0
  295. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_templates/apidoc/toc.rst_t +0 -0
  296. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_templates/autosummary/class.rst +0 -0
  297. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_templates/autosummary/module.rst +0 -0
  298. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/api.md +0 -0
  299. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/conf.py +0 -0
  300. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/development/changes.md +0 -0
  301. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/development/contributing.md +0 -0
  302. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/formats/anlz.md +0 -0
  303. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/formats/mysetting.md +0 -0
  304. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/formats/xml.md +0 -0
  305. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/index.md +0 -0
  306. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/installation.md +0 -0
  307. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/key.md +0 -0
  308. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/quickstart.md +0 -0
  309. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/requirements.txt +0 -0
  310. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/tutorial/configuration.md +0 -0
  311. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/tutorial/db6.md +0 -0
  312. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/tutorial/index.md +0 -0
  313. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/tutorial/xml.md +0 -0
  314. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/__init__.py +0 -0
  315. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/anlz/__init__.py +0 -0
  316. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/anlz/file.py +0 -0
  317. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/anlz/structs.py +0 -0
  318. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/__init__.py +0 -0
  319. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/aux_files.py +0 -0
  320. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/registry.py +0 -0
  321. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/logger.py +0 -0
  322. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/mysettings/__init__.py +0 -0
  323. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/mysettings/file.py +0 -0
  324. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/mysettings/structs.py +0 -0
  325. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/utils.py +0 -0
  326. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/dependency_links.txt +0 -0
  327. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/not-zip-safe +0 -0
  328. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/requires.txt +0 -0
  329. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/top_level.txt +0 -0
  330. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/requirements.txt +0 -0
  331. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/setup.cfg +0 -0
  332. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/tests/__init__.py +0 -0
  333. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/tests/test_anlz.py +0 -0
  334. {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/tests/test_mysetting.py +0 -0
@@ -74,7 +74,9 @@ jobs:
74
74
  pytest tests/ --cov=pyrekordbox --cov-report=xml -v
75
75
 
76
76
  - name: Upload coverage to Codecov
77
- uses: codecov/codecov-action@v3
77
+ uses: codecov/codecov-action@v4
78
+ env:
79
+ CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
78
80
  with:
79
81
  env_vars: OS,PYTHON
80
82
  verbose: True
@@ -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.9.6
16
+ rev: v0.11.6
17
17
  hooks:
18
18
  # Run the linter.
19
19
  - id: ruff
Binary file
@@ -1,5 +1,45 @@
1
1
  # What's New
2
2
 
3
+
4
+ <a name="v0.4.2"></a>
5
+ ## [v0.4.2] - 2025-04-21
6
+
7
+ This release contains bug fixes for the command-line interface and XML handling.
8
+
9
+ ### Improvements/Bug Fixes
10
+
11
+ - **cli:** **fix import error when downloading db key via CLI ([#162](https://github.com/dylanljones/pyrekordbox/pull/162))**
12
+ - **xml:** **fix get_track method to accept Location parameter**
13
+
14
+ ### Documentation
15
+
16
+ - **anlz:** **add simple tutorial for ANLZ files**
17
+ - **db:** **add ActiveLoop description**
18
+
19
+
20
+ <a name="v0.4.1"></a>
21
+ ## [v0.4.1] - 2025-04-20
22
+
23
+ This release improves database functionality by allowing commits when playlists are missing in
24
+ XML (with warnings for non-special playlists), adds timezone support for date fields,
25
+ and fixes date format issues.
26
+ Configuration enhancements include relocating the pyrekordbox cache file to the user's
27
+ appdata directory and fixing an asar file decoding error.
28
+
29
+ ### Improvements/Bug Fixes
30
+
31
+ - **db:** **allow commiting if playlist is not found in XML ([#149](https://github.com/dylanljones/pyrekordbox/issues/149))**
32
+ This fixes an issue where the changes to the DB can not be commited if the playlist is missing
33
+ in the playlist-xml. A warning is now shown instead. The warning is not shown for special
34
+ playlists.
35
+ - **db:** **add timezone support and fix date format issue ([#161](https://github.com/dylanljones/pyrekordbox/issues/161))**
36
+ Date formats in the DB are now converted to the local timezone. It is now also possible to read date fields with other formats.
37
+ - **config:** **move pyrekordbox cache file to appdir**
38
+ The cache file is now stored in the appdata directory of the user.
39
+ This avoids writing to the pyrekordbox package directory.
40
+ - **config:** **fix asar file decoding error ([#154](https://github.com/dylanljones/pyrekordbox/issues/154))**
41
+
42
+
3
43
  <a name="v0.4.0"></a>
4
44
  ## [v0.4.0] - 2025-02-12
5
45
 
@@ -610,7 +650,9 @@ This release contains documentation fixes.
610
650
  - **add missing djmd tables to `master.db` database documentation**
611
651
 
612
652
 
613
- [Unreleased]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.0...HEAD
653
+ [Unreleased]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.2...HEAD
654
+ [v0.4.2]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.1...v0.4.2
655
+ [v0.4.1]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.0...v0.4.1
614
656
  [v0.4.0]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.2...v0.4.0
615
657
  [v0.3.2]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.1...v0.3.2
616
658
  [v0.3.1]: https://github.com/dylanljones/pyrekordbox/compare/0.3.0...v0.3.1
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: pyrekordbox
3
- Version: 0.4.0
3
+ Version: 0.4.2
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
@@ -61,6 +61,7 @@ Provides-Extra: test
61
61
  Requires-Dist: hypothesis>=6.0.0; extra == "test"
62
62
  Requires-Dist: pytest>=6.2.0; extra == "test"
63
63
  Requires-Dist: pytest-cov; extra == "test"
64
+ Dynamic: license-file
64
65
 
65
66
 
66
67
  <p align="center">
@@ -88,9 +89,9 @@ Pioneers Rekordbox DJ Software. It currently supports
88
89
 
89
90
  Tested Rekordbox versions: ``5.8.6 | 6.7.7 | 7.0.9``
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! |
93
- |----|:----------------------------------------------------------------------------------------------------------------------------------------------------------------|
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!
94
95
 
95
96
 
96
97
  ## 🔧 Installation
@@ -118,8 +119,10 @@ If this fails, it can be installed manually following the [installation guide][i
118
119
 
119
120
  [Read the full documentation on ReadTheDocs!][documentation]
120
121
 
121
- | ❗ | 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" |
122
- |----|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
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"
123
126
 
124
127
 
125
128
  ### Configuration
@@ -174,9 +177,13 @@ can be changed via the corresponding property of the object:
174
177
  ````python
175
178
  content = db.get_content()[0]
176
179
  content.Title = "New Title"
180
+ db.commit()
177
181
  ````
178
- Some fields are stored as references to other tables, for example the artist of a track.
179
- 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
+
180
187
  So far only a few tables support adding or deleting entries:
181
188
  - ``DjmdContent``: Tracks
182
189
  - ``DjmdPlaylist``: Playlists/Playlist Folders
@@ -24,9 +24,9 @@ Pioneers Rekordbox DJ Software. It currently supports
24
24
 
25
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
@@ -54,8 +54,10 @@ If this fails, it can be installed manually following the [installation guide][i
54
54
 
55
55
  [Read the full documentation on ReadTheDocs!][documentation]
56
56
 
57
- | ❗ | 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" |
58
- |----|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
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"
59
61
 
60
62
 
61
63
  ### Configuration
@@ -110,9 +112,13 @@ can be changed via the corresponding property of the object:
110
112
  ````python
111
113
  content = db.get_content()[0]
112
114
  content.Title = "New Title"
115
+ db.commit()
113
116
  ````
114
- Some fields are stored as references to other tables, for example the artist of a track.
115
- 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
+
116
122
  So far only a few tables support adding or deleting entries:
117
123
  - ``DjmdContent``: Tracks
118
124
  - ``DjmdPlaylist``: Playlists/Playlist Folders
@@ -497,7 +497,7 @@ around 1/75th of a second (13.333ms) per frame, i.e. about half the granularity
497
497
  - ?
498
498
  -
499
499
  * - `ActiveLoop`
500
- - ?
500
+ - Should the loop start active when reaching the point in playback
501
501
  -
502
502
  * - `Comment`
503
503
  - Name of comment of cue point
@@ -0,0 +1,88 @@
1
+ # Analysis Files
2
+
3
+ Rekordbox stores analysis information of the tracks in the collection in specific files,
4
+ which also get exported to decives used by Pioneer professional DJ equipment. The files
5
+ have names like `ANLZ0000` and come with the extensions `.DAT`, `.EXT` or `.2EX`.
6
+ They include waveforms, beat grids (information about the precise time at which
7
+ each beat occurs), time indices to allow efficient seeking to specific positions
8
+ inside variable bit-rate audio streams, and lists of memory cues and loop points.
9
+
10
+ ```{seealso}
11
+ See the {ref}`Analysis Files Format<Analysis Files Format>` documentation for more information.
12
+ ```
13
+
14
+ ## Reading and writing ANLZ Files
15
+
16
+ To read an ANLZ file, you can use the `AnlzFile.parse_file` method:
17
+
18
+ ```python
19
+ from pyrekordbox import AnlzFile
20
+
21
+ # Read a single ANLZ file
22
+ anlz = AnlzFile.parse_file("path/to/ANLZXXXX.DAT")
23
+ ```
24
+
25
+ You can also read multiple ANLZ files for a single track using the `read_anlz_files` function.
26
+ It takes the root directory of the files as argument:
27
+
28
+ ```python
29
+ from pyrekordbox import read_anlz_files
30
+
31
+ # Read all ANLZ files for a track
32
+ files = read_anlz_files("path/to/anlz_directory")
33
+ ```
34
+
35
+ After modifiying the contents of a ANLZ file, it can be saved via
36
+ ```python
37
+ # Save the ANLZ file contents
38
+ anlz.save("path/to/ANLZXXXX.DAT")
39
+ ```
40
+
41
+
42
+ To find the ANLZ files corresponding to a specific track in the Rekordbox collection,
43
+ the database handler includes a method that returnes the directory containing the ANLZ files:
44
+ ```python
45
+ >>> from pyrekordbox import Rekordbox6Database
46
+ >>> db = Rekordbox6Database()
47
+ >>> content = db.get_content().first()
48
+ >>> db.get_anlz_dir(content)
49
+ C:\Users\user\AppData\Roaming\Pioneer\rekordbox\share\PIONEER\USBANLZ\0e8\0d4cc-06a6-4574-ba18-1c2301ea9924
50
+ ```
51
+
52
+ Alternatively, a dictionary containing the paths of the ANLZ files can be found via
53
+ ```python
54
+ >>> db.get_anlz_paths(content)
55
+ {
56
+ 'DAT': 'C:/Users/user/AppData/Roaming/Pioneer/rekordbox/share/PIONEER/USBANLZ/0e8/0d4cc-06a6-4574-ba18-1c2301ea9924/ANLZ0000.DAT',
57
+ 'EXT': 'C:/Users/user/AppData/Roaming/Pioneer/rekordbox/share/PIONEER/USBANLZ/0e8/0d4cc-06a6-4574-ba18-1c2301ea9924/ANLZ0000.EXT',
58
+ '2EX': None
59
+ }
60
+ ```
61
+ In this example, the analysis data of the track is stored in only two ANLZ files, `ANLZ0000.DAT` and `ANLZ0000.EXT`.
62
+ Instead of returning the paths of the analysis files, they can also be read directly via
63
+ ```python
64
+ db.read_anlz_files(content)
65
+ ```
66
+
67
+
68
+ ## Accessing ANLZ Data
69
+
70
+ The `AnlzFile` object implements a dictionary-like interface. You can access tags by their type code or name:
71
+
72
+ ```python
73
+ # Check if a tag exists
74
+ if "beat_grid" in anlz:
75
+ print("Beat grid found")
76
+
77
+ # Get the first tag of a specific type
78
+ beat_grid = anlz.get_tag("PQTZ")
79
+ # or by name
80
+ beat_grid = anlz.get_tag("beat_grid")
81
+
82
+ # Get all tags of a specific type
83
+ all_cues = anlz.getall_tags("PCOB")
84
+ ```
85
+
86
+ ```{note}
87
+ More coming soon!
88
+ ```
@@ -13,7 +13,8 @@ DJ equipment.
13
13
  See the {ref}`My-Setting Files Format<My-Setting Files Format>` documentation for more information.
14
14
  ```
15
15
 
16
- Pyrekordbox includes a file handler for each of the four My-Settings files. To read any of the four files, use
16
+ Pyrekordbox includes a file handler for each of the four My-Settings files.
17
+ To read any of the four files, use
17
18
  ````python
18
19
  from pyrekordbox import read_mysetting_file
19
20
 
@@ -30,6 +31,21 @@ file3 = DjmMySettingFile.parse_file("DJMMYSETTING.DAT")
30
31
  file4 = DevSettingFile.parse_file("DEVSETTING.DAT")
31
32
  ````
32
33
 
34
+ To find the My-Settings files, the database handler includes a method that returnes the
35
+ paths of all four files:
36
+ ````python
37
+ >>> from pyrekordbox import Rekordbox6Database
38
+ >>> db = Rekordbox6Database()
39
+ >>> db.get_mysetting_paths()
40
+ [
41
+ 'C:/Users/user/AppData/Roaming/Pioneer/rekordbox/DEVSETTING.DAT',
42
+ 'C:/Users/user/AppData/Roaming/Pioneer/rekordbox/DJMMYSETTING.DAT',
43
+ 'C:/Users/user/AppData/Roaming/Pioneer/rekordbox/MYSETTING.DAT',
44
+ 'C:/Users/user/AppData/Roaming/Pioneer/rekordbox/MYSETTING2.DAT'
45
+ ]
46
+ ````
47
+
48
+
33
49
  After parsing a My-Setting file, the settings can be accessed as dictionary:
34
50
  ````python
35
51
  >>> file = read_mysetting_file("MYSETTING.DAT")
@@ -93,7 +93,7 @@ exclude = [
93
93
  "*/_version.py",
94
94
  "docs/*",
95
95
  ]
96
- line-length = 88
96
+ line-length = 100
97
97
  indent-width = 4
98
98
 
99
99
  [tool.ruff.lint]
@@ -9,7 +9,7 @@ import sys
9
9
  import urllib.request
10
10
  from pathlib import Path
11
11
 
12
- from pyrekordbox.config import _cache_file, write_db6_key_cache
12
+ from pyrekordbox.config import get_cache_file, write_db6_key_cache
13
13
 
14
14
  KEY_SOURCES = [
15
15
  {
@@ -144,7 +144,8 @@ def download_db6_key():
144
144
  dp = match.group("dp")
145
145
  break
146
146
  if dp:
147
- print(f"Found key, updating cache file {_cache_file}")
147
+ cache_file = get_cache_file()
148
+ print(f"Found key, updating cache file {cache_file}")
148
149
  write_db6_key_cache(dp)
149
150
  else:
150
151
  print("No key found in the online sources.")
@@ -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.4.0'
16
- __version_tuple__ = version_tuple = (0, 4, 0)
20
+ __version__ = version = '0.4.2'
21
+ __version_tuple__ = version_tuple = (0, 4, 2)
@@ -162,13 +162,9 @@ class PQTZAnlzTag(AbstractAnlzTag):
162
162
  n_bpms = len(bpms)
163
163
  n_times = len(times)
164
164
  if n_bpms != n_beats:
165
- raise ValueError(
166
- f"Number of bpms not equal to number of beats: {n_bpms} != {n_beats}"
167
- )
165
+ raise ValueError(f"Number of bpms not equal to number of beats: {n_bpms} != {n_beats}")
168
166
  if n_times != n_beats:
169
- raise ValueError(
170
- f"Number of times not equal to number of beats: {n_bpms} != {n_times}"
171
- )
167
+ raise ValueError(f"Number of times not equal to number of beats: {n_bpms} != {n_times}")
172
168
 
173
169
  # For now only values of existing beats can be set
174
170
  if n_beats != n:
@@ -184,9 +180,7 @@ class PQTZAnlzTag(AbstractAnlzTag):
184
180
  n = len(self.content.entries)
185
181
  n_new = len(beats)
186
182
  if n_new != n:
187
- raise ValueError(
188
- f"Number of beats not equal to current content length: {n_new} != {n}"
189
- )
183
+ raise ValueError(f"Number of beats not equal to current content length: {n_new} != {n}")
190
184
 
191
185
  for i, beat in enumerate(beats):
192
186
  self.content.entries[i].beat = beat
@@ -195,9 +189,7 @@ class PQTZAnlzTag(AbstractAnlzTag):
195
189
  n = len(self.content.entries)
196
190
  n_new = len(bpms)
197
191
  if n_new != n:
198
- raise ValueError(
199
- f"Number of bpms not equal to current content length: {n_new} != {n}"
200
- )
192
+ raise ValueError(f"Number of bpms not equal to current content length: {n_new} != {n}")
201
193
 
202
194
  for i, bpm in enumerate(bpms):
203
195
  self.content.entries[i].tempo = int(bpm * 100)
@@ -206,9 +198,7 @@ class PQTZAnlzTag(AbstractAnlzTag):
206
198
  n = len(self.content.entries)
207
199
  n_new = len(times)
208
200
  if n_new != n:
209
- raise ValueError(
210
- f"Number of times not equal to current content length: {n_new} != {n}"
211
- )
201
+ raise ValueError(f"Number of times not equal to current content length: {n_new} != {n}")
212
202
 
213
203
  for i, t in enumerate(times):
214
204
  self.content.entries[i].time = int(1000 * t)
@@ -30,7 +30,7 @@ logger = logging.getLogger(__name__)
30
30
 
31
31
  # Cache file for pyrekordbox data
32
32
  _cache_file_version = 2
33
- _cache_file = Path(__file__).parent / "rb.cache"
33
+ _cache_file_name = "rb.cache"
34
34
 
35
35
  # Define empty pyrekordbox configuration
36
36
  __config__ = {
@@ -48,6 +48,29 @@ class InvalidApplicationDirname(Exception):
48
48
  pass
49
49
 
50
50
 
51
+ def get_appdata_dir() -> Path:
52
+ """Returns the path of the application data directory.
53
+
54
+ On Windows, the application data is stored in `/Users/user/AppData/Roaming`.
55
+ On macOS the application data is stored in `~/Libary/Application Support`.
56
+ """
57
+ if sys.platform == "win32":
58
+ # Windows: located in /Users/user/AppData/Roaming/
59
+ app_data = Path(os.environ["AppData"])
60
+ elif sys.platform == "darwin":
61
+ # MacOS: located in ~/Library/Application Support/
62
+ app_data = Path("~").expanduser() / "Library" / "Application Support"
63
+ else:
64
+ # Linux: not supported
65
+ logger.warning(f"OS {sys.platform} not supported!")
66
+ return Path("~").expanduser() / ".local" / "share"
67
+ return app_data
68
+
69
+
70
+ def get_cache_file() -> Path:
71
+ return get_appdata_dir() / "pyrekordbox" / _cache_file_name
72
+
73
+
51
74
  def get_pioneer_install_dir(path: Union[str, Path] = None) -> Path: # pragma: no cover
52
75
  """Returns the path of the Pioneer program installation directory.
53
76
 
@@ -234,12 +257,7 @@ def read_rekordbox6_asar(rb6_install_dir: Union[str, Path]) -> str:
234
257
  if not str(rb6_install_dir).endswith(".app"):
235
258
  rb6_install_dir = rb6_install_dir / "rekordbox.app"
236
259
  location = (
237
- rb6_install_dir
238
- / "Contents"
239
- / "MacOS"
240
- / "rekordboxAgent.app"
241
- / "Contents"
242
- / "Resources"
260
+ rb6_install_dir / "Contents" / "MacOS" / "rekordboxAgent.app" / "Contents" / "Resources"
243
261
  )
244
262
  encoding = "cp437"
245
263
  else:
@@ -249,7 +267,7 @@ def read_rekordbox6_asar(rb6_install_dir: Union[str, Path]) -> str:
249
267
  # Read asar file
250
268
  path = (location / "app.asar").absolute()
251
269
  with open(path, "rb") as fh:
252
- data = fh.read().decode(encoding)
270
+ data = fh.read().decode(encoding, errors="replace")
253
271
  return data
254
272
 
255
273
 
@@ -360,9 +378,7 @@ def _get_rb_config(
360
378
  return conf
361
379
 
362
380
 
363
- def _get_rb5_config(
364
- pioneer_prog_dir: Path, pioneer_app_dir: Path, dirname: str = ""
365
- ) -> dict:
381
+ def _get_rb5_config(pioneer_prog_dir: Path, pioneer_app_dir: Path, dirname: str = "") -> dict:
366
382
  """Get the program configuration for Rekordbox v5.x.x."""
367
383
  major_version = 5
368
384
  conf = _get_rb_config(pioneer_prog_dir, pioneer_app_dir, major_version, dirname)
@@ -414,8 +430,7 @@ class KeyExtractor:
414
430
  pid = get_rekordbox_pid()
415
431
  if pid:
416
432
  raise RuntimeError(
417
- "Rekordbox is running. "
418
- "Please close Rekordbox before running the `KeyExtractor`."
433
+ "Rekordbox is running. Please close Rekordbox before running the `KeyExtractor`."
419
434
  )
420
435
  # Spawn Rekordbox process and attach to it
421
436
  pid = frida.spawn(self.executable)
@@ -434,12 +449,16 @@ class KeyExtractor:
434
449
 
435
450
 
436
451
  def write_db6_key_cache(key: str) -> None: # pragma: no cover
437
- """Writes the decrypted Rekordbox6 database key to the cache file.
452
+ r"""Writes the decrypted Rekordbox6 database key to the cache file.
438
453
 
439
454
  This method can also be used to manually cache the database key, provided
440
455
  the user has found the key somewhere else. The key can be, for example,
441
456
  found in some other projects that hard-coded it.
442
457
 
458
+ The cache file is stored in the application data directory of pyrekordbox:
459
+ Windows: `C:\Users\<user>\AppData\Roaming\pyrekordbox`
460
+ macOS: `~/Library/Application Support/pyrekordbox`
461
+
443
462
  Parameters
444
463
  ----------
445
464
  key : str
@@ -461,7 +480,12 @@ def write_db6_key_cache(key: str) -> None: # pragma: no cover
461
480
  lines.append(f"version: {_cache_file_version}")
462
481
  lines.append("dp: " + key)
463
482
  text = "\n".join(lines)
464
- with open(_cache_file, "w") as fh:
483
+
484
+ cache_file = get_cache_file()
485
+ if not cache_file.parent.exists():
486
+ cache_file.parent.mkdir()
487
+
488
+ with open(cache_file, "w") as fh:
465
489
  fh.write(text)
466
490
  # Set the config key to make sure the key is present after calling method
467
491
  if __config__["rekordbox6"]:
@@ -473,10 +497,13 @@ def write_db6_key_cache(key: str) -> None: # pragma: no cover
473
497
  def _update_sqlite_key(opts, conf):
474
498
  cache_version = 0
475
499
  pw, dp = "", ""
476
- if _cache_file.exists(): # pragma: no cover
477
- logger.debug("Found cache file %s", _cache_file)
500
+
501
+ cache_file = get_cache_file()
502
+
503
+ if cache_file.exists(): # pragma: no cover
504
+ logger.debug("Found cache file %s", cache_file)
478
505
  # Read cache file
479
- with open(_cache_file, "r") as fh:
506
+ with open(cache_file, "r") as fh:
480
507
  text = fh.read()
481
508
  lines = text.splitlines()
482
509
  if lines[0].startswith("version:"):
@@ -551,9 +578,7 @@ def _update_sqlite_key(opts, conf):
551
578
  conf["dp"] = dp
552
579
 
553
580
 
554
- def _get_rb6_config(
555
- pioneer_prog_dir: Path, pioneer_app_dir: Path, dirname: str = ""
556
- ) -> dict:
581
+ def _get_rb6_config(pioneer_prog_dir: Path, pioneer_app_dir: Path, dirname: str = "") -> dict:
557
582
  """Get the program configuration for Rekordbox v6.x.x."""
558
583
  major_version = 6
559
584
  conf = _get_rb_config(pioneer_prog_dir, pioneer_app_dir, major_version, dirname)
@@ -571,9 +596,7 @@ def _get_rb6_config(
571
596
  return conf
572
597
 
573
598
 
574
- def _get_rb7_config(
575
- pioneer_prog_dir: Path, pioneer_app_dir: Path, dirname: str = ""
576
- ) -> dict:
599
+ def _get_rb7_config(pioneer_prog_dir: Path, pioneer_app_dir: Path, dirname: str = "") -> dict:
577
600
  """Get the program configuration for Rekordbox v7.x.x."""
578
601
  major_version = 7
579
602
  conf = _get_rb_config(pioneer_prog_dir, pioneer_app_dir, major_version, dirname)
@@ -715,27 +738,21 @@ def update_config(
715
738
 
716
739
  # Update Rekordbox 5 config
717
740
  try:
718
- conf = _get_rb5_config(
719
- pioneer_install_dir, pioneer_app_dir, rb5_install_dirname
720
- )
741
+ conf = _get_rb5_config(pioneer_install_dir, pioneer_app_dir, rb5_install_dirname)
721
742
  __config__["rekordbox5"].update(conf)
722
743
  except FileNotFoundError as e:
723
744
  logger.info(e)
724
745
 
725
746
  # Update Rekordbox 6 config
726
747
  try:
727
- conf = _get_rb6_config(
728
- pioneer_install_dir, pioneer_app_dir, rb6_install_dirname
729
- )
748
+ conf = _get_rb6_config(pioneer_install_dir, pioneer_app_dir, rb6_install_dirname)
730
749
  __config__["rekordbox6"].update(conf)
731
750
  except FileNotFoundError as e:
732
751
  logger.info(e)
733
752
 
734
753
  # Update Rekordbox 7 config
735
754
  try:
736
- conf = _get_rb7_config(
737
- pioneer_install_dir, pioneer_app_dir, rb7_install_dirname
738
- )
755
+ conf = _get_rb7_config(pioneer_install_dir, pioneer_app_dir, rb7_install_dirname)
739
756
  __config__["rekordbox7"].update(conf)
740
757
  except FileNotFoundError as e:
741
758
  logger.info(e)