pyrekordbox 0.4.1__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.1 → pyrekordbox-0.4.2}/.github/workflows/tests.yml +3 -1
  2. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.pre-commit-config.yaml +1 -1
  3. pyrekordbox-0.4.2/.testdata/empty.mp3 +0 -0
  4. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/CHANGELOG.md +18 -1
  5. {pyrekordbox-0.4.1/pyrekordbox.egg-info → pyrekordbox-0.4.2}/PKG-INFO +1 -1
  6. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/formats/db6.md +1 -1
  7. pyrekordbox-0.4.2/docs/source/tutorial/anlz.md +88 -0
  8. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/tutorial/mysetting.md +17 -1
  9. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/__main__.py +3 -2
  10. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/_version.py +2 -2
  11. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/config.py +6 -2
  12. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/db6/database.py +3 -3
  13. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/db6/tables.py +3 -3
  14. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/rbxml.py +8 -7
  15. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2/pyrekordbox.egg-info}/PKG-INFO +1 -1
  16. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/SOURCES.txt +2 -0
  17. pyrekordbox-0.4.2/tests/test_cli.py +31 -0
  18. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/tests/test_db6.py +12 -0
  19. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/tests/test_xml.py +59 -1
  20. pyrekordbox-0.4.1/docs/source/tutorial/anlz.md +0 -7
  21. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  22. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
  23. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  24. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.github/workflows/codeql.yml +0 -0
  25. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.github/workflows/pypi-publish.yml +0 -0
  26. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.gitignore +0 -0
  27. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.readthedocs.yaml +0 -0
  28. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/DEVSETTING.DAT +0 -0
  29. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/DJMMYSETTING.DAT +0 -0
  30. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/MYSETTING.DAT +0 -0
  31. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/MYSETTING2.DAT +0 -0
  32. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.2EX +0 -0
  33. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.DAT +0 -0
  34. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.EXT +0 -0
  35. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.2EX +0 -0
  36. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.DAT +0 -0
  37. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.EXT +0 -0
  38. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.2EX +0 -0
  39. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.DAT +0 -0
  40. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.EXT +0 -0
  41. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.2EX +0 -0
  42. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.DAT +0 -0
  43. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.EXT +0 -0
  44. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.2EX +0 -0
  45. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.DAT +0 -0
  46. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.EXT +0 -0
  47. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.2EX +0 -0
  48. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.DAT +0 -0
  49. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.EXT +0 -0
  50. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/rekordbox/export.pdb +0 -0
  51. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/rekordbox/exportExt.pdb +0 -0
  52. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/DEVSETTING.DAT +0 -0
  53. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/DJMMYSETTING.DAT +0 -0
  54. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/MYSETTING.DAT +0 -0
  55. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/MYSETTING2.DAT +0 -0
  56. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/beat_fx_quantize/off/DJMMYSETTING.DAT +0 -0
  57. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/beat_fx_quantize/on/DJMMYSETTING.DAT +0 -0
  58. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve/linear/DJMMYSETTING.DAT +0 -0
  59. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_bottom/DJMMYSETTING.DAT +0 -0
  60. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_top/DJMMYSETTING.DAT +0 -0
  61. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/exponential/DJMMYSETTING.DAT +0 -0
  62. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/linear/DJMMYSETTING.DAT +0 -0
  63. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/smooth/DJMMYSETTING.DAT +0 -0
  64. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/cross_fader_curve/constant/DJMMYSETTING.DAT +0 -0
  65. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/cross_fader_curve/fast_cut/DJMMYSETTING.DAT +0 -0
  66. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/cross_fader_curve/slow_cut/DJMMYSETTING.DAT +0 -0
  67. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/five/DJMMYSETTING.DAT +0 -0
  68. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/four/DJMMYSETTING.DAT +0 -0
  69. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/one/DJMMYSETTING.DAT +0 -0
  70. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/three/DJMMYSETTING.DAT +0 -0
  71. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/two/DJMMYSETTING.DAT +0 -0
  72. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/white/DJMMYSETTING.DAT +0 -0
  73. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_mono_split/mono_split/DJMMYSETTING.DAT +0 -0
  74. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_mono_split/stereo/DJMMYSETTING.DAT +0 -0
  75. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_pre_eq/post_eq/DJMMYSETTING.DAT +0 -0
  76. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_pre_eq/pre_eq/DJMMYSETTING.DAT +0 -0
  77. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/indicator_brightness/one/DJMMYSETTING.DAT +0 -0
  78. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/indicator_brightness/three/DJMMYSETTING.DAT +0 -0
  79. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/indicator_brightness/two/DJMMYSETTING.DAT +0 -0
  80. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/mic_low_cut/off/DJMMYSETTING.DAT +0 -0
  81. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/mic_low_cut/on/DJMMYSETTING.DAT +0 -0
  82. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_button_type/toggle/DJMMYSETTING.DAT +0 -0
  83. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_button_type/trigger/DJMMYSETTING.DAT +0 -0
  84. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/eight/DJMMYSETTING.DAT +0 -0
  85. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/eleven/DJMMYSETTING.DAT +0 -0
  86. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/fifteen/DJMMYSETTING.DAT +0 -0
  87. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/five/DJMMYSETTING.DAT +0 -0
  88. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/four/DJMMYSETTING.DAT +0 -0
  89. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/fourteen/DJMMYSETTING.DAT +0 -0
  90. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/nine/DJMMYSETTING.DAT +0 -0
  91. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/one/DJMMYSETTING.DAT +0 -0
  92. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/seven/DJMMYSETTING.DAT +0 -0
  93. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/six/DJMMYSETTING.DAT +0 -0
  94. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/sixteen/DJMMYSETTING.DAT +0 -0
  95. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/ten/DJMMYSETTING.DAT +0 -0
  96. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/thirteen/DJMMYSETTING.DAT +0 -0
  97. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/three/DJMMYSETTING.DAT +0 -0
  98. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/twelve/DJMMYSETTING.DAT +0 -0
  99. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/two/DJMMYSETTING.DAT +0 -0
  100. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_12db/DJMMYSETTING.DAT +0 -0
  101. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_18db/DJMMYSETTING.DAT +0 -0
  102. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_24db/DJMMYSETTING.DAT +0 -0
  103. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_6db/DJMMYSETTING.DAT +0 -0
  104. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_mode/advanced/DJMMYSETTING.DAT +0 -0
  105. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_mode/normal/DJMMYSETTING.DAT +0 -0
  106. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue/off/MYSETTING.DAT +0 -0
  107. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue/on/MYSETTING.DAT +0 -0
  108. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/memory/MYSETTING.DAT +0 -0
  109. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_36db/MYSETTING.DAT +0 -0
  110. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_42db/MYSETTING.DAT +0 -0
  111. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_48db/MYSETTING.DAT +0 -0
  112. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_54db/MYSETTING.DAT +0 -0
  113. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_60db/MYSETTING.DAT +0 -0
  114. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_66db/MYSETTING.DAT +0 -0
  115. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_72db/MYSETTING.DAT +0 -0
  116. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_78db/MYSETTING.DAT +0 -0
  117. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/disc_slot_illumination/bright/MYSETTING.DAT +0 -0
  118. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/disc_slot_illumination/dark/MYSETTING.DAT +0 -0
  119. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/disc_slot_illumination/off/MYSETTING.DAT +0 -0
  120. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/eject_lock/lock/MYSETTING.DAT +0 -0
  121. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/eject_lock/unlock/MYSETTING.DAT +0 -0
  122. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_autoload/off/MYSETTING.DAT +0 -0
  123. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_autoload/on/MYSETTING.DAT +0 -0
  124. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_autoload/rekordbox/MYSETTING.DAT +0 -0
  125. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_color/off/MYSETTING.DAT +0 -0
  126. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_color/on/MYSETTING.DAT +0 -0
  127. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_mode/cdj/MYSETTING.DAT +0 -0
  128. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_mode/vinyl/MYSETTING.DAT +0 -0
  129. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_brightness/bright/MYSETTING.DAT +0 -0
  130. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_brightness/dark/MYSETTING.DAT +0 -0
  131. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_brightness/off/MYSETTING.DAT +0 -0
  132. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_indicator/off/MYSETTING.DAT +0 -0
  133. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_indicator/on/MYSETTING.DAT +0 -0
  134. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/chinese_simplified/MYSETTING.DAT +0 -0
  135. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/chinese_traditional/MYSETTING.DAT +0 -0
  136. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/czech/MYSETTING.DAT +0 -0
  137. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/danish/MYSETTING.DAT +0 -0
  138. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/dutch/MYSETTING.DAT +0 -0
  139. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/english/MYSETTING.DAT +0 -0
  140. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/french/MYSETTING.DAT +0 -0
  141. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/german/MYSETTING.DAT +0 -0
  142. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/greek/MYSETTING.DAT +0 -0
  143. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/hungarian/MYSETTING.DAT +0 -0
  144. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/italian/MYSETTING.DAT +0 -0
  145. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/japanese/MYSETTING.DAT +0 -0
  146. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/korean/MYSETTING.DAT +0 -0
  147. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/portuguese/MYSETTING.DAT +0 -0
  148. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/russian/MYSETTING.DAT +0 -0
  149. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/spanish/MYSETTING.DAT +0 -0
  150. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/swedish/MYSETTING.DAT +0 -0
  151. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/turkish/MYSETTING.DAT +0 -0
  152. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/five/MYSETTING.DAT +0 -0
  153. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/four/MYSETTING.DAT +0 -0
  154. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/one/MYSETTING.DAT +0 -0
  155. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/three/MYSETTING.DAT +0 -0
  156. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/two/MYSETTING.DAT +0 -0
  157. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/master_tempo/off/MYSETTING.DAT +0 -0
  158. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/master_tempo/on/MYSETTING.DAT +0 -0
  159. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/needle_lock/lock/MYSETTING.DAT +0 -0
  160. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/needle_lock/unlock/MYSETTING.DAT +0 -0
  161. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/on_air_display/off/MYSETTING.DAT +0 -0
  162. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/on_air_display/on/MYSETTING.DAT +0 -0
  163. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/phase_meter/type1/MYSETTING.DAT +0 -0
  164. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/phase_meter/type2/MYSETTING.DAT +0 -0
  165. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/play_mode/continue_/MYSETTING.DAT +0 -0
  166. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/play_mode/single/MYSETTING.DAT +0 -0
  167. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize/off/MYSETTING.DAT +0 -0
  168. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize/on/MYSETTING.DAT +0 -0
  169. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/eighth/MYSETTING.DAT +0 -0
  170. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/half/MYSETTING.DAT +0 -0
  171. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/one/MYSETTING.DAT +0 -0
  172. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/quarter/MYSETTING.DAT +0 -0
  173. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/slip_flashing/off/MYSETTING.DAT +0 -0
  174. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/slip_flashing/on/MYSETTING.DAT +0 -0
  175. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/sync/off/MYSETTING.DAT +0 -0
  176. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/sync/on/MYSETTING.DAT +0 -0
  177. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/six/MYSETTING.DAT +0 -0
  178. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/sixteen/MYSETTING.DAT +0 -0
  179. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/ten/MYSETTING.DAT +0 -0
  180. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/wide/MYSETTING.DAT +0 -0
  181. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/time_mode/elapsed/MYSETTING.DAT +0 -0
  182. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/time_mode/remain/MYSETTING.DAT +0 -0
  183. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/eight/MYSETTING2.DAT +0 -0
  184. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/four/MYSETTING2.DAT +0 -0
  185. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/half/MYSETTING2.DAT +0 -0
  186. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/one/MYSETTING2.DAT +0 -0
  187. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixteen/MYSETTING2.DAT +0 -0
  188. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixtyfour/MYSETTING2.DAT +0 -0
  189. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/thirtytwo/MYSETTING2.DAT +0 -0
  190. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/two/MYSETTING2.DAT +0 -0
  191. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/artwork/MYSETTING2.DAT +0 -0
  192. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/auto/MYSETTING2.DAT +0 -0
  193. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/info/MYSETTING2.DAT +0 -0
  194. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/simple/MYSETTING2.DAT +0 -0
  195. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/five/MYSETTING2.DAT +0 -0
  196. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/four/MYSETTING2.DAT +0 -0
  197. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/one/MYSETTING2.DAT +0 -0
  198. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/three/MYSETTING2.DAT +0 -0
  199. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/two/MYSETTING2.DAT +0 -0
  200. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/four/MYSETTING2.DAT +0 -0
  201. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/one/MYSETTING2.DAT +0 -0
  202. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/three/MYSETTING2.DAT +0 -0
  203. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/two/MYSETTING2.DAT +0 -0
  204. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/release/MYSETTING2.DAT +0 -0
  205. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch/MYSETTING2.DAT +0 -0
  206. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch_release/MYSETTING2.DAT +0 -0
  207. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform/phase_meter/MYSETTING2.DAT +0 -0
  208. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform/waveform/MYSETTING2.DAT +0 -0
  209. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform_divisions/phrase/MYSETTING2.DAT +0 -0
  210. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform_divisions/time_scale/MYSETTING2.DAT +0 -0
  211. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/DEVSETTING.DAT +0 -0
  212. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/ExtData.edb +0 -0
  213. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/MYSETTING.DAT +0 -0
  214. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.DAT +0 -0
  215. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.EXT +0 -0
  216. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.DAT +0 -0
  217. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.EXT +0 -0
  218. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.DAT +0 -0
  219. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.EXT +0 -0
  220. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.DAT +0 -0
  221. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.EXT +0 -0
  222. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.DAT +0 -0
  223. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.EXT +0 -0
  224. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.DAT +0 -0
  225. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.EXT +0 -0
  226. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/datafile.edb +0 -0
  227. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/masterPlaylists3.xml +0 -0
  228. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/database.xml +0 -0
  229. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/datafile.edb +0 -0
  230. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/DEVSETTING.DAT +0 -0
  231. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/DJMMYSETTING.DAT +0 -0
  232. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/MYSETTING.DAT +0 -0
  233. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/MYSETTING2.DAT +0 -0
  234. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/masterPlaylists3.xml +0 -0
  235. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/masterPlaylists6.xml +0 -0
  236. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.2EX +0 -0
  237. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.DAT +0 -0
  238. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.EXT +0 -0
  239. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.2EX +0 -0
  240. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.DAT +0 -0
  241. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.EXT +0 -0
  242. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.2EX +0 -0
  243. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.DAT +0 -0
  244. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.EXT +0 -0
  245. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.2EX +0 -0
  246. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.DAT +0 -0
  247. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.EXT +0 -0
  248. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.2EX +0 -0
  249. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.DAT +0 -0
  250. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.EXT +0 -0
  251. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.2EX +0 -0
  252. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.DAT +0 -0
  253. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.EXT +0 -0
  254. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/database.xml +0 -0
  255. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/masterPlaylists6_template.xml +0 -0
  256. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/master_locked.db +0 -0
  257. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/master_unlocked.db +0 -0
  258. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/CONTRIBUTING.md +0 -0
  259. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/LICENSE +0 -0
  260. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/README.md +0 -0
  261. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/Makefile +0 -0
  262. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/make.bat +0 -0
  263. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_beat.svg +0 -0
  264. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_file.svg +0 -0
  265. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pco2.svg +0 -0
  266. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pcob.svg +0 -0
  267. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pcp2.svg +0 -0
  268. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pcpt.svg +0 -0
  269. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_ppth.svg +0 -0
  270. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pqt2.svg +0 -0
  271. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pqt2_2.svg +0 -0
  272. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pqtz.svg +0 -0
  273. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pssi.svg +0 -0
  274. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pssi_entry.svg +0 -0
  275. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pvbr.svg +0 -0
  276. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwav.svg +0 -0
  277. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv3.svg +0 -0
  278. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv4.svg +0 -0
  279. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv5.svg +0 -0
  280. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv5_entry.svg +0 -0
  281. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv6.svg +0 -0
  282. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv7.svg +0 -0
  283. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwvc.svg +0 -0
  284. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_tag.svg +0 -0
  285. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/images/x64dbg_rb_key.png +0 -0
  286. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/logos/dark/logo_primary.svg +0 -0
  287. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/logos/light/logo_primary.svg +0 -0
  288. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_static/logos/mid/logo_primary.svg +0 -0
  289. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_templates/apidoc/module.rst_t +0 -0
  290. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_templates/apidoc/package.rst_t +0 -0
  291. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_templates/apidoc/toc.rst_t +0 -0
  292. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_templates/autosummary/class.rst +0 -0
  293. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/_templates/autosummary/module.rst +0 -0
  294. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/api.md +0 -0
  295. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/conf.py +0 -0
  296. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/development/changes.md +0 -0
  297. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/development/contributing.md +0 -0
  298. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/formats/anlz.md +0 -0
  299. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/formats/mysetting.md +0 -0
  300. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/formats/xml.md +0 -0
  301. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/index.md +0 -0
  302. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/installation.md +0 -0
  303. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/key.md +0 -0
  304. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/quickstart.md +0 -0
  305. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/requirements.txt +0 -0
  306. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/tutorial/configuration.md +0 -0
  307. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/tutorial/db6.md +0 -0
  308. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/tutorial/index.md +0 -0
  309. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/docs/source/tutorial/xml.md +0 -0
  310. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyproject.toml +0 -0
  311. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/__init__.py +0 -0
  312. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/anlz/__init__.py +0 -0
  313. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/anlz/file.py +0 -0
  314. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/anlz/structs.py +0 -0
  315. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/anlz/tags.py +0 -0
  316. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/db6/__init__.py +0 -0
  317. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/db6/aux_files.py +0 -0
  318. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/db6/registry.py +0 -0
  319. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/db6/smartlist.py +0 -0
  320. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/logger.py +0 -0
  321. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/mysettings/__init__.py +0 -0
  322. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/mysettings/file.py +0 -0
  323. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/mysettings/structs.py +0 -0
  324. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox/utils.py +0 -0
  325. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/dependency_links.txt +0 -0
  326. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/not-zip-safe +0 -0
  327. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/requires.txt +0 -0
  328. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/top_level.txt +0 -0
  329. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/requirements.txt +0 -0
  330. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/setup.cfg +0 -0
  331. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/tests/__init__.py +0 -0
  332. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/tests/test_anlz.py +0 -0
  333. {pyrekordbox-0.4.1 → pyrekordbox-0.4.2}/tests/test_config.py +0 -0
  334. {pyrekordbox-0.4.1 → 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.11.4
16
+ rev: v0.11.6
17
17
  hooks:
18
18
  # Run the linter.
19
19
  - id: ruff
Binary file
@@ -1,6 +1,22 @@
1
1
  # What's New
2
2
 
3
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
+
4
20
  <a name="v0.4.1"></a>
5
21
  ## [v0.4.1] - 2025-04-20
6
22
 
@@ -634,7 +650,8 @@ This release contains documentation fixes.
634
650
  - **add missing djmd tables to `master.db` database documentation**
635
651
 
636
652
 
637
- [Unreleased]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.1...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
638
655
  [v0.4.1]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.0...v0.4.1
639
656
  [v0.4.0]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.2...v0.4.0
640
657
  [v0.3.2]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.1...v0.3.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyrekordbox
3
- Version: 0.4.1
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
@@ -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")
@@ -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.")
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.4.1'
21
- __version_tuple__ = version_tuple = (0, 4, 1)
20
+ __version__ = version = '0.4.2'
21
+ __version_tuple__ = version_tuple = (0, 4, 2)
@@ -67,6 +67,10 @@ def get_appdata_dir() -> Path:
67
67
  return app_data
68
68
 
69
69
 
70
+ def get_cache_file() -> Path:
71
+ return get_appdata_dir() / "pyrekordbox" / _cache_file_name
72
+
73
+
70
74
  def get_pioneer_install_dir(path: Union[str, Path] = None) -> Path: # pragma: no cover
71
75
  """Returns the path of the Pioneer program installation directory.
72
76
 
@@ -477,7 +481,7 @@ def write_db6_key_cache(key: str) -> None: # pragma: no cover
477
481
  lines.append("dp: " + key)
478
482
  text = "\n".join(lines)
479
483
 
480
- cache_file = get_appdata_dir() / "pyrekordbox" / _cache_file_name
484
+ cache_file = get_cache_file()
481
485
  if not cache_file.parent.exists():
482
486
  cache_file.parent.mkdir()
483
487
 
@@ -494,7 +498,7 @@ def _update_sqlite_key(opts, conf):
494
498
  cache_version = 0
495
499
  pw, dp = "", ""
496
500
 
497
- cache_file = get_appdata_dir() / "pyrekordbox" / _cache_file_name
501
+ cache_file = get_cache_file()
498
502
 
499
503
  if cache_file.exists(): # pragma: no cover
500
504
  logger.debug("Found cache file %s", cache_file)
@@ -27,7 +27,7 @@ try:
27
27
  from sqlcipher3 import dbapi2 as sqlite3 # noqa
28
28
 
29
29
  _sqlcipher_available = True
30
- except ImportError:
30
+ except ImportError: # pragma: no cover
31
31
  import sqlite3
32
32
 
33
33
  _sqlcipher_available = False
@@ -125,9 +125,9 @@ class Rekordbox6Database:
125
125
  raise FileNotFoundError(f"File '{path}' does not exist!")
126
126
  # Open database
127
127
  if unlock:
128
- if not _sqlcipher_available:
128
+ if not _sqlcipher_available: # pragma: no cover
129
129
  raise ImportError("Could not unlock database: 'sqlcipher3' package not found")
130
- if not key:
130
+ if not key: # pragma: no cover
131
131
  try:
132
132
  key = rb_config["dp"]
133
133
  except KeyError:
@@ -207,14 +207,14 @@ class Base(DeclarativeBase):
207
207
  return [column.key for column in inspect(cls).relationships] # noqa
208
208
 
209
209
  @classmethod
210
- def __get_keys__(cls):
210
+ def __get_keys__(cls): # pragma: no cover
211
211
  """Get all attributes of the table."""
212
212
  items = cls.__dict__.items()
213
213
  keys = [k for k, v in items if not callable(v) and not k.startswith("_")]
214
214
  return keys
215
215
 
216
216
  @classmethod
217
- def keys(cls):
217
+ def keys(cls): # pragma: no cover
218
218
  """Returns a list of all column names including the relationships."""
219
219
  if not cls.__keys__: # Cache the keys
220
220
  cls.__keys__ = cls.__get_keys__()
@@ -248,7 +248,7 @@ class Base(DeclarativeBase):
248
248
  """Returns a dictionary of all column names and values."""
249
249
  return {key: self.__getitem__(key) for key in self.columns()}
250
250
 
251
- def pformat(self, indent=" "):
251
+ def pformat(self, indent=" "): # pragma: no cover
252
252
  lines = [f"{self.__tablename__}"]
253
253
  columns = self.columns()
254
254
  w = max(len(col) for col in columns)
@@ -1042,13 +1042,14 @@ class RekordboxXml:
1042
1042
  >>> track = file.get_track(TrackID=1)
1043
1043
 
1044
1044
  """
1045
- if index is None and TrackID is None:
1046
- raise ValueError("Either index or TrackID has to be specified!")
1045
+ if index is None and TrackID is None and Location is None:
1046
+ raise ValueError("Either index, TrackID or Location has to be specified!")
1047
1047
 
1048
1048
  if TrackID is not None:
1049
1049
  el = self._collection.find(f'.//{Track.TAG}[@TrackID="{TrackID}"]')
1050
1050
  elif Location is not None:
1051
- el = self._collection.find(f'.//{Track.TAG}[@Location="{Location}"]')
1051
+ encoded = encode_path(Location)
1052
+ el = self._collection.find(f'.//{Track.TAG}[@Location="{encoded}"]')
1052
1053
  else:
1053
1054
  el = self._collection.find(f".//{Track.TAG}[{index + 1}]")
1054
1055
  return Track(element=el)
@@ -1091,10 +1092,10 @@ class RekordboxXml:
1091
1092
  node = node.get_playlist(name)
1092
1093
  return node
1093
1094
 
1094
- def _update_track_count(self):
1095
- """Updates the track count element."""
1096
- num_tracks = len(self._collection.findall(f".//{Track.TAG}"))
1097
- self._collection.attrib["Entries"] = str(num_tracks)
1095
+ # def _update_track_count(self):
1096
+ # """Updates the track count element."""
1097
+ # num_tracks = len(self._collection.findall(f".//{Track.TAG}"))
1098
+ # self._collection.attrib["Entries"] = str(num_tracks)
1098
1099
 
1099
1100
  def _increment_track_count(self):
1100
1101
  """Increment the track count element."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyrekordbox
3
- Version: 0.4.1
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
@@ -13,6 +13,7 @@ requirements.txt
13
13
  .github/workflows/codeql.yml
14
14
  .github/workflows/pypi-publish.yml
15
15
  .github/workflows/tests.yml
16
+ .testdata/empty.mp3
16
17
  .testdata/export/PIONEER/DEVSETTING.DAT
17
18
  .testdata/export/PIONEER/DJMMYSETTING.DAT
18
19
  .testdata/export/PIONEER/MYSETTING.DAT
@@ -323,6 +324,7 @@ pyrekordbox/mysettings/file.py
323
324
  pyrekordbox/mysettings/structs.py
324
325
  tests/__init__.py
325
326
  tests/test_anlz.py
327
+ tests/test_cli.py
326
328
  tests/test_config.py
327
329
  tests/test_db6.py
328
330
  tests/test_mysetting.py
@@ -0,0 +1,31 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Author: Dylan Jones
3
+ # Date: 2025-04-21
4
+
5
+ from subprocess import run
6
+ from types import SimpleNamespace as Namespace
7
+
8
+
9
+ def shell(command, **kwargs):
10
+ """Execute a shell command capturing output and exit code."""
11
+ completed = run(command, shell=True, capture_output=True, check=False, **kwargs)
12
+ return Namespace(
13
+ exit_code=completed.returncode,
14
+ stdout=completed.stdout.decode(),
15
+ stderr=completed.stderr.decode(),
16
+ )
17
+
18
+
19
+ def test_cli():
20
+ """Check if the CLI is callable."""
21
+ result = shell("python -m pyrekordbox --help")
22
+ # Check if the command was successful
23
+ assert result.exit_code == 0, f"Command failed with exit code {result.exit_code}"
24
+
25
+
26
+ def test_download_key():
27
+ """Test the download-key command."""
28
+ result = shell("python -m pyrekordbox download-key")
29
+ # Check if the command was successful
30
+ assert result.exit_code == 0, f"Command failed with exit code {result.exit_code}"
31
+ assert "Found key, updating cache file" in result.stdout
@@ -1222,6 +1222,18 @@ def test_add_label(db):
1222
1222
  db.add_label(name)
1223
1223
 
1224
1224
 
1225
+ def test_add_content(db):
1226
+ path = os.path.join(TEST_ROOT, "empty.mp3")
1227
+ # Add content
1228
+ content = db.add_content(path, Title="Test")
1229
+ assert content.Title == "Test"
1230
+ assert content.FolderPath == path
1231
+
1232
+ # Fail on duplicate content
1233
+ with pytest.raises(ValueError):
1234
+ db.add_content(path)
1235
+
1236
+
1225
1237
  def test_get_anlz_paths():
1226
1238
  content = DB.get_content().first()
1227
1239
 
@@ -7,7 +7,7 @@ import os
7
7
  import pytest
8
8
 
9
9
  from pyrekordbox import RekordboxXml
10
- from pyrekordbox.rbxml import PositionMark, Tempo, XmlDuplicateError
10
+ from pyrekordbox.rbxml import Node, PositionMark, Tempo, XmlDuplicateError
11
11
 
12
12
  TEST_ROOT = os.path.join(os.path.dirname(os.path.dirname(__file__)), ".testdata")
13
13
  XML5 = os.path.join(TEST_ROOT, "rekordbox 5", "database.xml")
@@ -548,9 +548,39 @@ def test_add_position_mark():
548
548
  assert mark.Num == num
549
549
 
550
550
 
551
+ def test_get_track():
552
+ xml = RekordboxXml(XML6)
553
+
554
+ with pytest.raises(ValueError):
555
+ # Nothing provided
556
+ xml.get_track()
557
+
558
+ idx = 0
559
+ expected_loc = os.path.normpath(r"C:/Music/PioneerDJ/Demo Tracks/Demo Track 1.mp3")
560
+ expected_id = 253529738
561
+
562
+ # Test getting by index
563
+ track = xml.get_track(index=idx)
564
+ assert track.Location == expected_loc
565
+ assert track.TrackID == expected_id
566
+
567
+ # Test getting by TrackID
568
+ track = xml.get_track(TrackID=expected_id)
569
+ assert track.Location == expected_loc
570
+ assert track.TrackID == expected_id
571
+
572
+ # Test getting by Location
573
+ track = xml.get_track(Location=expected_loc)
574
+ assert track.Location == expected_loc
575
+ assert track.TrackID == expected_id
576
+
577
+
551
578
  def test_get_playlist():
552
579
  xml = RekordboxXml(XML5)
553
580
 
581
+ playlists = xml.get_playlist()
582
+ assert isinstance(playlists, Node)
583
+
554
584
  playlist = xml.get_playlist("Playlist1")
555
585
  assert playlist.is_playlist
556
586
  assert not playlist.is_folder
@@ -559,6 +589,10 @@ def test_get_playlist():
559
589
  assert folder.is_folder
560
590
  assert not folder.is_playlist
561
591
 
592
+ sub_playlists = folder.get_playlists()
593
+ assert isinstance(sub_playlists, list)
594
+ assert len(sub_playlists) == 1
595
+
562
596
  sub_playlist = xml.get_playlist("Folder", "Sub Playlist")
563
597
  assert sub_playlist.is_playlist
564
598
  assert not sub_playlist.is_folder
@@ -620,6 +654,7 @@ def test_update_playlist_entries():
620
654
 
621
655
  playlist.add_track(0)
622
656
  assert playlist.entries == 1
657
+ assert playlist.get_track(0) == 0
623
658
 
624
659
  playlist.add_track(1)
625
660
  assert playlist.entries == 2
@@ -629,3 +664,26 @@ def test_update_playlist_entries():
629
664
 
630
665
  playlist.remove_track(0)
631
666
  assert playlist.entries == 0
667
+
668
+
669
+ def test_playlist_treestr():
670
+ xml = RekordboxXml(XML5)
671
+ root = xml.get_playlist()
672
+ assert isinstance(root.treestr(), str)
673
+
674
+ playlist = xml.get_playlist("Playlist1")
675
+ assert isinstance(playlist.treestr(), str)
676
+
677
+
678
+ def test_save_load(tmp_path):
679
+ xml = RekordboxXml(XML5)
680
+
681
+ # Save to a file
682
+ test_file = tmp_path / "test_save_reload.xml"
683
+ xml.save(test_file)
684
+
685
+ # Load the saved file
686
+ loaded = RekordboxXml(test_file)
687
+
688
+ # Verify content was preserved
689
+ assert loaded.num_tracks == xml.num_tracks
@@ -1,7 +0,0 @@
1
- # Analysis Files
2
-
3
- Coming soon!
4
-
5
- ```{seealso}
6
- See the {ref}`Analysis Files Format<Analysis Files Format>` documentation for more information.
7
- ```
File without changes