pyrekordbox 0.3.2__tar.gz → 0.4.1__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.3.2 → pyrekordbox-0.4.1}/.github/workflows/tests.yml +1 -1
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.pre-commit-config.yaml +2 -2
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/CHANGELOG.md +67 -1
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/PKG-INFO +26 -39
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/README.md +22 -37
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/formats/db6.md +5 -5
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/installation.md +5 -5
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/db6.md +28 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyproject.toml +32 -5
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/__init__.py +8 -8
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/__main__.py +3 -2
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/_version.py +9 -4
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/anlz/__init__.py +3 -2
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/anlz/file.py +4 -2
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/anlz/tags.py +8 -16
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/config.py +116 -47
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/__init__.py +2 -2
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/aux_files.py +3 -2
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/database.py +130 -177
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/registry.py +1 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/smartlist.py +9 -11
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/db6/tables.py +112 -132
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/logger.py +0 -1
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/mysettings/__init__.py +5 -4
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/mysettings/file.py +3 -1
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/rbxml.py +8 -12
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/utils.py +4 -3
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox.egg-info/PKG-INFO +26 -39
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox.egg-info/SOURCES.txt +0 -1
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox.egg-info/requires.txt +1 -0
- pyrekordbox-0.4.1/pyrekordbox.egg-info/top_level.txt +1 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/requirements.txt +1 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/test_anlz.py +3 -1
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/test_config.py +92 -21
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/test_db6.py +85 -17
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/test_mysetting.py +5 -3
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/test_xml.py +3 -1
- pyrekordbox-0.3.2/pyrekordbox/xml.py +0 -8
- pyrekordbox-0.3.2/pyrekordbox.egg-info/top_level.txt +0 -4
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.github/ISSUE_TEMPLATE/config.yaml +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.github/workflows/codeql.yml +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.github/workflows/pypi-publish.yml +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.gitignore +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.readthedocs.yaml +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P016/0000875E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P017/00009B77/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P019/00020AA9/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P021/00006D2B/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P043/00011517/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/USBANLZ/P053/0001D21F/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/rekordbox/export.pdb +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/export/PIONEER/rekordbox/exportExt.pdb +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/beat_fx_quantize/off/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/beat_fx_quantize/on/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve/linear/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_bottom/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve/steep_top/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/exponential/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/linear/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/channel_fader_curve_long/smooth/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/cross_fader_curve/constant/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/cross_fader_curve/fast_cut/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/cross_fader_curve/slow_cut/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/five/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/four/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/display_brightness/white/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/headphones_mono_split/mono_split/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/headphones_mono_split/stereo/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/headphones_pre_eq/post_eq/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/headphones_pre_eq/pre_eq/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/indicator_brightness/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/indicator_brightness/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/indicator_brightness/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/mic_low_cut/off/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/mic_low_cut/on/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_button_type/toggle/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_button_type/trigger/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/eight/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/eleven/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/fifteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/five/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/four/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/fourteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/nine/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/one/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/seven/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/six/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/sixteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/ten/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/thirteen/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/three/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/twelve/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/midi_channel/two/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_level/minus_12db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_level/minus_18db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_level/minus_24db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_level/minus_6db/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_mode/advanced/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/djmmysetting/talk_over_mode/normal/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/memory/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_36db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_42db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_48db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_54db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_60db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_66db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_72db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/auto_cue_level/minus_78db/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/disc_slot_illumination/bright/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/disc_slot_illumination/dark/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/disc_slot_illumination/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/eject_lock/lock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/eject_lock/unlock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/hotcue_autoload/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/hotcue_autoload/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/hotcue_autoload/rekordbox/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/hotcue_color/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/hotcue_color/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_mode/cdj/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_mode/vinyl/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_ring_brightness/bright/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_ring_brightness/dark/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_ring_brightness/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_ring_indicator/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/jog_ring_indicator/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/chinese_simplified/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/chinese_traditional/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/czech/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/danish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/dutch/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/english/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/french/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/german/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/greek/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/hungarian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/italian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/japanese/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/korean/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/portuguese/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/russian/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/spanish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/swedish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/language/turkish/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/lcd_brightness/five/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/lcd_brightness/four/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/lcd_brightness/one/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/lcd_brightness/three/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/lcd_brightness/two/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/master_tempo/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/master_tempo/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/needle_lock/lock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/needle_lock/unlock/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/on_air_display/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/on_air_display/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/phase_meter/type1/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/phase_meter/type2/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/play_mode/continue_/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/play_mode/single/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize_beat_value/eighth/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize_beat_value/half/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize_beat_value/one/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/quantize_beat_value/quarter/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/slip_flashing/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/slip_flashing/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/sync/off/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/sync/on/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/tempo_range/six/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/tempo_range/sixteen/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/tempo_range/ten/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/tempo_range/wide/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/time_mode/elapsed/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting/time_mode/remain/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/eight/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/half/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixteen/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/sixtyfour/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/thirtytwo/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/beat_jump_beat_value/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_display_mode/artwork/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_display_mode/auto/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_display_mode/info/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_display_mode/simple/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_lcd_brightness/five/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_lcd_brightness/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_lcd_brightness/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_lcd_brightness/three/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/jog_lcd_brightness/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/pad_button_brightness/four/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/pad_button_brightness/one/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/pad_button_brightness/three/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/pad_button_brightness/two/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/release/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/vinyl_speed_adjust/touch_release/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/waveform/phase_meter/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/waveform/waveform/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/waveform_divisions/phrase/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/mysettings/mysetting2/waveform_divisions/time_scale/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/ExtData.edb +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P002/00009C2E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P02B/00023587/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P035/00027763/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P038/0002AAA0/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P068/00012CA2/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/PIONEER/USBANLZ/P076/00013B6E/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/datafile.edb +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/backup/masterPlaylists3.xml +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/database.xml +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 5/datafile.edb +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/DEVSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/DJMMYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/MYSETTING.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/MYSETTING2.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/masterPlaylists3.xml +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/masterPlaylists6.xml +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/003/c9538-33bc-4ca7-b6c7-e63ebf9a96f8/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/104/c82cc-661c-4f30-ab60-51ce1effeeed/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/36d/ad2b4-5d4e-4b94-9a5d-a5bb241aee4b/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/731/0104f-53cb-453e-8b83-e0dfd5cff825/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/c8b/ac74a-bbfc-4fce-8fb8-50aa4e974273/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.2EX +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.DAT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/backup/share/PIONEER/USBANLZ/e35/fa187-3f34-47e2-9880-2b33cb8d1304/ANLZ0000.EXT +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/database.xml +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/masterPlaylists6_template.xml +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/master_locked.db +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/.testdata/rekordbox 6/master_unlocked.db +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/CONTRIBUTING.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/LICENSE +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/Makefile +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/make.bat +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_beat.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_file.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pco2.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pcob.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pcp2.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pcpt.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_ppth.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pqt2.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pqt2_2.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pqtz.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pssi.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pssi_entry.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pvbr.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwav.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv3.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv4.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv5.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv5_entry.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv6.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwv7.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_pwvc.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/anlz_tag.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/images/x64dbg_rb_key.png +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/logos/dark/logo_primary.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/logos/light/logo_primary.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_static/logos/mid/logo_primary.svg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_templates/apidoc/module.rst_t +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_templates/apidoc/package.rst_t +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_templates/apidoc/toc.rst_t +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_templates/autosummary/class.rst +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/_templates/autosummary/module.rst +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/api.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/conf.py +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/development/changes.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/development/contributing.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/formats/anlz.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/formats/mysetting.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/formats/xml.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/index.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/key.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/quickstart.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/requirements.txt +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/anlz.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/configuration.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/index.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/mysetting.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/docs/source/tutorial/xml.md +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/anlz/structs.py +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox/mysettings/structs.py +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox.egg-info/dependency_links.txt +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/pyrekordbox.egg-info/not-zip-safe +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/setup.cfg +0 -0
- {pyrekordbox-0.3.2 → pyrekordbox-0.4.1}/tests/__init__.py +0 -0
@@ -43,7 +43,7 @@ jobs:
|
|
43
43
|
strategy:
|
44
44
|
matrix:
|
45
45
|
os: [windows-latest, macos-latest]
|
46
|
-
python-version: ["3.8", "3.
|
46
|
+
python-version: ["3.8", "3.13"] # check oldest and latest supported version
|
47
47
|
other-os: [true]
|
48
48
|
|
49
49
|
runs-on: ${{ matrix.os }}
|
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
repos:
|
5
5
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
6
|
-
rev:
|
6
|
+
rev: v5.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.11.4
|
17
17
|
hooks:
|
18
18
|
# Run the linter.
|
19
19
|
- id: ruff
|
@@ -1,5 +1,69 @@
|
|
1
1
|
# What's New
|
2
2
|
|
3
|
+
|
4
|
+
<a name="v0.4.1"></a>
|
5
|
+
## [v0.4.1] - 2025-04-20
|
6
|
+
|
7
|
+
This release improves database functionality by allowing commits when playlists are missing in
|
8
|
+
XML (with warnings for non-special playlists), adds timezone support for date fields,
|
9
|
+
and fixes date format issues.
|
10
|
+
Configuration enhancements include relocating the pyrekordbox cache file to the user's
|
11
|
+
appdata directory and fixing an asar file decoding error.
|
12
|
+
|
13
|
+
### Improvements/Bug Fixes
|
14
|
+
|
15
|
+
- **db:** **allow commiting if playlist is not found in XML ([#149](https://github.com/dylanljones/pyrekordbox/issues/149))**
|
16
|
+
This fixes an issue where the changes to the DB can not be commited if the playlist is missing
|
17
|
+
in the playlist-xml. A warning is now shown instead. The warning is not shown for special
|
18
|
+
playlists.
|
19
|
+
- **db:** **add timezone support and fix date format issue ([#161](https://github.com/dylanljones/pyrekordbox/issues/161))**
|
20
|
+
Date formats in the DB are now converted to the local timezone. It is now also possible to read date fields with other formats.
|
21
|
+
- **config:** **move pyrekordbox cache file to appdir**
|
22
|
+
The cache file is now stored in the appdata directory of the user.
|
23
|
+
This avoids writing to the pyrekordbox package directory.
|
24
|
+
- **config:** **fix asar file decoding error ([#154](https://github.com/dylanljones/pyrekordbox/issues/154))**
|
25
|
+
|
26
|
+
|
27
|
+
<a name="v0.4.0"></a>
|
28
|
+
## [v0.4.0] - 2025-02-12
|
29
|
+
|
30
|
+
This release adds the ability to create new tracks in the Rekordbox v6 database.
|
31
|
+
It also adds support for Rekordbox 7 and fixes various bugs.
|
32
|
+
|
33
|
+
### New Features
|
34
|
+
|
35
|
+
- **db:** **add method for creating tracks ([#121](https://github.com/dylanljones/pyrekordbox/pull/121))**
|
36
|
+
New tracks can now be created and added to the Rekordbox collection.
|
37
|
+
Note that the user still has to reload tags/analyze the newly added tracks in Rekordbox.
|
38
|
+
- **config:** **add Rekordbox 7 support ([#133](https://github.com/dylanljones/pyrekordbox/issues/133))**
|
39
|
+
|
40
|
+
### Improvements/Bug Fixes
|
41
|
+
|
42
|
+
- **db:** **fix missing proxy association in table dict**
|
43
|
+
The association proxies were missing in the `to_dict` method.
|
44
|
+
The keys are now also cached.
|
45
|
+
- **db:** **fix an error with .aif file extension ([#138](https://github.com/dylanljones/pyrekordbox/pull/138))**
|
46
|
+
- **db:** **fix to smartlist not always working correctly due to unneccessary bit shift for specific MyTag values ([#142](https://github.com/dylanljones/pyrekordbox/pull/142))**
|
47
|
+
Fix smartlists not always working correctly due to unneccessary bit shift for specific MyTag values
|
48
|
+
- **db:** **fix different timezone assertion ([#137](https://github.com/dylanljones/pyrekordbox/pull/137))**
|
49
|
+
Allow different timezones other than "+00:00" in the datetime format of the DB.
|
50
|
+
- **xml:** **save xml as utf-8 ([#135](https://github.com/dylanljones/pyrekordbox/pull/135))**
|
51
|
+
- **build:** **use pre-built sqlcipher wheels as dependency ([#134](https://github.com/dylanljones/pyrekordbox/pull/134))**
|
52
|
+
The sqlcipher dependency can now be installed using pre-built wheels with included sqlcipher binaries. This makes the whole library installable via pip!
|
53
|
+
- **xml:** **remove deprecated `xml` module**
|
54
|
+
- **db:** **remove deprecated `open_rekordbox_database` method**
|
55
|
+
|
56
|
+
### Documentation
|
57
|
+
|
58
|
+
- **db:** **add documentation for adding tracks**
|
59
|
+
- **db:** **add more info to djmdContent table**
|
60
|
+
|
61
|
+
### BREAKING CHANGE
|
62
|
+
|
63
|
+
Remove deprecated `open_rekordbox_database` method. Use the `Rekordbox6Database` database handler instead!
|
64
|
+
Remove deprecated `xml` module. Use the `rbxml` module instead!
|
65
|
+
|
66
|
+
|
3
67
|
<a name="v0.3.2"></a>
|
4
68
|
## [v0.3.2] - 2024-01-05
|
5
69
|
|
@@ -570,7 +634,9 @@ This release contains documentation fixes.
|
|
570
634
|
- **add missing djmd tables to `master.db` database documentation**
|
571
635
|
|
572
636
|
|
573
|
-
[Unreleased]: https://github.com/dylanljones/pyrekordbox/compare/v0.
|
637
|
+
[Unreleased]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.1...HEAD
|
638
|
+
[v0.4.1]: https://github.com/dylanljones/pyrekordbox/compare/v0.4.0...v0.4.1
|
639
|
+
[v0.4.0]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.2...v0.4.0
|
574
640
|
[v0.3.2]: https://github.com/dylanljones/pyrekordbox/compare/v0.3.1...v0.3.2
|
575
641
|
[v0.3.1]: https://github.com/dylanljones/pyrekordbox/compare/0.3.0...v0.3.1
|
576
642
|
[0.3.0]: https://github.com/dylanljones/pyrekordbox/compare/0.2.3...0.3.0
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: pyrekordbox
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.4.1
|
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
|
@@ -54,12 +54,14 @@ Requires-Dist: numpy>=1.19.0
|
|
54
54
|
Requires-Dist: packaging
|
55
55
|
Requires-Dist: psutil>=5.9.0
|
56
56
|
Requires-Dist: sqlalchemy>=2.0.0
|
57
|
+
Requires-Dist: sqlcipher3-wheels
|
57
58
|
Requires-Dist: frida-tools
|
58
59
|
Requires-Dist: python-dateutil
|
59
60
|
Provides-Extra: test
|
60
61
|
Requires-Dist: hypothesis>=6.0.0; extra == "test"
|
61
62
|
Requires-Dist: pytest>=6.2.0; extra == "test"
|
62
63
|
Requires-Dist: pytest-cov; extra == "test"
|
64
|
+
Dynamic: license-file
|
63
65
|
|
64
66
|
|
65
67
|
<p align="center">
|
@@ -85,11 +87,11 @@ Pioneers Rekordbox DJ Software. It currently supports
|
|
85
87
|
- Analysis files (ANLZ)
|
86
88
|
- My-Setting files
|
87
89
|
|
88
|
-
Tested Rekordbox versions: ``5.8.6 | 6.
|
90
|
+
Tested Rekordbox versions: ``5.8.6 | 6.7.7 | 7.0.9``
|
89
91
|
|
90
|
-
|
91
|
-
|
92
|
-
|
92
|
+
> [!WARNING]
|
93
|
+
> This project is still under development and might contain bugs or have breaking API changes in the future.
|
94
|
+
> Check the [changelog][CHANGELOG] for recent changes!
|
93
95
|
|
94
96
|
|
95
97
|
## 🔧 Installation
|
@@ -107,40 +109,20 @@ where `VERSION` is a release, tag or branch name.
|
|
107
109
|
|
108
110
|
### Dependencies
|
109
111
|
|
110
|
-
Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
|
111
|
-
Pyrekordbox makes no attempt to download/install SQLCipher, as it is a
|
112
|
-
pure Python package - whereas the SQLCipher/sqlcipher3 installation is
|
113
|
-
platform-dependent and can not be installed via ``pip``.
|
114
|
-
|
115
|
-
#### Windows
|
116
|
-
|
117
|
-
SQLCipher can be used by building the libary against an amalgamation with [sqlcipher3].
|
118
|
-
For a detailed instruction, see the [installation guide][installation].
|
119
|
-
|
120
|
-
#### MacOS
|
121
112
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
2) Install SQLCipher with `brew install SQLCipher`.
|
126
|
-
3) With the python environment you are using to run pyrekordbox active execute the following:
|
127
|
-
```shell
|
128
|
-
git clone https://github.com/coleifer/sqlcipher3
|
129
|
-
cd sqlcipher3
|
130
|
-
SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py build
|
131
|
-
SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py install
|
132
|
-
```
|
133
|
-
Make sure the `C_INCLUDE` and `LIBRARY_PATH` point to the installed SQLCipher path. It may differ on your machine.
|
134
|
-
If you are having issues installing [sqlcipher3] on M1 Macs please refer to the
|
135
|
-
[installation guide][installation].
|
113
|
+
Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
|
114
|
+
Pyrekordbox tries to install pre-built wheels with included sqlcipher binaries via the [sqlcipher3-wheels] package.
|
115
|
+
If this fails, it can be installed manually following the [installation guide][installation].
|
136
116
|
|
137
117
|
|
138
118
|
## 🚀 Quick-Start
|
139
119
|
|
140
120
|
[Read the full documentation on ReadTheDocs!][documentation]
|
141
121
|
|
142
|
-
|
143
|
-
|
122
|
+
> [!CAUTION]
|
123
|
+
> Please make sure to back up your Rekordbox collection before making changes with pyrekordbox
|
124
|
+
> or developing/testing new features.
|
125
|
+
> The backup dialog can be found under "File" > "Library" > "Backup Library"
|
144
126
|
|
145
127
|
|
146
128
|
### Configuration
|
@@ -166,10 +148,10 @@ Alternatively the two paths can be specified in a configuration file under the s
|
|
166
148
|
pyrekordbox.cfg and pyrekordbox.yaml.
|
167
149
|
|
168
150
|
|
169
|
-
### Rekordbox 6 database
|
151
|
+
### Rekordbox 6/7 database
|
170
152
|
|
171
|
-
Rekordbox 6
|
172
|
-
Unfortunatly, the
|
153
|
+
Rekordbox 6 and 7 use a SQLite database for storing the collection content.
|
154
|
+
Unfortunatly, the `master.db` SQLite database is encrypted using
|
173
155
|
[SQLCipher][sqlcipher], which means it can't be used without the encryption key.
|
174
156
|
However, since your data is stored and used locally, the key must be present on the
|
175
157
|
machine running Rekordbox.
|
@@ -195,10 +177,15 @@ can be changed via the corresponding property of the object:
|
|
195
177
|
````python
|
196
178
|
content = db.get_content()[0]
|
197
179
|
content.Title = "New Title"
|
180
|
+
db.commit()
|
198
181
|
````
|
199
|
-
|
200
|
-
|
182
|
+
|
183
|
+
> [!NOTE]
|
184
|
+
> Some fields are stored as references to other tables, for example the artist of a track.
|
185
|
+
> Check the [documentation][db6-doc] of the corresponding object for more information.
|
186
|
+
|
201
187
|
So far only a few tables support adding or deleting entries:
|
188
|
+
- ``DjmdContent``: Tracks
|
202
189
|
- ``DjmdPlaylist``: Playlists/Playlist Folders
|
203
190
|
- ``DjmdSongPlaylist``: Songs in a playlist
|
204
191
|
- ``DjmdAlbum``: Albums
|
@@ -388,7 +375,7 @@ the CI setup since it requires a working Rekordbox installation.
|
|
388
375
|
|
389
376
|
[repo]: https://github.com/dylanljones/pyrekordbox
|
390
377
|
[sqlcipher]: https://www.zetetic.net/sqlcipher/open-source/
|
391
|
-
[sqlcipher3]: https://github.com/
|
378
|
+
[sqlcipher3-wheels]: https://github.com/laggykiller/sqlcipher3
|
392
379
|
[rekordcrate]: https://github.com/Holzhaus/rekordcrate
|
393
380
|
[crate-digger]: https://github.com/Deep-Symmetry/crate-digger
|
394
381
|
[supbox]: https://github.com/gabek/supbox
|
@@ -22,11 +22,11 @@ Pioneers Rekordbox DJ Software. It currently supports
|
|
22
22
|
- Analysis files (ANLZ)
|
23
23
|
- My-Setting files
|
24
24
|
|
25
|
-
Tested Rekordbox versions: ``5.8.6 | 6.
|
25
|
+
Tested Rekordbox versions: ``5.8.6 | 6.7.7 | 7.0.9``
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
> [!WARNING]
|
28
|
+
> This project is still under development and might contain bugs or have breaking API changes in the future.
|
29
|
+
> Check the [changelog][CHANGELOG] for recent changes!
|
30
30
|
|
31
31
|
|
32
32
|
## 🔧 Installation
|
@@ -44,40 +44,20 @@ where `VERSION` is a release, tag or branch name.
|
|
44
44
|
|
45
45
|
### Dependencies
|
46
46
|
|
47
|
-
Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
|
48
|
-
Pyrekordbox makes no attempt to download/install SQLCipher, as it is a
|
49
|
-
pure Python package - whereas the SQLCipher/sqlcipher3 installation is
|
50
|
-
platform-dependent and can not be installed via ``pip``.
|
51
|
-
|
52
|
-
#### Windows
|
53
|
-
|
54
|
-
SQLCipher can be used by building the libary against an amalgamation with [sqlcipher3].
|
55
|
-
For a detailed instruction, see the [installation guide][installation].
|
56
|
-
|
57
|
-
#### MacOS
|
58
47
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
2) Install SQLCipher with `brew install SQLCipher`.
|
63
|
-
3) With the python environment you are using to run pyrekordbox active execute the following:
|
64
|
-
```shell
|
65
|
-
git clone https://github.com/coleifer/sqlcipher3
|
66
|
-
cd sqlcipher3
|
67
|
-
SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py build
|
68
|
-
SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==4 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py install
|
69
|
-
```
|
70
|
-
Make sure the `C_INCLUDE` and `LIBRARY_PATH` point to the installed SQLCipher path. It may differ on your machine.
|
71
|
-
If you are having issues installing [sqlcipher3] on M1 Macs please refer to the
|
72
|
-
[installation guide][installation].
|
48
|
+
Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
|
49
|
+
Pyrekordbox tries to install pre-built wheels with included sqlcipher binaries via the [sqlcipher3-wheels] package.
|
50
|
+
If this fails, it can be installed manually following the [installation guide][installation].
|
73
51
|
|
74
52
|
|
75
53
|
## 🚀 Quick-Start
|
76
54
|
|
77
55
|
[Read the full documentation on ReadTheDocs!][documentation]
|
78
56
|
|
79
|
-
|
80
|
-
|
57
|
+
> [!CAUTION]
|
58
|
+
> Please make sure to back up your Rekordbox collection before making changes with pyrekordbox
|
59
|
+
> or developing/testing new features.
|
60
|
+
> The backup dialog can be found under "File" > "Library" > "Backup Library"
|
81
61
|
|
82
62
|
|
83
63
|
### Configuration
|
@@ -103,10 +83,10 @@ Alternatively the two paths can be specified in a configuration file under the s
|
|
103
83
|
pyrekordbox.cfg and pyrekordbox.yaml.
|
104
84
|
|
105
85
|
|
106
|
-
### Rekordbox 6 database
|
86
|
+
### Rekordbox 6/7 database
|
107
87
|
|
108
|
-
Rekordbox 6
|
109
|
-
Unfortunatly, the
|
88
|
+
Rekordbox 6 and 7 use a SQLite database for storing the collection content.
|
89
|
+
Unfortunatly, the `master.db` SQLite database is encrypted using
|
110
90
|
[SQLCipher][sqlcipher], which means it can't be used without the encryption key.
|
111
91
|
However, since your data is stored and used locally, the key must be present on the
|
112
92
|
machine running Rekordbox.
|
@@ -132,10 +112,15 @@ can be changed via the corresponding property of the object:
|
|
132
112
|
````python
|
133
113
|
content = db.get_content()[0]
|
134
114
|
content.Title = "New Title"
|
115
|
+
db.commit()
|
135
116
|
````
|
136
|
-
|
137
|
-
|
117
|
+
|
118
|
+
> [!NOTE]
|
119
|
+
> Some fields are stored as references to other tables, for example the artist of a track.
|
120
|
+
> Check the [documentation][db6-doc] of the corresponding object for more information.
|
121
|
+
|
138
122
|
So far only a few tables support adding or deleting entries:
|
123
|
+
- ``DjmdContent``: Tracks
|
139
124
|
- ``DjmdPlaylist``: Playlists/Playlist Folders
|
140
125
|
- ``DjmdSongPlaylist``: Songs in a playlist
|
141
126
|
- ``DjmdAlbum``: Albums
|
@@ -325,7 +310,7 @@ the CI setup since it requires a working Rekordbox installation.
|
|
325
310
|
|
326
311
|
[repo]: https://github.com/dylanljones/pyrekordbox
|
327
312
|
[sqlcipher]: https://www.zetetic.net/sqlcipher/open-source/
|
328
|
-
[sqlcipher3]: https://github.com/
|
313
|
+
[sqlcipher3-wheels]: https://github.com/laggykiller/sqlcipher3
|
329
314
|
[rekordcrate]: https://github.com/Holzhaus/rekordcrate
|
330
315
|
[crate-digger]: https://github.com/Deep-Symmetry/crate-digger
|
331
316
|
[supbox]: https://github.com/gabek/supbox
|
@@ -270,7 +270,7 @@ corresponding ID.
|
|
270
270
|
-
|
271
271
|
* - `FileType`
|
272
272
|
- Type of audio file
|
273
|
-
- mp3= `0` / `1` , m4a= `4` , wav= `11` , aiff= `12`
|
273
|
+
- mp3= `0` / `1` , m4a= `4` , flac= `5` , wav= `11` , aiff= `12`
|
274
274
|
* - `Rating`
|
275
275
|
- Rating of the track
|
276
276
|
-
|
@@ -302,8 +302,8 @@ corresponding ID.
|
|
302
302
|
- Path to the tracks album artwork
|
303
303
|
- The path is relative to the Rekordbox database root
|
304
304
|
* - `MasterDBID`
|
305
|
-
- The
|
306
|
-
-
|
305
|
+
- The database where the track is stored
|
306
|
+
- Links to `DBID` in the `DjmdProperty` table
|
307
307
|
* - `MasterSongID`
|
308
308
|
- The master-song-ID of the track
|
309
309
|
- Not sure whats the difference to `ID` and `MasterDBID`
|
@@ -341,7 +341,7 @@ corresponding ID.
|
|
341
341
|
- Date of file creation
|
342
342
|
- Format: yyyy-mm-dd; ex.: 2010-08-21
|
343
343
|
* - `ContentLink`
|
344
|
-
-
|
344
|
+
- Link to the `rb_local_usn` of `TRACK` in `DjmdMenuItems`?
|
345
345
|
-
|
346
346
|
* - `Tag`
|
347
347
|
- My tag value
|
@@ -413,7 +413,7 @@ corresponding ID.
|
|
413
413
|
- The Rekordbox ID of the file
|
414
414
|
-
|
415
415
|
* - `DeviceID`
|
416
|
-
-
|
416
|
+
- The ID of the DjmdDevice this track is stored on.
|
417
417
|
-
|
418
418
|
* - `rb_LocalFolderPath`
|
419
419
|
- ?
|
@@ -23,9 +23,8 @@ $ pip install .
|
|
23
23
|
## Installing SQLCipher
|
24
24
|
|
25
25
|
Unlocking the new Rekordbox 6 `master.db` database file requires [SQLCipher][sqlcipher].
|
26
|
-
Pyrekordbox
|
27
|
-
|
28
|
-
platform-dependent and can not be installed easily via ``pip``.
|
26
|
+
Pyrekordbox tries to install pre-built wheels with included sqlcipher binaries via the [sqlcipher3-wheels] package.
|
27
|
+
If this fails, it can be installed manually following the instructions below.
|
29
28
|
|
30
29
|
[sqlcipher3] can either be built with the system [SQLCipher][sqlcipher] or built against
|
31
30
|
a statically linked amalgamation of the SQLite3 source code.
|
@@ -186,8 +185,8 @@ For building [sqlcipher3] against the system SQLCipher installation on MacOS fol
|
|
186
185
|
```shell
|
187
186
|
git clone https://github.com/coleifer/sqlcipher3
|
188
187
|
cd sqlcipher3
|
189
|
-
SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==
|
190
|
-
SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==
|
188
|
+
SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==5 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py build
|
189
|
+
SQLCIPHER_PATH=$(brew info sqlcipher | awk 'NR==5 {print $1; exit}'); C_INCLUDE_PATH="$SQLCIPHER_PATH"/include LIBRARY_PATH="$SQLCIPHER_PATH"/lib python setup.py install
|
191
190
|
```
|
192
191
|
Make sure the `C_INCLUDE` and `LIBRARY_PATH` point to the installed SQLCipher path. It may differ on your machine.
|
193
192
|
|
@@ -269,3 +268,4 @@ c.execute("PRAGMA key='password'")
|
|
269
268
|
[Pypi]: https://pypi.org/project/pyrekordbox/
|
270
269
|
[GitHub]: https://github.com/dylanljones/pyrekordbox
|
271
270
|
[sqlcipher]: https://www.zetetic.net/sqlcipher/open-source/
|
271
|
+
[sqlcipher3-wheels]: https://github.com/laggykiller/sqlcipher3
|
@@ -160,6 +160,34 @@ song = playlist.Songs[0]
|
|
160
160
|
db.remove_from_playlist(playlist, song)
|
161
161
|
````
|
162
162
|
|
163
|
+
### Tracks
|
164
|
+
|
165
|
+
New tracks can be added to your rekordbox collection by calling the `db.add_content()` method:
|
166
|
+
|
167
|
+
```python
|
168
|
+
track = db.add_content("/Users/deadmau5/Downloads/Banger.mp3")
|
169
|
+
```
|
170
|
+
|
171
|
+
This creates a new [DjmdContent] instance and adds it to the [djmdContent-table]. This
|
172
|
+
track will appear in your rekordbox collection, but the track metadata (title, artist,
|
173
|
+
etc.) will be blank. To load this data, simply right click the track and select the
|
174
|
+
`Reload Tag` menu option. rekordbox will correctly populate the metadata, including
|
175
|
+
creating any related table data for things like artist and album.
|
176
|
+
|
177
|
+
The `db.add_content()` method accepts `**kwargs` which are passed on to the [DjmdContent]
|
178
|
+
instance. You can use these keyword arguments if you want to populate some of the track
|
179
|
+
metadata right away. However, things like [DjmdArtist] and [DjmdAlbum] are foreign keys to
|
180
|
+
other tables, so make sure you create these objects first and pass the objects via kwargs,
|
181
|
+
rather than passing plain strings. A plain string will work for `Title`, however.
|
182
|
+
|
183
|
+
```python
|
184
|
+
db.add_content("/Users/deadmau5/Downloads/Banger.mp3", Title="Banger")
|
185
|
+
```
|
186
|
+
|
187
|
+
Populating the [DjmdContent] metadata directly from the track file is not currently
|
188
|
+
supported, but it will hopefully be included in a future release.
|
189
|
+
|
190
|
+
|
163
191
|
```{note}
|
164
192
|
More coming soon!
|
165
193
|
```
|
@@ -36,6 +36,7 @@ dependencies = [
|
|
36
36
|
"packaging",
|
37
37
|
"psutil>=5.9.0",
|
38
38
|
"sqlalchemy>=2.0.0",
|
39
|
+
"sqlcipher3-wheels",
|
39
40
|
"frida-tools",
|
40
41
|
"python-dateutil",
|
41
42
|
]
|
@@ -69,8 +70,9 @@ platforms = ["any"]
|
|
69
70
|
zip-safe = false
|
70
71
|
include-package-data = true
|
71
72
|
|
72
|
-
[tool.setuptools.packages]
|
73
|
-
|
73
|
+
[tool.setuptools.packages.find]
|
74
|
+
where = ["."]
|
75
|
+
include = ["pyrekordbox", "pyrekordbox.*"]
|
74
76
|
|
75
77
|
[tool.setuptools_scm]
|
76
78
|
write_to = "pyrekordbox/_version.py"
|
@@ -91,7 +93,7 @@ exclude = [
|
|
91
93
|
"*/_version.py",
|
92
94
|
"docs/*",
|
93
95
|
]
|
94
|
-
line-length =
|
96
|
+
line-length = 100
|
95
97
|
indent-width = 4
|
96
98
|
|
97
99
|
[tool.ruff.lint]
|
@@ -99,20 +101,45 @@ select = [
|
|
99
101
|
"F", # flake8
|
100
102
|
"E", # pycodestyle Errors
|
101
103
|
"W", # pycodestyle Warnings
|
102
|
-
|
104
|
+
"I", # isort
|
105
|
+
"NPY", # Numpy
|
106
|
+
"N", # pep8-naming
|
107
|
+
"D", # pydocstyle
|
103
108
|
]
|
104
109
|
ignore = [
|
105
110
|
"E203", # Whitespace before ':'
|
111
|
+
"D100", # Missing docstring in public module
|
112
|
+
"D101", # Missing docstring in public class
|
113
|
+
"D102", # Missing docstring in public method
|
114
|
+
"D103", # Missing docstring in public function
|
115
|
+
"D104", # Missing docstring in public package
|
116
|
+
"D105", # Missing docstring in magic method
|
117
|
+
"D106", # Missing docstring in public nested class
|
118
|
+
"D107", # Missing docstring in __init__
|
119
|
+
"D401", # First line should be in imperative mood
|
120
|
+
"D403", # First word of the first line should be capitalized
|
121
|
+
"D404", # First word of the docstring should not be "This"
|
122
|
+
#"N802", # Function name should be lowercase
|
123
|
+
#"N803", # Argument name should be lowercase
|
124
|
+
"N813", # Camelcase imported as lowercase
|
125
|
+
#"N815", # Variable in class scope should not be mixedCase
|
126
|
+
"N818", # Exception name should be named with an Error suffix
|
106
127
|
]
|
107
128
|
fixable = ["ALL"] # Allow fix for all enabled rules (when `--fix`) is provided.
|
108
129
|
unfixable = []
|
109
130
|
|
110
131
|
[tool.ruff.lint.per-file-ignores]
|
111
132
|
"*__init__.py" = ["F401"]
|
133
|
+
"rbxml.py" = ["N803"]
|
134
|
+
"tables.py" = ["N802", "N815"]
|
135
|
+
|
136
|
+
|
137
|
+
[tool.ruff.lint.pydocstyle]
|
138
|
+
convention = "numpy"
|
112
139
|
|
113
140
|
[tool.ruff.lint.isort]
|
114
141
|
combine-as-imports = true
|
115
|
-
|
142
|
+
length-sort = false
|
116
143
|
|
117
144
|
[tool.ruff.format]
|
118
145
|
quote-style = "double"
|
@@ -2,19 +2,19 @@
|
|
2
2
|
# Author: Dylan Jones
|
3
3
|
# Date: 2022-04-10
|
4
4
|
|
5
|
+
from .anlz import AnlzFile, get_anlz_paths, read_anlz_files, walk_anlz_paths
|
6
|
+
from .config import get_config, show_config, update_config
|
7
|
+
from .db6 import Rekordbox6Database
|
5
8
|
from .logger import logger
|
6
|
-
from .config import show_config, get_config, update_config
|
7
|
-
from .rbxml import RekordboxXml, XmlDuplicateError, XmlAttributeKeyError
|
8
|
-
from .anlz import get_anlz_paths, walk_anlz_paths, read_anlz_files, AnlzFile
|
9
9
|
from .mysettings import (
|
10
|
+
DevSettingFile,
|
11
|
+
DjmMySettingFile,
|
12
|
+
MySetting2File,
|
13
|
+
MySettingFile,
|
10
14
|
get_mysetting_paths,
|
11
15
|
read_mysetting_file,
|
12
|
-
MySettingFile,
|
13
|
-
MySetting2File,
|
14
|
-
DjmMySettingFile,
|
15
|
-
DevSettingFile,
|
16
16
|
)
|
17
|
-
from .
|
17
|
+
from .rbxml import RekordboxXml, XmlAttributeKeyError, XmlDuplicateError
|
18
18
|
|
19
19
|
try:
|
20
20
|
from ._version import version as __version__
|
@@ -4,11 +4,12 @@
|
|
4
4
|
|
5
5
|
import os
|
6
6
|
import re
|
7
|
-
import sys
|
8
7
|
import shutil
|
8
|
+
import sys
|
9
9
|
import urllib.request
|
10
10
|
from pathlib import Path
|
11
|
-
|
11
|
+
|
12
|
+
from pyrekordbox.config import _cache_file, write_db6_key_cache
|
12
13
|
|
13
14
|
KEY_SOURCES = [
|
14
15
|
{
|
@@ -1,8 +1,13 @@
|
|
1
|
-
# file generated by
|
1
|
+
# file generated by setuptools-scm
|
2
2
|
# don't change, don't track in version control
|
3
|
+
|
4
|
+
__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
|
5
|
+
|
3
6
|
TYPE_CHECKING = False
|
4
7
|
if TYPE_CHECKING:
|
5
|
-
from typing import Tuple
|
8
|
+
from typing import Tuple
|
9
|
+
from typing import Union
|
10
|
+
|
6
11
|
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
7
12
|
else:
|
8
13
|
VERSION_TUPLE = object
|
@@ -12,5 +17,5 @@ __version__: str
|
|
12
17
|
__version_tuple__: VERSION_TUPLE
|
13
18
|
version_tuple: VERSION_TUPLE
|
14
19
|
|
15
|
-
__version__ = version = '0.
|
16
|
-
__version_tuple__ = version_tuple = (0,
|
20
|
+
__version__ = version = '0.4.1'
|
21
|
+
__version_tuple__ = version_tuple = (0, 4, 1)
|
@@ -5,6 +5,7 @@
|
|
5
5
|
import re
|
6
6
|
from pathlib import Path
|
7
7
|
from typing import Union
|
8
|
+
|
8
9
|
from . import structs
|
9
10
|
from .file import AnlzFile
|
10
11
|
|
@@ -77,7 +78,7 @@ def walk_anlz_dirs(root_dir: Union[str, Path]):
|
|
77
78
|
The path of the root directory.
|
78
79
|
|
79
80
|
Yields
|
80
|
-
|
81
|
+
------
|
81
82
|
anlz_dir : str
|
82
83
|
The path of a directory containing ANLZ files
|
83
84
|
"""
|
@@ -96,7 +97,7 @@ def walk_anlz_paths(root_dir: Union[str, Path]):
|
|
96
97
|
The path of the root directory.
|
97
98
|
|
98
99
|
Yields
|
99
|
-
|
100
|
+
------
|
100
101
|
anlz_dir : str
|
101
102
|
The path of a directory containing ANLZ files.
|
102
103
|
anlz_files : Sequence of str
|
@@ -6,10 +6,12 @@ import logging
|
|
6
6
|
from collections import abc
|
7
7
|
from pathlib import Path
|
8
8
|
from typing import Union
|
9
|
-
|
10
|
-
from . import structs
|
9
|
+
|
11
10
|
from construct import Int16ub
|
12
11
|
|
12
|
+
from . import structs
|
13
|
+
from .tags import TAGS
|
14
|
+
|
13
15
|
logger = logging.getLogger(__name__)
|
14
16
|
|
15
17
|
XOR_MASK = bytearray.fromhex("CB E1 EE FA E5 EE AD EE E9 D2 E9 EB E1 E9 F3 E8 E9 F4 E1")
|