pyrekordbox 0.4.3__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.3 → pyrekordbox-0.4.4}/.pre-commit-config.yaml +2 -2
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/CHANGELOG.md +23 -1
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/LICENSE +1 -1
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/PKG-INFO +13 -38
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/README.md +10 -33
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/index.md +0 -1
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/tutorial/db6.md +2 -25
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyproject.toml +1 -3
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/__main__.py +1 -51
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/_version.py +16 -3
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/anlz/file.py +18 -13
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/config.py +0 -344
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/db6/database.py +8 -22
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/db6/tables.py +9 -6
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/utils.py +20 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/PKG-INFO +13 -38
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/SOURCES.txt +1 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/requires.txt +0 -2
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/requirements.txt +0 -2
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/tests/test_cli.py +0 -8
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/tests/test_db6.py +1 -38
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.github/workflows/codeql.yml +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.github/workflows/pypi-publish.yml +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.github/workflows/tests.yml +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.gitignore +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.readthedocs.yaml +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/empty.mp3 +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/rekordbox/export.pdb +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/export/PIONEER/rekordbox/exportExt.pdb +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/beat_fx_quantize/off/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/beat_fx_quantize/on/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve/linear/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_bottom/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_top/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/exponential/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/linear/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/smooth/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/cross_fader_curve/constant/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/cross_fader_curve/fast_cut/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/cross_fader_curve/slow_cut/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/five/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/four/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/display_brightness/white/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/headphones_mono_split/mono_split/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/headphones_mono_split/stereo/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/headphones_pre_eq/post_eq/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/headphones_pre_eq/pre_eq/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/indicator_brightness/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/indicator_brightness/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/indicator_brightness/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/mic_low_cut/off/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/mic_low_cut/on/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_button_type/toggle/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_button_type/trigger/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/eight/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/eleven/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/fifteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/five/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/four/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/fourteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/nine/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/seven/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/six/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/sixteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/ten/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/thirteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/twelve/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/midi_channel/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_level/minus_12db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_level/minus_18db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_level/minus_24db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_level/minus_6db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_mode/advanced/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/djmmysetting/talk_over_mode/normal/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/memory/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_36db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_42db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_48db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_54db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_60db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_66db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_72db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/auto_cue_level/minus_78db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/disc_slot_illumination/bright/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/disc_slot_illumination/dark/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/disc_slot_illumination/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/eject_lock/lock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/eject_lock/unlock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/hotcue_autoload/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/hotcue_autoload/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/hotcue_autoload/rekordbox/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/hotcue_color/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/hotcue_color/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_mode/cdj/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_mode/vinyl/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_ring_brightness/bright/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_ring_brightness/dark/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_ring_brightness/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_ring_indicator/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/jog_ring_indicator/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/chinese_simplified/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/chinese_traditional/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/czech/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/danish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/dutch/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/english/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/french/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/german/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/greek/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/hungarian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/italian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/japanese/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/korean/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/portuguese/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/russian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/spanish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/swedish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/language/turkish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/lcd_brightness/five/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/lcd_brightness/four/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/lcd_brightness/one/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/lcd_brightness/three/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/lcd_brightness/two/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/master_tempo/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/master_tempo/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/needle_lock/lock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/needle_lock/unlock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/on_air_display/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/on_air_display/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/phase_meter/type1/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/phase_meter/type2/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/play_mode/continue_/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/play_mode/single/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize_beat_value/eighth/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize_beat_value/half/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize_beat_value/one/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/quantize_beat_value/quarter/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/slip_flashing/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/slip_flashing/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/sync/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/sync/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/tempo_range/six/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/tempo_range/sixteen/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/tempo_range/ten/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/tempo_range/wide/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/time_mode/elapsed/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting/time_mode/remain/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/eight/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/half/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixteen/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixtyfour/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/thirtytwo/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/beat_jump_beat_value/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_display_mode/artwork/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_display_mode/auto/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_display_mode/info/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_display_mode/simple/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_lcd_brightness/five/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_lcd_brightness/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_lcd_brightness/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_lcd_brightness/three/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/jog_lcd_brightness/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/pad_button_brightness/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/pad_button_brightness/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/pad_button_brightness/three/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/pad_button_brightness/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/release/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch_release/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/waveform/phase_meter/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/waveform/waveform/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/waveform_divisions/phrase/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/mysettings/mysetting2/waveform_divisions/time_scale/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/ExtData.edb +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/datafile.edb +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/backup/masterPlaylists3.xml +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/database.xml +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 5/datafile.edb +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/MYSETTING.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/masterPlaylists3.xml +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/masterPlaylists6.xml +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/database.xml +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/masterPlaylists6_template.xml +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/master_locked.db +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/.testdata/rekordbox 6/master_unlocked.db +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/CONTRIBUTING.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/Makefile +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/make.bat +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_beat.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_file.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pco2.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pcob.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pcp2.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pcpt.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_ppth.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pqt2.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pqt2_2.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pqtz.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pssi.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pssi_entry.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pvbr.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwav.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv3.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv4.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv5.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv5_entry.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv6.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwv7.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_pwvc.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/anlz_tag.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/images/x64dbg_rb_key.png +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/logos/dark/logo_primary.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/logos/light/logo_primary.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_static/logos/mid/logo_primary.svg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_templates/apidoc/module.rst_t +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_templates/apidoc/package.rst_t +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_templates/apidoc/toc.rst_t +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_templates/autosummary/class.rst +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/_templates/autosummary/module.rst +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/api.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/conf.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/development/changes.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/development/contributing.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/formats/anlz.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/formats/db6.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/formats/mysetting.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/formats/xml.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/installation.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/key.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/quickstart.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/requirements.txt +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/tutorial/anlz.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/tutorial/configuration.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/tutorial/index.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/tutorial/mysetting.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/docs/source/tutorial/xml.md +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/py.typed +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/__init__.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/anlz/__init__.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/anlz/structs.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/anlz/tags.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/db6/__init__.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/db6/aux_files.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/db6/registry.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/db6/smartlist.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/logger.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/mysettings/__init__.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/mysettings/file.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/mysettings/structs.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox/rbxml.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/dependency_links.txt +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/not-zip-safe +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/pyrekordbox.egg-info/top_level.txt +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/setup.cfg +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/tests/__init__.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/tests/test_anlz.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/tests/test_config.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/tests/test_mysetting.py +0 -0
- {pyrekordbox-0.4.3 → pyrekordbox-0.4.4}/tests/test_xml.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,5 +1,26 @@
|
|
1
1
|
# What's New
|
2
2
|
|
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
|
+
|
3
24
|
<a name="v0.4.3"></a>
|
4
25
|
## [v0.4.3] - 2025-05-14
|
5
26
|
|
@@ -666,7 +687,8 @@ This release contains documentation fixes.
|
|
666
687
|
- **add missing djmd tables to `master.db` database documentation**
|
667
688
|
|
668
689
|
|
669
|
-
[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
|
670
692
|
[v0.4.3]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.2...v0.4.3
|
671
693
|
[v0.4.2]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.1...v0.4.2
|
672
694
|
[v0.4.1]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.0...v0.4.1
|
@@ -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
|
@@ -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
|
|
@@ -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'
|
@@ -108,30 +108,36 @@ class AnlzFile(abc.Mapping): # type: ignore[type-arg]
|
|
108
108
|
# Get the four byte struct type
|
109
109
|
tag_type = tag_data[:4].decode("ascii")
|
110
110
|
|
111
|
+
# Get tag length from generic tag header
|
112
|
+
tag_struct = structs.AnlzTag.parse(tag_data)
|
113
|
+
len_tag = tag_struct.len_tag
|
114
|
+
|
111
115
|
if tag_type == "PSSI":
|
112
116
|
# The version that rekordbox 6 *exports* is garbled with an XOR mask.
|
117
|
+
# Determine if the tag is garbled by checking the initial (masked) mood value.
|
113
118
|
# All bytes after byte 17 (len_e) are XOR-masked with a pattern that is
|
114
119
|
# generated by adding the value of len_e to each byte of XOR_MASK
|
115
120
|
|
116
121
|
# Check if the file is garbled (only on exported files)
|
117
122
|
# For this we check the validity of mood and bank
|
118
123
|
# Mood: High=1, Mid=2, Low=3
|
119
|
-
# Bank: 0-8
|
120
124
|
mood = Int16ub.parse(tag_data[18:20])
|
121
|
-
|
122
|
-
if 1 <= mood <= 3 and 0 <= bank <= 8:
|
125
|
+
if 1 <= mood <= 3:
|
123
126
|
logger.debug("PSSI is not garbled!")
|
124
127
|
else:
|
125
|
-
logger.debug("PSSI is garbled!")
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
128
|
+
logger.debug("PSSI is garbled! (raw_mood=%s)", mood)
|
129
|
+
len_entries = Int16ub.parse(tag_data[16:18])
|
130
|
+
|
131
|
+
# Copy only this tag's data so we don't mutate the remainder of file slice
|
132
|
+
mutable_tag_data = bytearray(tag_data[:len_tag])
|
133
|
+
|
134
|
+
for x in range(len(mutable_tag_data) - 18):
|
130
135
|
mask = XOR_MASK[x % len(XOR_MASK)] + len_entries
|
131
136
|
if mask > 255:
|
132
137
|
mask -= 256
|
133
|
-
|
134
|
-
|
138
|
+
mutable_tag_data[18 + x] ^= mask
|
139
|
+
|
140
|
+
tag_data = bytes(mutable_tag_data)
|
135
141
|
|
136
142
|
try:
|
137
143
|
# Parse the struct
|
@@ -140,7 +146,7 @@ class AnlzFile(abc.Mapping): # type: ignore[type-arg]
|
|
140
146
|
raise StructNotInitializedError()
|
141
147
|
tags.append(tag)
|
142
148
|
len_header = tag.struct.len_header
|
143
|
-
|
149
|
+
|
144
150
|
logger.debug(
|
145
151
|
"Parsed struct '%s' (len_header=%s, len_tag=%s)",
|
146
152
|
tag_type,
|
@@ -149,8 +155,7 @@ class AnlzFile(abc.Mapping): # type: ignore[type-arg]
|
|
149
155
|
)
|
150
156
|
except KeyError:
|
151
157
|
logger.warning("Tag '%s' not supported!", tag_type)
|
152
|
-
|
153
|
-
len_tag = tag_struct.len_tag
|
158
|
+
|
154
159
|
i += len_tag
|
155
160
|
|
156
161
|
self.file_header = file_header
|