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.
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.github/workflows/tests.yml +3 -1
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.pre-commit-config.yaml +1 -1
- pyrekordbox-0.4.2/.testdata/empty.mp3 +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/CHANGELOG.md +43 -1
- {pyrekordbox-0.4.0/pyrekordbox.egg-info → pyrekordbox-0.4.2}/PKG-INFO +16 -9
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/README.md +13 -7
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/formats/db6.md +1 -1
- pyrekordbox-0.4.2/docs/source/tutorial/anlz.md +88 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/tutorial/mysetting.md +17 -1
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyproject.toml +1 -1
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/__main__.py +3 -2
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/_version.py +9 -4
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/anlz/tags.py +5 -15
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/config.py +50 -33
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/database.py +41 -78
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/smartlist.py +2 -5
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/tables.py +72 -120
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/rbxml.py +11 -16
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2/pyrekordbox.egg-info}/PKG-INFO +16 -9
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/SOURCES.txt +2 -0
- pyrekordbox-0.4.2/tests/test_cli.py +31 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/tests/test_config.py +3 -9
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/tests/test_db6.py +34 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/tests/test_xml.py +59 -1
- pyrekordbox-0.4.0/docs/source/tutorial/anlz.md +0 -7
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.github/workflows/codeql.yml +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.github/workflows/pypi-publish.yml +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.gitignore +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.readthedocs.yaml +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/rekordbox/export.pdb +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/export/PIONEER/rekordbox/exportExt.pdb +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/beat_fx_quantize/off/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/beat_fx_quantize/on/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve/linear/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_bottom/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_top/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/exponential/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/linear/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/smooth/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/cross_fader_curve/constant/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/cross_fader_curve/fast_cut/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/cross_fader_curve/slow_cut/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/five/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/four/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/display_brightness/white/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_mono_split/mono_split/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_mono_split/stereo/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_pre_eq/post_eq/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/headphones_pre_eq/pre_eq/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/indicator_brightness/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/indicator_brightness/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/indicator_brightness/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/mic_low_cut/off/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/mic_low_cut/on/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_button_type/toggle/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_button_type/trigger/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/eight/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/eleven/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/fifteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/five/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/four/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/fourteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/nine/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/seven/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/six/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/sixteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/ten/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/thirteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/twelve/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/midi_channel/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_12db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_18db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_24db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_level/minus_6db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_mode/advanced/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/djmmysetting/talk_over_mode/normal/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/memory/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_36db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_42db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_48db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_54db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_60db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_66db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_72db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/auto_cue_level/minus_78db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/disc_slot_illumination/bright/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/disc_slot_illumination/dark/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/disc_slot_illumination/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/eject_lock/lock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/eject_lock/unlock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_autoload/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_autoload/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_autoload/rekordbox/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_color/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/hotcue_color/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_mode/cdj/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_mode/vinyl/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_brightness/bright/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_brightness/dark/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_brightness/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_indicator/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/jog_ring_indicator/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/chinese_simplified/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/chinese_traditional/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/czech/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/danish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/dutch/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/english/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/french/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/german/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/greek/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/hungarian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/italian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/japanese/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/korean/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/portuguese/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/russian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/spanish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/swedish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/language/turkish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/five/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/four/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/one/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/three/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/lcd_brightness/two/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/master_tempo/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/master_tempo/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/needle_lock/lock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/needle_lock/unlock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/on_air_display/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/on_air_display/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/phase_meter/type1/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/phase_meter/type2/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/play_mode/continue_/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/play_mode/single/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/eighth/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/half/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/one/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/quantize_beat_value/quarter/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/slip_flashing/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/slip_flashing/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/sync/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/sync/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/six/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/sixteen/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/ten/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/tempo_range/wide/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/time_mode/elapsed/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting/time_mode/remain/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/eight/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/half/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixteen/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixtyfour/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/thirtytwo/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/beat_jump_beat_value/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/artwork/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/auto/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/info/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_display_mode/simple/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/five/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/three/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/jog_lcd_brightness/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/three/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/pad_button_brightness/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/release/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch_release/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform/phase_meter/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform/waveform/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform_divisions/phrase/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/mysettings/mysetting2/waveform_divisions/time_scale/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/ExtData.edb +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/datafile.edb +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/backup/masterPlaylists3.xml +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/database.xml +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 5/datafile.edb +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/masterPlaylists3.xml +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/backup/masterPlaylists6.xml +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/database.xml +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/masterPlaylists6_template.xml +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/master_locked.db +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/.testdata/rekordbox 6/master_unlocked.db +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/CONTRIBUTING.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/LICENSE +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/Makefile +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/make.bat +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_beat.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_file.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pco2.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pcob.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pcp2.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pcpt.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_ppth.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pqt2.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pqt2_2.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pqtz.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pssi.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pssi_entry.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pvbr.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwav.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv3.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv4.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv5.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv5_entry.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv6.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwv7.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_pwvc.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/anlz_tag.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/images/x64dbg_rb_key.png +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/logos/dark/logo_primary.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/logos/light/logo_primary.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_static/logos/mid/logo_primary.svg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_templates/apidoc/module.rst_t +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_templates/apidoc/package.rst_t +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_templates/apidoc/toc.rst_t +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_templates/autosummary/class.rst +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/_templates/autosummary/module.rst +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/api.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/conf.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/development/changes.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/development/contributing.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/formats/anlz.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/formats/mysetting.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/formats/xml.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/index.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/installation.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/key.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/quickstart.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/requirements.txt +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/tutorial/configuration.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/tutorial/db6.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/tutorial/index.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/docs/source/tutorial/xml.md +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/__init__.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/anlz/__init__.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/anlz/file.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/anlz/structs.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/__init__.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/aux_files.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/db6/registry.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/logger.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/mysettings/__init__.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/mysettings/file.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/mysettings/structs.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox/utils.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/dependency_links.txt +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/not-zip-safe +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/requires.txt +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/pyrekordbox.egg-info/top_level.txt +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/requirements.txt +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/setup.cfg +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/tests/__init__.py +0 -0
- {pyrekordbox-0.4.0 → pyrekordbox-0.4.2}/tests/test_anlz.py +0 -0
- {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@
|
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
|
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.
|
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.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: pyrekordbox
|
3
|
-
Version: 0.4.
|
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
|
-
|
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
|
-
|
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
|
-
|
179
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
115
|
-
|
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.
|
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
|
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
|
-
|
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
|
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
|
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.
|
16
|
-
__version_tuple__ = version_tuple = (0, 4,
|
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
|
-
|
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
|
-
|
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
|
-
|
477
|
-
|
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(
|
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)
|