pyrekordbox 0.4.2__tar.gz → 0.4.4__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.4/.github/FUNDING.yml +1 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.pre-commit-config.yaml +2 -2
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/CHANGELOG.md +40 -1
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/LICENSE +1 -1
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/PKG-INFO +13 -38
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/README.md +10 -33
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/index.md +0 -1
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/tutorial/db6.md +2 -25
- pyrekordbox-0.4.4/py.typed +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyproject.toml +44 -3
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/__init__.py +1 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/__main__.py +1 -51
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/_version.py +16 -3
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/anlz/__init__.py +6 -6
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/anlz/file.py +56 -43
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/anlz/tags.py +108 -70
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/config.py +18 -356
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/db6/aux_files.py +40 -14
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/db6/database.py +384 -236
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/db6/registry.py +48 -34
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/db6/smartlist.py +12 -12
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/db6/tables.py +60 -58
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/mysettings/__init__.py +3 -2
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/mysettings/file.py +27 -24
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/rbxml.py +321 -142
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/utils.py +27 -6
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/PKG-INFO +13 -38
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/SOURCES.txt +2 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/requires.txt +0 -2
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/requirements.txt +6 -3
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/tests/test_cli.py +0 -8
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/tests/test_db6.py +1 -38
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/tests/test_xml.py +7 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.github/workflows/codeql.yml +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.github/workflows/pypi-publish.yml +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.github/workflows/tests.yml +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.gitignore +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.readthedocs.yaml +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/empty.mp3 +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/rekordbox/export.pdb +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/rekordbox/exportExt.pdb +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/beat_fx_quantize/off/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/beat_fx_quantize/on/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve/linear/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_bottom/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_top/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/exponential/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/linear/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/smooth/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/cross_fader_curve/constant/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/cross_fader_curve/fast_cut/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/cross_fader_curve/slow_cut/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/five/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/four/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/white/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/headphones_mono_split/mono_split/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/headphones_mono_split/stereo/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/headphones_pre_eq/post_eq/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/headphones_pre_eq/pre_eq/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/indicator_brightness/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/indicator_brightness/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/indicator_brightness/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/mic_low_cut/off/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/mic_low_cut/on/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_button_type/toggle/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_button_type/trigger/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/eight/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/eleven/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/fifteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/five/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/four/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/fourteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/nine/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/seven/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/six/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/sixteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/ten/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/thirteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/twelve/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_level/minus_12db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_level/minus_18db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_level/minus_24db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_level/minus_6db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_mode/advanced/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_mode/normal/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/memory/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_36db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_42db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_48db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_54db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_60db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_66db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_72db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_78db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/disc_slot_illumination/bright/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/disc_slot_illumination/dark/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/disc_slot_illumination/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/eject_lock/lock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/eject_lock/unlock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/hotcue_autoload/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/hotcue_autoload/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/hotcue_autoload/rekordbox/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/hotcue_color/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/hotcue_color/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_mode/cdj/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_mode/vinyl/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_ring_brightness/bright/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_ring_brightness/dark/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_ring_brightness/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_ring_indicator/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_ring_indicator/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/chinese_simplified/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/chinese_traditional/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/czech/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/danish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/dutch/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/english/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/french/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/german/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/greek/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/hungarian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/italian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/japanese/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/korean/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/portuguese/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/russian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/spanish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/swedish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/turkish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/lcd_brightness/five/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/lcd_brightness/four/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/lcd_brightness/one/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/lcd_brightness/three/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/lcd_brightness/two/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/master_tempo/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/master_tempo/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/needle_lock/lock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/needle_lock/unlock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/on_air_display/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/on_air_display/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/phase_meter/type1/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/phase_meter/type2/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/play_mode/continue_/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/play_mode/single/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize_beat_value/eighth/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize_beat_value/half/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize_beat_value/one/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize_beat_value/quarter/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/slip_flashing/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/slip_flashing/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/sync/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/sync/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/tempo_range/six/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/tempo_range/sixteen/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/tempo_range/ten/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/tempo_range/wide/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/time_mode/elapsed/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/time_mode/remain/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/eight/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/half/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixteen/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixtyfour/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/thirtytwo/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_display_mode/artwork/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_display_mode/auto/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_display_mode/info/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_display_mode/simple/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_lcd_brightness/five/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_lcd_brightness/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_lcd_brightness/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_lcd_brightness/three/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_lcd_brightness/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/pad_button_brightness/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/pad_button_brightness/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/pad_button_brightness/three/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/pad_button_brightness/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/release/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch_release/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/waveform/phase_meter/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/waveform/waveform/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/waveform_divisions/phrase/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/waveform_divisions/time_scale/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/ExtData.edb +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/datafile.edb +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/masterPlaylists3.xml +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/database.xml +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/datafile.edb +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/masterPlaylists3.xml +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/masterPlaylists6.xml +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/database.xml +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/masterPlaylists6_template.xml +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/master_locked.db +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/master_unlocked.db +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/CONTRIBUTING.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/Makefile +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/make.bat +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_beat.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_file.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pco2.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pcob.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pcp2.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pcpt.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_ppth.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pqt2.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pqt2_2.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pqtz.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pssi.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pssi_entry.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pvbr.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwav.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv3.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv4.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv5.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv5_entry.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv6.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv7.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwvc.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_tag.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/images/x64dbg_rb_key.png +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/logos/dark/logo_primary.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/logos/light/logo_primary.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_static/logos/mid/logo_primary.svg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_templates/apidoc/module.rst_t +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_templates/apidoc/package.rst_t +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_templates/apidoc/toc.rst_t +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_templates/autosummary/class.rst +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/_templates/autosummary/module.rst +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/api.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/conf.py +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/development/changes.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/development/contributing.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/formats/anlz.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/formats/db6.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/formats/mysetting.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/formats/xml.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/installation.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/key.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/quickstart.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/requirements.txt +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/tutorial/anlz.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/tutorial/configuration.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/tutorial/index.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/tutorial/mysetting.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/docs/source/tutorial/xml.md +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/anlz/structs.py +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/db6/__init__.py +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/logger.py +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox/mysettings/structs.py +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/dependency_links.txt +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/not-zip-safe +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/top_level.txt +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/setup.cfg +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/tests/__init__.py +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/tests/test_anlz.py +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/tests/test_config.py +0 -0
- {pyrekordbox-0.4.2 → pyrekordbox-0.4.4}/tests/test_mysetting.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
buy_me_a_coffee: dylanljones
|
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
repos:
|
5
5
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
6
|
-
rev:
|
6
|
+
rev: v6.0.0
|
7
7
|
hooks:
|
8
8
|
- id: end-of-file-fixer
|
9
9
|
- id: trailing-whitespace
|
@@ -13,7 +13,7 @@ repos:
|
|
13
13
|
- id: check-yaml
|
14
14
|
|
15
15
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
16
|
-
rev: v0.
|
16
|
+
rev: v0.12.8
|
17
17
|
hooks:
|
18
18
|
# Run the linter.
|
19
19
|
- id: ruff
|
@@ -1,6 +1,43 @@
|
|
1
1
|
# What's New
|
2
2
|
|
3
3
|
|
4
|
+
<a name="v0.4.4"></a>
|
5
|
+
## [v0.4.4] - 2025-08-17
|
6
|
+
|
7
|
+
This update strengthens database key management, optimizes datetime parsing for consistent timezone
|
8
|
+
handling, and improves PSSI tag processing to better detect and deobfuscate garbled ANLZ files.
|
9
|
+
|
10
|
+
### Improvements/Bug Fixes
|
11
|
+
|
12
|
+
- **db:** **improve database key handling ([#181](https://github.com/dylanljones/pyrekordbox/issues/181))**
|
13
|
+
The database handling is now much more robust. This also improves the config performance of the
|
14
|
+
library and reduces the number of dependencies. The 'download_key' CLI command was removed as well.
|
15
|
+
Note: The app-data directory of pyrekordbox can be removed as it is no longer used.
|
16
|
+
- **db:** **enhance datetime parsing for timezone handling ([#176](https://github.com/dylanljones/pyrekordbox/pull/176))**
|
17
|
+
Updated the string_to_datetime function to normalize 'Z' to '+00:00' and improved handling of
|
18
|
+
timezone information. This ensures compatibility with various datetime formats and maintains
|
19
|
+
consistency with UTC representation.
|
20
|
+
- **anlz**: **enhance PSSI tag handling to improve garbled file detection and deobfuscation ([#175](https://github.com/dylanljones/pyrekordbox/pull/175))**
|
21
|
+
Updated logic for mood and bank validation, and refined XOR deobfuscation process for garbled tags.
|
22
|
+
|
23
|
+
|
24
|
+
<a name="v0.4.3"></a>
|
25
|
+
## [v0.4.3] - 2025-05-14
|
26
|
+
|
27
|
+
This release adds type annotations across the codebase and fixes various bugs.
|
28
|
+
|
29
|
+
### Improvements/Bug Fixes
|
30
|
+
|
31
|
+
- **db:** **add type checks for deleting playlists and playlist songs ([#169](https://github.com/dylanljones/pyrekordbox/issues/169))**
|
32
|
+
This prevents deleting a content instead of a playlist song by accident.
|
33
|
+
- **db:** **fix timezone issue when setting datetimes ([#168](https://github.com/dylanljones/pyrekordbox/issues/168))**
|
34
|
+
Datetime fields are now set with UTC which is the same format that Rekordbox uses.
|
35
|
+
Timezone agnostic dates or dates with another timezone are converted accordingly.
|
36
|
+
- **xml:** **fix issue with pretty-formatting xml string ([#164](https://github.com/dylanljones/pyrekordbox/issues/164))**
|
37
|
+
For Python>3.8 the built-in indentation is used, for Python3.8 the XML string is returned unformatted if minidom fails
|
38
|
+
- **add type hints across the codebase and use mypy for static type checking**
|
39
|
+
|
40
|
+
|
4
41
|
<a name="v0.4.2"></a>
|
5
42
|
## [v0.4.2] - 2025-04-21
|
6
43
|
|
@@ -650,7 +687,9 @@ This release contains documentation fixes.
|
|
650
687
|
- **add missing djmd tables to `master.db` database documentation**
|
651
688
|
|
652
689
|
|
653
|
-
[Unreleased]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.
|
690
|
+
[Unreleased]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.4...HEAD
|
691
|
+
[v0.4.4]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.3...v0.4.4
|
692
|
+
[v0.4.3]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.2...v0.4.3
|
654
693
|
[v0.4.2]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.1...v0.4.2
|
655
694
|
[v0.4.1]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.0...v0.4.1
|
656
695
|
[v0.4.0]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.2...v0.4.0
|
@@ -1,11 +1,11 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: pyrekordbox
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.4
|
4
4
|
Summary: Inofficial Python package for interacting with the library of Pioneers Rekordbox DJ software.
|
5
5
|
Author-email: Dylan Jones <dylanljones94@gmail.com>
|
6
6
|
License: MIT License
|
7
7
|
|
8
|
-
Copyright (c) 2022-
|
8
|
+
Copyright (c) 2022-2025, Dylan Jones
|
9
9
|
|
10
10
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
11
11
|
of this software and associated documentation files (the "Software"), to deal
|
@@ -29,7 +29,7 @@ Project-URL: Source, https://github.com/dylanljones/pyrekordbox
|
|
29
29
|
Project-URL: Documentation, https://pyrekordbox.readthedocs.io/en/stable/
|
30
30
|
Project-URL: Tracker, https://github.com/dylanljones/pyrekordbox/issues
|
31
31
|
Platform: any
|
32
|
-
Classifier: Development Status ::
|
32
|
+
Classifier: Development Status :: 4 - Beta
|
33
33
|
Classifier: Intended Audience :: Developers
|
34
34
|
Classifier: Intended Audience :: Information Technology
|
35
35
|
Classifier: License :: OSI Approved :: MIT License
|
@@ -48,14 +48,12 @@ Requires-Python: >=3.8
|
|
48
48
|
Description-Content-Type: text/markdown
|
49
49
|
License-File: LICENSE
|
50
50
|
Requires-Dist: bidict>=0.21.0
|
51
|
-
Requires-Dist: blowfish>=0.6.0
|
52
51
|
Requires-Dist: construct>=2.10.0
|
53
52
|
Requires-Dist: numpy>=1.19.0
|
54
53
|
Requires-Dist: packaging
|
55
54
|
Requires-Dist: psutil>=5.9.0
|
56
55
|
Requires-Dist: sqlalchemy>=2.0.0
|
57
56
|
Requires-Dist: sqlcipher3-wheels
|
58
|
-
Requires-Dist: frida-tools
|
59
57
|
Requires-Dist: python-dateutil
|
60
58
|
Provides-Extra: test
|
61
59
|
Requires-Dist: hypothesis>=6.0.0; extra == "test"
|
@@ -87,11 +85,9 @@ Pioneers Rekordbox DJ Software. It currently supports
|
|
87
85
|
- Analysis files (ANLZ)
|
88
86
|
- My-Setting files
|
89
87
|
|
90
|
-
|
88
|
+
Check the [changelog][CHANGELOG] for recent changes!
|
91
89
|
|
92
|
-
|
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!
|
90
|
+
Tested Rekordbox versions: ``5.8.6 | 6.7.7 | 7.0.9``
|
95
91
|
|
96
92
|
|
97
93
|
## 🔧 Installation
|
@@ -143,10 +139,6 @@ from pyrekordbox.config import update_config
|
|
143
139
|
update_config("<pioneer_install_dir>", "<pioneer_app_dir>")
|
144
140
|
````
|
145
141
|
|
146
|
-
Alternatively the two paths can be specified in a configuration file under the section
|
147
|
-
`rekordbox`. Supported configuration files are pyproject.toml, setup.cfg, pyrekordbox.toml,
|
148
|
-
pyrekordbox.cfg and pyrekordbox.yaml.
|
149
|
-
|
150
142
|
|
151
143
|
### Rekordbox 6/7 database
|
152
144
|
|
@@ -193,19 +185,6 @@ So far only a few tables support adding or deleting entries:
|
|
193
185
|
- ``DjmdGenre``: Genres
|
194
186
|
- ``DjmdLabel``: Labels
|
195
187
|
|
196
|
-
If the automatic key extraction fails the command line interface of ``pyrekordbox``
|
197
|
-
provides a command for downloading the key from known sources and writing it to the
|
198
|
-
cache file:
|
199
|
-
````shell
|
200
|
-
python -m pyrekordbox download-key
|
201
|
-
````
|
202
|
-
Once the key is cached the database can be opened without providing the key.
|
203
|
-
The key can also be provided manually:
|
204
|
-
````python
|
205
|
-
db = Rekordbox6Database(key="<insert key here>")
|
206
|
-
````
|
207
|
-
|
208
|
-
|
209
188
|
### Rekordbox XML
|
210
189
|
|
211
190
|
The Rekordbox XML database is used for importing (and exporting) Rekordbox collections
|
@@ -263,9 +242,6 @@ Changing and creating the Rekordbox analysis files is planned as well, but for t
|
|
263
242
|
full structure of the analysis files has to be understood.
|
264
243
|
|
265
244
|
Unsupported ANLZ tags:
|
266
|
-
- PCOB
|
267
|
-
- PCO2
|
268
|
-
- PSSI
|
269
245
|
- PWV6
|
270
246
|
- PWV7
|
271
247
|
- PWVC
|
@@ -317,22 +293,20 @@ instead of opening an issue.
|
|
317
293
|
Pyrekordbox is tested on Windows and MacOS, however some features can't be tested in
|
318
294
|
the CI setup since it requires a working Rekordbox installation.
|
319
295
|
|
296
|
+
## ♡ Sponsor
|
297
|
+
|
298
|
+
If pyrekordbox has helped you or saved you time, consider supporting its development - every coffee makes a difference!
|
299
|
+
|
300
|
+
[](https://www.buymeacoffee.com/dylanljones)
|
301
|
+
|
320
302
|
|
321
303
|
## 🔗 Related Projects and References
|
322
304
|
|
323
305
|
- [crate-digger]: Java library for fetching and parsing rekordbox exports and track analysis files.
|
324
306
|
- [rekordcrate]: Library for parsing Pioneer Rekordbox device exports
|
325
307
|
- [supbox]: Get the currently playing track from Rekordbox v6 as Audio Hijack Shoutcast/Icecast metadata, display in your OBS video broadcast or export as JSON.
|
326
|
-
- Deep Symmetry has an extensive analysis of Rekordbox's ANLZ and .edb export file formats
|
308
|
+
- [Deep Symmetry] has an extensive analysis of Rekordbox's ANLZ and .edb export file formats
|
327
309
|
https://djl-analysis.deepsymmetry.org/djl-analysis
|
328
|
-
- rekordcrate reverse engineered the format of the Rekordbox MySetting files
|
329
|
-
https://holzhaus.github.io/rekordcrate/rekordcrate/setting/index.html
|
330
|
-
- rekordcloud went into detail about the internals of Rekordbox 6
|
331
|
-
https://rekord.cloud/blog/technical-inspection-of-rekordbox-6-and-its-new-internals.
|
332
|
-
- supbox has a nice implementation on finding the Rekordbox 6 database key
|
333
|
-
https://github.com/gabek/supbox
|
334
|
-
|
335
|
-
|
336
310
|
|
337
311
|
|
338
312
|
[tests-badge]: https://img.shields.io/github/actions/workflow/status/dylanljones/pyrekordbox/tests.yml?branch=master&label=tests&logo=github&style=flat
|
@@ -379,3 +353,4 @@ the CI setup since it requires a working Rekordbox installation.
|
|
379
353
|
[rekordcrate]: https://github.com/Holzhaus/rekordcrate
|
380
354
|
[crate-digger]: https://github.com/Deep-Symmetry/crate-digger
|
381
355
|
[supbox]: https://github.com/gabek/supbox
|
356
|
+
[Deep Symmetry]: https://deepsymmetry.org/
|
@@ -22,11 +22,9 @@ Pioneers Rekordbox DJ Software. It currently supports
|
|
22
22
|
- Analysis files (ANLZ)
|
23
23
|
- My-Setting files
|
24
24
|
|
25
|
-
|
25
|
+
Check the [changelog][CHANGELOG] for recent changes!
|
26
26
|
|
27
|
-
|
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!
|
27
|
+
Tested Rekordbox versions: ``5.8.6 | 6.7.7 | 7.0.9``
|
30
28
|
|
31
29
|
|
32
30
|
## 🔧 Installation
|
@@ -78,10 +76,6 @@ from pyrekordbox.config import update_config
|
|
78
76
|
update_config("<pioneer_install_dir>", "<pioneer_app_dir>")
|
79
77
|
````
|
80
78
|
|
81
|
-
Alternatively the two paths can be specified in a configuration file under the section
|
82
|
-
`rekordbox`. Supported configuration files are pyproject.toml, setup.cfg, pyrekordbox.toml,
|
83
|
-
pyrekordbox.cfg and pyrekordbox.yaml.
|
84
|
-
|
85
79
|
|
86
80
|
### Rekordbox 6/7 database
|
87
81
|
|
@@ -128,19 +122,6 @@ So far only a few tables support adding or deleting entries:
|
|
128
122
|
- ``DjmdGenre``: Genres
|
129
123
|
- ``DjmdLabel``: Labels
|
130
124
|
|
131
|
-
If the automatic key extraction fails the command line interface of ``pyrekordbox``
|
132
|
-
provides a command for downloading the key from known sources and writing it to the
|
133
|
-
cache file:
|
134
|
-
````shell
|
135
|
-
python -m pyrekordbox download-key
|
136
|
-
````
|
137
|
-
Once the key is cached the database can be opened without providing the key.
|
138
|
-
The key can also be provided manually:
|
139
|
-
````python
|
140
|
-
db = Rekordbox6Database(key="<insert key here>")
|
141
|
-
````
|
142
|
-
|
143
|
-
|
144
125
|
### Rekordbox XML
|
145
126
|
|
146
127
|
The Rekordbox XML database is used for importing (and exporting) Rekordbox collections
|
@@ -198,9 +179,6 @@ Changing and creating the Rekordbox analysis files is planned as well, but for t
|
|
198
179
|
full structure of the analysis files has to be understood.
|
199
180
|
|
200
181
|
Unsupported ANLZ tags:
|
201
|
-
- PCOB
|
202
|
-
- PCO2
|
203
|
-
- PSSI
|
204
182
|
- PWV6
|
205
183
|
- PWV7
|
206
184
|
- PWVC
|
@@ -252,22 +230,20 @@ instead of opening an issue.
|
|
252
230
|
Pyrekordbox is tested on Windows and MacOS, however some features can't be tested in
|
253
231
|
the CI setup since it requires a working Rekordbox installation.
|
254
232
|
|
233
|
+
## ♡ Sponsor
|
234
|
+
|
235
|
+
If pyrekordbox has helped you or saved you time, consider supporting its development - every coffee makes a difference!
|
236
|
+
|
237
|
+
[](https://www.buymeacoffee.com/dylanljones)
|
238
|
+
|
255
239
|
|
256
240
|
## 🔗 Related Projects and References
|
257
241
|
|
258
242
|
- [crate-digger]: Java library for fetching and parsing rekordbox exports and track analysis files.
|
259
243
|
- [rekordcrate]: Library for parsing Pioneer Rekordbox device exports
|
260
244
|
- [supbox]: Get the currently playing track from Rekordbox v6 as Audio Hijack Shoutcast/Icecast metadata, display in your OBS video broadcast or export as JSON.
|
261
|
-
- Deep Symmetry has an extensive analysis of Rekordbox's ANLZ and .edb export file formats
|
245
|
+
- [Deep Symmetry] has an extensive analysis of Rekordbox's ANLZ and .edb export file formats
|
262
246
|
https://djl-analysis.deepsymmetry.org/djl-analysis
|
263
|
-
- rekordcrate reverse engineered the format of the Rekordbox MySetting files
|
264
|
-
https://holzhaus.github.io/rekordcrate/rekordcrate/setting/index.html
|
265
|
-
- rekordcloud went into detail about the internals of Rekordbox 6
|
266
|
-
https://rekord.cloud/blog/technical-inspection-of-rekordbox-6-and-its-new-internals.
|
267
|
-
- supbox has a nice implementation on finding the Rekordbox 6 database key
|
268
|
-
https://github.com/gabek/supbox
|
269
|
-
|
270
|
-
|
271
247
|
|
272
248
|
|
273
249
|
[tests-badge]: https://img.shields.io/github/actions/workflow/status/dylanljones/pyrekordbox/tests.yml?branch=master&label=tests&logo=github&style=flat
|
@@ -314,3 +290,4 @@ the CI setup since it requires a working Rekordbox installation.
|
|
314
290
|
[rekordcrate]: https://github.com/Holzhaus/rekordcrate
|
315
291
|
[crate-digger]: https://github.com/Deep-Symmetry/crate-digger
|
316
292
|
[supbox]: https://github.com/gabek/supbox
|
293
|
+
[Deep Symmetry]: https://deepsymmetry.org/
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# Rekordbox 6 Database
|
2
2
|
|
3
3
|
Pyrekordbox uses [SQLALchemy](https://www.sqlalchemy.org/) as ORM-Framework to handle the
|
4
|
-
Rekordbox
|
4
|
+
Rekordbox database file (``master.db``). The table declarations can be found in
|
5
5
|
``pyrekordbox.db6.tables``.
|
6
6
|
|
7
7
|
```{seealso}
|
8
8
|
See the {ref}`Rekordbox 6 Database Format <Rekordbox 6 Database Format>` documentation for more information.
|
9
9
|
```
|
10
10
|
|
11
|
-
Since the Rekordbox
|
11
|
+
Since the Rekordbox database handler automatically finds the ``master.db`` database file
|
12
12
|
(see configuration), it can be initialized without any arguments:
|
13
13
|
````python
|
14
14
|
from pyrekordbox import Rekordbox6Database
|
@@ -16,28 +16,6 @@ from pyrekordbox import Rekordbox6Database
|
|
16
16
|
db = Rekordbox6Database()
|
17
17
|
````
|
18
18
|
|
19
|
-
If the automatic key extraction fails the command line interface of ``pyrekordbox``
|
20
|
-
provides a command for downloading the key from known sources and writing it to the
|
21
|
-
cache file:
|
22
|
-
````shell
|
23
|
-
python -m pyrekordbox download-key
|
24
|
-
````
|
25
|
-
Once the key is cached the database can be opened without providing the key.
|
26
|
-
If you obtained the key from another source, you can also pass it to the database handler
|
27
|
-
````python
|
28
|
-
db = Rekordbox6Database(key="<insert key here>")
|
29
|
-
````
|
30
|
-
or write it to the cache file manually:
|
31
|
-
````python
|
32
|
-
from pyrekordbox.config import write_db6_key_cache
|
33
|
-
|
34
|
-
write_db6_key_cache("<insert key here>") # call once
|
35
|
-
db = Rekordbox6Database()
|
36
|
-
````
|
37
|
-
The key can be found in some other projects (see issue
|
38
|
-
[#77](https://github.com/dylanljones/pyrekordbox/issues/77)), for example [here][rb6-key].
|
39
|
-
|
40
|
-
|
41
19
|
## Querying the database
|
42
20
|
|
43
21
|
A query can be executed on any table by calling the ``query()`` method. The result is
|
@@ -203,4 +181,3 @@ More coming soon!
|
|
203
181
|
[DjmdPlaylist]: pyrekordbox.db6.tables.DjmdPlaylist
|
204
182
|
[djmdSongPlaylist-table]: #djmdSongPlaylist
|
205
183
|
[DjmdSongPlaylist]: pyrekordbox.db6.tables.DjmdSongPlaylist
|
206
|
-
[rb6-key]: https://github.com/mganss/CueGen/blob/19878e6eb3f586dee0eb3eb4f2ce3ef18309de9d/CueGen/Generator.cs#L31
|
File without changes
|
@@ -11,7 +11,7 @@ authors = [
|
|
11
11
|
license = {file = "LICENSE"}
|
12
12
|
dynamic = ["version"]
|
13
13
|
classifiers = [
|
14
|
-
"Development Status ::
|
14
|
+
"Development Status :: 4 - Beta",
|
15
15
|
"Intended Audience :: Developers",
|
16
16
|
"Intended Audience :: Information Technology",
|
17
17
|
"License :: OSI Approved :: MIT License",
|
@@ -30,14 +30,12 @@ classifiers = [
|
|
30
30
|
requires-python = ">=3.8"
|
31
31
|
dependencies = [
|
32
32
|
"bidict>=0.21.0",
|
33
|
-
"blowfish>=0.6.0",
|
34
33
|
"construct>=2.10.0",
|
35
34
|
"numpy>=1.19.0",
|
36
35
|
"packaging",
|
37
36
|
"psutil>=5.9.0",
|
38
37
|
"sqlalchemy>=2.0.0",
|
39
38
|
"sqlcipher3-wheels",
|
40
|
-
"frida-tools",
|
41
39
|
"python-dateutil",
|
42
40
|
]
|
43
41
|
|
@@ -78,6 +76,9 @@ include = ["pyrekordbox", "pyrekordbox.*"]
|
|
78
76
|
write_to = "pyrekordbox/_version.py"
|
79
77
|
git_describe_command = "git describe --dirty --tags --long --match * --first-parent"
|
80
78
|
|
79
|
+
[tool.setuptools.package-data]
|
80
|
+
pyrekordbox = ["py.typed"]
|
81
|
+
|
81
82
|
|
82
83
|
# -- Ruff ------------------------------------------------------------------------------
|
83
84
|
|
@@ -105,6 +106,7 @@ select = [
|
|
105
106
|
"NPY", # Numpy
|
106
107
|
"N", # pep8-naming
|
107
108
|
"D", # pydocstyle
|
109
|
+
"ANN", # types-annotations
|
108
110
|
]
|
109
111
|
ignore = [
|
110
112
|
"E203", # Whitespace before ':'
|
@@ -124,12 +126,21 @@ ignore = [
|
|
124
126
|
"N813", # Camelcase imported as lowercase
|
125
127
|
#"N815", # Variable in class scope should not be mixedCase
|
126
128
|
"N818", # Exception name should be named with an Error suffix
|
129
|
+
"ANN001", # Missing type annotation for obj in method
|
130
|
+
"ANN002", # Missing type annotation for args in method
|
131
|
+
"ANN003", # Missing type annotation for kwargs in method
|
132
|
+
"ANN101", # Missing type annotation for self in method
|
133
|
+
"ANN102", # Missing type annotation for cls in classmethod
|
134
|
+
"ANN204", # Missing return type for __init__
|
135
|
+
"ANN401", # Dynamically typed expressions (typing.Any) are disallowed
|
127
136
|
]
|
128
137
|
fixable = ["ALL"] # Allow fix for all enabled rules (when `--fix`) is provided.
|
129
138
|
unfixable = []
|
130
139
|
|
131
140
|
[tool.ruff.lint.per-file-ignores]
|
132
141
|
"*__init__.py" = ["F401"]
|
142
|
+
"*__main__.py" = ["ANN"]
|
143
|
+
"tests/*" = ["ANN"]
|
133
144
|
"rbxml.py" = ["N803"]
|
134
145
|
"tables.py" = ["N802", "N815"]
|
135
146
|
|
@@ -148,6 +159,36 @@ skip-magic-trailing-comma = false
|
|
148
159
|
line-ending = "auto"
|
149
160
|
|
150
161
|
|
162
|
+
# -- Mypy ------------------------------------------------------------------------------
|
163
|
+
|
164
|
+
[tool.mypy]
|
165
|
+
|
166
|
+
strict = true
|
167
|
+
ignore_missing_imports = true # Ignore missing type hints for third-party librarie
|
168
|
+
show_error_codes = true # Show error codes in the output
|
169
|
+
|
170
|
+
exclude = [
|
171
|
+
"__main__.py",
|
172
|
+
'tools',
|
173
|
+
'agent'
|
174
|
+
]
|
175
|
+
|
176
|
+
# Useful fine-tuning overrides to 'strict'
|
177
|
+
warn_unused_configs = true
|
178
|
+
warn_return_any = true
|
179
|
+
no_implicit_optional = false
|
180
|
+
warn_unused_ignores = true
|
181
|
+
disallow_untyped_defs = true
|
182
|
+
disallow_incomplete_defs = true
|
183
|
+
disallow_untyped_calls = false # often useful to allow
|
184
|
+
disallow_untyped_decorators = false # decorators are often tricky
|
185
|
+
check_untyped_defs = true
|
186
|
+
|
187
|
+
plugins = [
|
188
|
+
"numpy.typing.mypy_plugin",
|
189
|
+
"sqlalchemy.ext.mypy.plugin",
|
190
|
+
]
|
191
|
+
|
151
192
|
# -- Coverage --------------------------------------------------------------------------
|
152
193
|
|
153
194
|
[tool.coverage.run]
|
@@ -3,30 +3,10 @@
|
|
3
3
|
# Date: 2023-08-15
|
4
4
|
|
5
5
|
import os
|
6
|
-
import re
|
7
6
|
import shutil
|
8
7
|
import sys
|
9
|
-
import urllib.request
|
10
8
|
from pathlib import Path
|
11
9
|
|
12
|
-
from pyrekordbox.config import get_cache_file, write_db6_key_cache
|
13
|
-
|
14
|
-
KEY_SOURCES = [
|
15
|
-
{
|
16
|
-
"url": r"https://raw.githubusercontent.com/mganss/CueGen/19878e6eb3f586dee0eb3eb4f2ce3ef18309de9d/CueGen/Generator.cs", # noqa: E501
|
17
|
-
"regex": re.compile(
|
18
|
-
r'((.|\n)*)Config\.UseSqlCipher.*\?.*"(?P<dp>.*)".*:.*null',
|
19
|
-
flags=re.IGNORECASE | re.MULTILINE,
|
20
|
-
),
|
21
|
-
},
|
22
|
-
{
|
23
|
-
"url": r"https://raw.githubusercontent.com/dvcrn/go-rekordbox/8be6191ba198ed7abd4ad6406d177ed7b4f749b5/cmd/getencryptionkey/main.go", # noqa: E501
|
24
|
-
"regex": re.compile(
|
25
|
-
r'((.|\n)*)fmt\.Print\("(?P<dp>.*)"\)', flags=re.IGNORECASE | re.MULTILINE
|
26
|
-
),
|
27
|
-
},
|
28
|
-
]
|
29
|
-
|
30
10
|
|
31
11
|
class WorkingDir:
|
32
12
|
def __init__(self, path):
|
@@ -130,40 +110,12 @@ def install_pysqlcipher(
|
|
130
110
|
print(f"Could not remove temporary directory '{tmpdir}'!")
|
131
111
|
|
132
112
|
|
133
|
-
def download_db6_key():
|
134
|
-
dp = ""
|
135
|
-
for source in KEY_SOURCES:
|
136
|
-
url = source["url"]
|
137
|
-
regex = source["regex"]
|
138
|
-
print(f"Looking for key: {url}")
|
139
|
-
|
140
|
-
res = urllib.request.urlopen(url)
|
141
|
-
data = res.read().decode("utf-8")
|
142
|
-
match = regex.match(data)
|
143
|
-
if match:
|
144
|
-
dp = match.group("dp")
|
145
|
-
break
|
146
|
-
if dp:
|
147
|
-
cache_file = get_cache_file()
|
148
|
-
print(f"Found key, updating cache file {cache_file}")
|
149
|
-
write_db6_key_cache(dp)
|
150
|
-
else:
|
151
|
-
print("No key found in the online sources.")
|
152
|
-
|
153
|
-
|
154
113
|
def main():
|
155
114
|
from argparse import ArgumentParser
|
156
115
|
|
157
116
|
parser = ArgumentParser("pyrekordbox")
|
158
117
|
subparsers = parser.add_subparsers(dest="command")
|
159
118
|
|
160
|
-
# Download Rekordbx 6 database key command
|
161
|
-
subparsers.add_parser(
|
162
|
-
"download-key",
|
163
|
-
help="Download the Rekordbox 6 database key from the internet "
|
164
|
-
"and write it to the cache file.",
|
165
|
-
)
|
166
|
-
|
167
119
|
# Install pysqlcipher3 command (Windows only)
|
168
120
|
install_parser = subparsers.add_parser(
|
169
121
|
"install-sqlcipher",
|
@@ -192,9 +144,7 @@ def main():
|
|
192
144
|
|
193
145
|
# Parse args and handle command
|
194
146
|
args = parser.parse_args(sys.argv[1:])
|
195
|
-
if args.command == "
|
196
|
-
download_db6_key()
|
197
|
-
elif args.command == "install-sqlcipher":
|
147
|
+
if args.command == "install-sqlcipher":
|
198
148
|
install_pysqlcipher(args.tmpdir, args.cryptolib, install=not args.buildonly)
|
199
149
|
|
200
150
|
|
@@ -1,7 +1,14 @@
|
|
1
1
|
# file generated by setuptools-scm
|
2
2
|
# don't change, don't track in version control
|
3
3
|
|
4
|
-
__all__ = [
|
4
|
+
__all__ = [
|
5
|
+
"__version__",
|
6
|
+
"__version_tuple__",
|
7
|
+
"version",
|
8
|
+
"version_tuple",
|
9
|
+
"__commit_id__",
|
10
|
+
"commit_id",
|
11
|
+
]
|
5
12
|
|
6
13
|
TYPE_CHECKING = False
|
7
14
|
if TYPE_CHECKING:
|
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
|
|
9
16
|
from typing import Union
|
10
17
|
|
11
18
|
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
19
|
+
COMMIT_ID = Union[str, None]
|
12
20
|
else:
|
13
21
|
VERSION_TUPLE = object
|
22
|
+
COMMIT_ID = object
|
14
23
|
|
15
24
|
version: str
|
16
25
|
__version__: str
|
17
26
|
__version_tuple__: VERSION_TUPLE
|
18
27
|
version_tuple: VERSION_TUPLE
|
28
|
+
commit_id: COMMIT_ID
|
29
|
+
__commit_id__: COMMIT_ID
|
19
30
|
|
20
|
-
__version__ = version = '0.4.
|
21
|
-
__version_tuple__ = version_tuple = (0, 4,
|
31
|
+
__version__ = version = '0.4.4'
|
32
|
+
__version_tuple__ = version_tuple = (0, 4, 4)
|
33
|
+
|
34
|
+
__commit_id__ = commit_id = 'gec8cd22'
|
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
import re
|
6
6
|
from pathlib import Path
|
7
|
-
from typing import Union
|
7
|
+
from typing import Dict, Iterator, Tuple, Union
|
8
8
|
|
9
9
|
from . import structs
|
10
10
|
from .file import AnlzFile
|
@@ -42,7 +42,7 @@ def is_anlz_file(path: Union[str, Path]) -> bool:
|
|
42
42
|
return bool(RE_ANLZ.match(path.name))
|
43
43
|
|
44
44
|
|
45
|
-
def get_anlz_paths(root: Union[str, Path]) ->
|
45
|
+
def get_anlz_paths(root: Union[str, Path]) -> Dict[str, Union[Path, None]]:
|
46
46
|
"""Returns the paths of all existing ANLZ files in a directory.
|
47
47
|
|
48
48
|
Parameters
|
@@ -62,14 +62,14 @@ def get_anlz_paths(root: Union[str, Path]) -> dict:
|
|
62
62
|
>>> p["DAT"]
|
63
63
|
directory/ANLZ0000.DAT
|
64
64
|
"""
|
65
|
-
paths = {"DAT": None, "EXT": None, "2EX": None}
|
65
|
+
paths: Dict[str, Union[Path, None]] = {"DAT": None, "EXT": None, "2EX": None}
|
66
66
|
for path in Path(root).iterdir():
|
67
67
|
if RE_ANLZ.match(path.name):
|
68
68
|
paths[path.suffix[1:].upper()] = path
|
69
69
|
return paths
|
70
70
|
|
71
71
|
|
72
|
-
def walk_anlz_dirs(root_dir: Union[str, Path]):
|
72
|
+
def walk_anlz_dirs(root_dir: Union[str, Path]) -> Iterator[Path]:
|
73
73
|
"""Finds all ANLZ directory paths recursively.
|
74
74
|
|
75
75
|
Parameters
|
@@ -88,7 +88,7 @@ def walk_anlz_dirs(root_dir: Union[str, Path]):
|
|
88
88
|
yield path
|
89
89
|
|
90
90
|
|
91
|
-
def walk_anlz_paths(root_dir: Union[str, Path]):
|
91
|
+
def walk_anlz_paths(root_dir: Union[str, Path]) -> Iterator[Tuple[Path, Dict[str, Path]]]:
|
92
92
|
"""Finds all ANLZ directory paths and the containing file paths recursively.
|
93
93
|
|
94
94
|
Parameters
|
@@ -110,7 +110,7 @@ def walk_anlz_paths(root_dir: Union[str, Path]):
|
|
110
110
|
yield anlz_dir, files
|
111
111
|
|
112
112
|
|
113
|
-
def read_anlz_files(root: Union[str, Path] = "") ->
|
113
|
+
def read_anlz_files(root: Union[str, Path] = "") -> Dict[Path, AnlzFile]:
|
114
114
|
"""Open all ANLZ files in the given root directory.
|
115
115
|
|
116
116
|
Parameters
|