rekordbox-edit 0.11.0.dev3__tar.gz → 0.11.0.dev4__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.
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/workflows/cd.yml +1 -1
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/workflows/release.yml +1 -1
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.gitignore +1 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/CHANGELOG.md +201 -3
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/PKG-INFO +4 -4
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/README.md +3 -3
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/codecov.yml +6 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/api.md +14 -36
- rekordbox_edit-0.11.0.dev4/docs/commands/convert.md +81 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/commands/edit.md +13 -13
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/commands/import.md +5 -8
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/commands/search.md +1 -1
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/faqs.md +16 -18
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/filtering.md +16 -2
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/pyproject.toml +1 -1
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/__init__.py +2 -2
- rekordbox_edit-0.11.0.dev4/rekordbox_edit/api/_utils.py +152 -0
- rekordbox_edit-0.11.0.dev4/rekordbox_edit/api/convert.py +768 -0
- rekordbox_edit-0.11.0.dev4/rekordbox_edit/api/edit.py +151 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/api/field_handlers.py +28 -6
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/api/import_.py +68 -35
- {rekordbox_edit-0.11.0.dev3/rekordbox_edit → rekordbox_edit-0.11.0.dev4/rekordbox_edit/cli}/_click.py +20 -18
- rekordbox_edit-0.11.0.dev4/rekordbox_edit/cli/_progress.py +98 -0
- rekordbox_edit-0.11.0.dev4/rekordbox_edit/cli/_utils.py +203 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/convert.py +101 -37
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/edit.py +88 -40
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/import_.py +66 -36
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/search.py +2 -3
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/display.py +81 -7
- rekordbox_edit-0.11.0.dev4/rekordbox_edit/errors.py +52 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/locking.py +10 -5
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/logger.py +48 -12
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/models.py +23 -9
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/query.py +19 -1
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/tags.py +3 -1
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/utils.py +29 -81
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/README.md +9 -0
- rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/convert-thread-scaling.md +113 -0
- rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/evidence/thread-scaling.txt +30 -0
- rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/scripts/_sources.py +52 -0
- rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/scripts/format_scaling.py +80 -0
- rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/scripts/shipped_path_scaling.py +71 -0
- rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/scripts/write_cost.py +83 -0
- rekordbox_edit-0.11.0.dev4/research/database-concurrency/database-concurrency.md +197 -0
- rekordbox_edit-0.11.0.dev4/research/database-concurrency/evidence/plan-apply-probes.txt +16 -0
- rekordbox_edit-0.11.0.dev4/research/database-concurrency/evidence/usn-spikes.txt +27 -0
- rekordbox_edit-0.11.0.dev4/research/database-concurrency/plan-apply-window.md +71 -0
- rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/block_reservation.py +77 -0
- rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/concurrent_increment.py +104 -0
- rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/identity_probe.py +50 -0
- rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/membership_probe.py +49 -0
- rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/snapshot_probe.py +44 -0
- rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/wal_snapshot.py +62 -0
- rekordbox_edit-0.11.0.dev4/research/database-concurrency/usn-maintenance.md +146 -0
- rekordbox_edit-0.11.0.dev4/research/import-track-row-shape/decisions/commit-semantics-and-usn.md +121 -0
- rekordbox_edit-0.11.0.dev4/tests/api/conftest.py +45 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/test_convert.py +1189 -325
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/test_edit.py +179 -21
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/test_field_handlers.py +70 -9
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/test_import.py +142 -1
- rekordbox_edit-0.11.0.dev4/tests/api/test_utils.py +277 -0
- rekordbox_edit-0.11.0.dev4/tests/cli/test_convert.py +580 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/test_edit.py +218 -42
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/test_import.py +89 -22
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/test_locking.py +14 -11
- rekordbox_edit-0.11.0.dev4/tests/cli/test_progress.py +118 -0
- rekordbox_edit-0.11.0.dev4/tests/cli/test_utils.py +324 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/conftest.py +8 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/test_edit_fields.py +1 -1
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_display.py +66 -1
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_locking.py +39 -5
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_logger.py +37 -1
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_models.py +7 -3
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_query.py +27 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_utils.py +0 -96
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/uv.lock +122 -122
- rekordbox_edit-0.11.0.dev3/docs/commands/convert.md +0 -62
- rekordbox_edit-0.11.0.dev3/rekordbox_edit/api/_utils.py +0 -79
- rekordbox_edit-0.11.0.dev3/rekordbox_edit/api/convert.py +0 -477
- rekordbox_edit-0.11.0.dev3/rekordbox_edit/api/edit.py +0 -112
- rekordbox_edit-0.11.0.dev3/rekordbox_edit/cli/_utils.py +0 -188
- rekordbox_edit-0.11.0.dev3/research/import-track-row-shape/decisions/commit-semantics-and-usn.md +0 -80
- rekordbox_edit-0.11.0.dev3/tests/api/test_utils.py +0 -56
- rekordbox_edit-0.11.0.dev3/tests/cli/test_convert.py +0 -308
- rekordbox_edit-0.11.0.dev3/tests/cli/test_utils.py +0 -195
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.agent-style/RULES.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.agent-style/claude-code.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/build-release-notes/action.yml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/build-release-notes/build_release_notes.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/commit-check/action.yml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/commitizen-bump/action.yml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/commitizen-bump/commitizen-bump.sh +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/e2e/action.yml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/install/action.yml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/lint/action.yml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/test/action.yml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/workflows/ci.yml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/workflows/publish.yml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.pre-commit-config.yaml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.python-version +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.readthedocs.yaml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/AGENTS.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/CLAUDE.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/CONTRIBUTING.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/LICENSE +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/Makefile +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docker-compose.yml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/index.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/stylesheets/extra.css +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/mkdocs.yml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/api/__init__.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/api/search.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/__init__.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/main.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/renovate.json5 +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/convert-export-impact-test-plan.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/convert-export-impact.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r1-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r1-10-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r1-20-postexport.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r1-21-postexport-full.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r2-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r2b-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r2b-10-deviceedit.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r2b-30-postsync.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r3-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r3-10-deviceedit.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r3-40-resync.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r3-41-reexport-full.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-11317782-r3-20-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-11317782-r3-30-postsync.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-121715696-r1-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-121715696-r1-10-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-121715696-r1-20-postexport.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-121715696-r2-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-121715696-r2b-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-121715696-r2b-00-lib.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-121715696-r2b-20-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-121715696-r2b-30-postsync.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-140193439-r3-20-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-140193439-r3-30-postsync.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-258421826-r1-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-258421826-r1-10-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-258421826-r1-20-postexport.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-258421826-r2-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-258421826-r2b-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-258421826-r2b-00-lib.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-258421826-r2b-20-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-258421826-r2b-30-postsync.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-268012584-r3-20-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-268012584-r3-30-postsync.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-53013048-r1-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-53013048-r1-10-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-53013048-r1-20-postexport.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-53013048-r2-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-53013048-r2b-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-53013048-r2b-00-lib.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-53013048-r2b-20-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-53013048-r2b-30-postsync.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-54793376-r1-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-54793376-r1-10-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-54793376-r1-20-postexport.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-54793376-r2-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-54793376-r2b-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-54793376-r2b-20-postconvert.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/subject-54793376-r2b-30-postsync.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/scripts/export_diff.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/scripts/export_snapshot.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/convert-anlz-cue-impact-experiment2-plan.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/convert-anlz-cue-impact-experiment2.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/convert-anlz-cue-impact-test-plan.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/convert-anlz-cue-impact-verification.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/convert-anlz-cue-impact.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/decisions/convert-and-reanalysis-impact.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/decisions/convert-helper-structure.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/01-inventory.txt +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/02-cue-schema.txt +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/03-cue-fields-by-format.txt +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/04-anlz-deep.txt +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/05-census.txt +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/06-content-columns.txt +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/07-analysis-flags.txt +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/exp2-00-pvb2-origin.txt +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-00-zero.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-dyn-high-01.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-dyn-high-02.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-dyn-high-03.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-dyn-normal-01.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-dyn-normal-02.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-dyn-normal-03.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-01.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-02.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-03.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-04.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-05.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-auto-01.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-auto-02.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-auto-03.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-01.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-02.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-03.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-04.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-05.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-06.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-then-high.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-unlocked-ref.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-nth-mid-normal.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205157376-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205157376-aiff-postanalyze.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205157376-aiff-postconv.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205157376-combined-ctrl-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205157376-combined-ctrl-postanalyze.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205157376-combined-ctrl-postanalyze2.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-aiff-postanalyze.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-aiff-postconv.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-aiff-postopen.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-flac-ctrl-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-flac-ctrl-postanalyze.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-flac-ctrl-postanalyze2.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-flac-postconv.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-mp3-postanalyze.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-mp3-postconv.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-230928195-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-230928195-mp3-locked.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-230928195-mp3-postconv.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-230928195-mp3-unlocked-reanalyze.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-230928195-postlock.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-230928195-prelock.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-231283665-iso-rate-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-231283665-iso-rate-postanalyze.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-231283665-iso-rate-postconv.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-00-zero.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-dyn-high-01.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-dyn-high-02.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-dyn-high-03.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-dyn-normal-01.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-dyn-normal-02.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-dyn-normal-03.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-01.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-02.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-03.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-04.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-05.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-auto-01.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-auto-02.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-auto-03.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-01.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-02.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-03.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-04.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-05.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-06.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-locked.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-then-high.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-nth-mid-normal.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-34178159-iso-depth-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-34178159-iso-depth-postanalyze.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-34178159-iso-depth-postconv.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-7691309-pvb2-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-7691309-pvb2-postanalyze.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-7691309-pvb2-postconv.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/README.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/analysis_flags.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/anlz_census.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/anlz_deep.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/content_columns.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/cue_fields_by_format.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/cue_schema.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/grid_drift.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/inventory.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/pvb2_origin.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/reset_fresh_to_zero.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/restore_fixtures.sh +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/row_snapshot.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/decisions/edit-field-handlers.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/edit-relational-fields-test-plan.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/edit-relational-fields.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-112264610-e2-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-112264610-e2-10-reuse.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-141833798-e3b-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-141833798-e3b-10-newalbum.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-145166719-e0-census.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-176388182-e1-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-176388182-e1-10-reuse.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-183309432-e4-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-183309432-e4-10-orphaned.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-47413782-v-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-47413782-v-10-reuse.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-50395296-v-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-50395296-v-10-reuse.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-57701453-e3-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-57701453-e3-10-diffartist.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-71974950-v-00-baseline.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-71974950-v-10-reuse.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/scripts/relational_diff.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/scripts/relational_snapshot.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/file-types/README.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/file-types/decisions/unknown-file-types.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/evidence/column-coverage-gig.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/evidence/datecreated-source-gig.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/evidence/filetype-searchstr-gig.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/evidence/filetype-searchstr-local.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/evidence/import-row-shape-gig.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/evidence/tag-key-mapping-gig.json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/import-track-row-shape.md +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/scripts/column_coverage.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/scripts/datecreated_source.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/scripts/filetype_and_searchstr.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/scripts/import_row_shape.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/scripts/tag_key_mapping.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/shared/scripts/subject_diff.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/shared/scripts/subject_snapshot.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/ruff.toml +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/__init__.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/__init__.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/test_search.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/__init__.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/test_main.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/test_search.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/Dockerfile +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/__init__.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/__snapshots__/test_journey/test_search_full_json_snapshot[macos].json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/__snapshots__/test_journey/test_search_full_json_snapshot[windows].json +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/__snapshots__/test_journey.ambr +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/conftest.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/01-flac-44_1k-16b.flac +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/02-flac-96k-24b.flac +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/03-alac-44_1k-16b.m4a +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/04-alac-48k-24b.m4a +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/05-aiff-44_1k-16b.aiff +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/06-wav-96k-24b.wav +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/07-mp3-44_1k-320cbr.mp3 +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/08-mp3-44_1k-v0vbr.mp3 +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/09-aac-44_1k-256kbps.m4a +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/10-/303/274/303/261/303/256c/303/266d/303/251-flac-44_1k-16b.flac" +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/macos/master.6.8.6.db +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/windows/master.6.8.6.db +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/test_import.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/test_journey.py +0 -0
- {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_tags.py +0 -0
|
@@ -105,7 +105,7 @@ jobs:
|
|
|
105
105
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
106
106
|
|
|
107
107
|
- name: Create GitHub Pre-Release
|
|
108
|
-
uses: softprops/action-gh-release@
|
|
108
|
+
uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3
|
|
109
109
|
with:
|
|
110
110
|
token: ${{ secrets.WORKFLOW_TOKEN }}
|
|
111
111
|
tag_name: canary-v${{ steps.version.outputs.version }}
|
|
@@ -49,7 +49,7 @@ jobs:
|
|
|
49
49
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
50
50
|
|
|
51
51
|
- name: Release
|
|
52
|
-
uses: softprops/action-gh-release@
|
|
52
|
+
uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3
|
|
53
53
|
with:
|
|
54
54
|
token: ${{ secrets.WORKFLOW_TOKEN }}
|
|
55
55
|
body_path: release-notes.md
|
|
@@ -1,6 +1,204 @@
|
|
|
1
|
-
## v0.11.0.
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
## v0.11.0.dev4 (2026-09-05)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
- chore(deps): update dependency pydantic to v2.13.5 (#208)
|
|
5
|
+
- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
|
|
6
|
+
- chore(deps): update dependency ty to v0.0.77 (#209)
|
|
7
|
+
- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
|
|
8
|
+
- chore(deps): update dependency platformdirs to v4.11.7 (#207)
|
|
9
|
+
- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
|
|
10
|
+
- chore(deps): update softprops/action-gh-release digest to efb3536 (#206)
|
|
11
|
+
- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
|
|
12
|
+
|
|
13
|
+
## v0.11.0 (2026-09-02)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
- feat(convert)!: require --format-out
|
|
17
|
+
- BREAKING CHANGE: --format-out and ConvertRequest.format_out no longer
|
|
18
|
+
default to aiff. A run that picked its own target format was a guess at
|
|
19
|
+
what the caller wanted.
|
|
20
|
+
- docs: state what --yes means in one place
|
|
21
|
+
- The rule is that --yes takes the default answer to every prompt, and that a
|
|
22
|
+
gate's default is no. Each command page now links to it rather than
|
|
23
|
+
restating it.
|
|
24
|
+
- feat(convert): ask before overwriting existing output files
|
|
25
|
+
- Existing output files were skipped with only a warning count, so a run could
|
|
26
|
+
pass over them without the user noticing. The prompt defaults to no, and
|
|
27
|
+
--overwrite answers it up front.
|
|
28
|
+
- feat(convert)!: default --delete-originals to none
|
|
29
|
+
- BREAKING CHANGE: the default changes from lossless to none. Deleting a
|
|
30
|
+
source file now takes an explicit --delete-originals on the command line,
|
|
31
|
+
so `rbe convert --yes` no longer removes originals nobody asked it to.
|
|
32
|
+
- feat(edit)!: replace --force with --allow-missing and --allow-mismatch
|
|
33
|
+
- BREAKING CHANGE: --force and EditRequest.force are replaced by one flag per
|
|
34
|
+
gate, --allow-missing and --allow-mismatch, so authorizing a path with no
|
|
35
|
+
file behind it no longer also authorizes cues landing misaligned.
|
|
36
|
+
FieldHandler.forceable_skip_reasons becomes gated_skip_reasons, mapping each
|
|
37
|
+
reason to the request field that lifts it.
|
|
38
|
+
- refactor(edit)!: drop --multi
|
|
39
|
+
- BREAKING CHANGE: --multi is removed, along with EditRequest.multi and the
|
|
40
|
+
API guard behind it. --yes alone authorizes an edit across every matched
|
|
41
|
+
track, and an API caller has dry_run to inspect a plan first.
|
|
42
|
+
- docs: rewordings
|
|
43
|
+
- docs: reword the write guards and skip reasons
|
|
44
|
+
- One skip message was keyed on "length_mismatch (override with --force)",
|
|
45
|
+
which no SkippedTrack.reason can equal, so that reason went unreported. The
|
|
46
|
+
suffix belongs in the message. A test now asserts every key is a SkipReason.
|
|
47
|
+
- refactor(cli): move _click into the cli package
|
|
48
|
+
- Only cli modules imported it, but it sat at the package root. PrintChoice
|
|
49
|
+
went to logger.py, whose set_level is its real consumer and which is not a
|
|
50
|
+
click construct, so no root module now imports click or the cli package.
|
|
51
|
+
- fix(edit): report the tracks it passed over
|
|
52
|
+
- edit named skipped tracks in no code path: the held-back message sat after
|
|
53
|
+
the --yes branch had already returned, and _print_edit_result counted only
|
|
54
|
+
what it applied. A filter matching 30 tracks and editing 4 looked like it
|
|
55
|
+
found 4. convert and import already did this.
|
|
56
|
+
- feat(import): add --interactive, and let --dry-run walk directories
|
|
57
|
+
- import was the only write command without per-item confirmation. Its walk
|
|
58
|
+
gate also treated --dry-run as unauthorized, so previewing a directory was
|
|
59
|
+
refused even though it writes nothing and previewing is how you inspect what
|
|
60
|
+
a walk covers.
|
|
61
|
+
- A newly created track placed in a playlist stays one op, so it asks once.
|
|
62
|
+
- docs: match the guard and multi-flag changes
|
|
63
|
+
- The refusal now fires where the write happens rather than before the
|
|
64
|
+
preview, and --multi is only required of an unattended run, so the examples
|
|
65
|
+
that paired it with --dry-run or an interactive run no longer need it.
|
|
66
|
+
- fix(cli): reject --interactive alongside --yes or --dry-run
|
|
67
|
+
- Both commands branched on `yes or dry_run` and returned before reading
|
|
68
|
+
interactive, so the flag was discarded without a word. The scripting-mode
|
|
69
|
+
error compounded it by advising --yes, which is what threw it away.
|
|
70
|
+
- fix(edit): scope the multi guard to the unattended path
|
|
71
|
+
- A dry run writes nothing, so refusing to preview a bulk edit contradicted
|
|
72
|
+
the guard's own advice to inspect with one first, and it blocked
|
|
73
|
+
--interactive: that path previews before prompting, so it could never reach
|
|
74
|
+
the per-track confirmation it exists for. --yes and a one-shot edit() still
|
|
75
|
+
need multi.
|
|
76
|
+
- feat(api): guard writes in the API rather than the CLI
|
|
77
|
+
- The refusal to write while Rekordbox is open, and the single-writer lock,
|
|
78
|
+
were both CLI-only: any Python caller wrote underneath a running Rekordbox
|
|
79
|
+
and could interleave with another process. Each write function now enters
|
|
80
|
+
through writing(), and the advisory lock is re-entrant so the CLI's
|
|
81
|
+
whole-run lock still nests around it.
|
|
82
|
+
- A preview reaches neither check, so an interactive run refuses at the apply
|
|
83
|
+
pass instead of before the preview.
|
|
84
|
+
- fix(convert): report a missing FFmpeg as a missing dependency
|
|
85
|
+
- convert() raised a bare RuntimeError, so main() logged it as an unhandled
|
|
86
|
+
exception and asked the user to file a bug for an empty PATH. The edit path
|
|
87
|
+
failed differently: FolderPathField swallowed the probe error and reported
|
|
88
|
+
every track as unknown_file_type. Both now reach require_ffmpeg, the single
|
|
89
|
+
presence check.
|
|
90
|
+
- refactor(errors): give the API one exception hierarchy
|
|
91
|
+
- Bad input, a missing dependency, and an aborted write each had their own
|
|
92
|
+
unrelated base, so a caller could not catch one type and every command
|
|
93
|
+
repeated its own translation. with_database now owns the mapping to exit
|
|
94
|
+
codes, and confirm/UserQuit move to the CLI, leaving the shared layer free
|
|
95
|
+
of click.
|
|
96
|
+
- docs: note that the write pass applies only the previewed ops
|
|
97
|
+
- test(query): cover find_content_by_ids
|
|
98
|
+
- feat(import): import the ops the user approved
|
|
99
|
+
- The write pass re-walked every requested directory, so a file created
|
|
100
|
+
during the confirmation prompt was imported having never been previewed.
|
|
101
|
+
It now takes the previewed ops, which also retires the second directory
|
|
102
|
+
gate. _narrow_to_track_ids goes with it, unused now that interactive
|
|
103
|
+
selection filters the op list directly.
|
|
104
|
+
- feat(convert): convert the ops the user approved
|
|
105
|
+
- The apply pass re-ran the filter and classifier, so a track that started
|
|
106
|
+
matching during the confirmation prompt joined the batch unpreviewed. It
|
|
107
|
+
now takes the previewed ops and re-checks each op's source and output
|
|
108
|
+
paths, reporting a change as filesystem_changed.
|
|
109
|
+
- feat(edit): apply the ops the user approved
|
|
110
|
+
- The apply pass took the filter args and re-ran the query and classifier,
|
|
111
|
+
so a row that started matching during the confirmation prompt joined the
|
|
112
|
+
edit unpreviewed. It now takes the previewed ops, loads those rows by ID,
|
|
113
|
+
and reports an op whose file changed as filesystem_changed.
|
|
114
|
+
- fix(edit): guard the apply pass against usage errors and stale probes
|
|
115
|
+
- The --multi guard can fire on the apply pass, where it reached the
|
|
116
|
+
unhandled-exception handler. FolderPathField's probe cache is a
|
|
117
|
+
module-scope singleton's state and outlived its request.
|
|
118
|
+
- refactor(api): name the reserved USN block's upper bound
|
|
119
|
+
- docs: update docs on USN reservation
|
|
120
|
+
- fix(cli): refuse to write while Rekordbox is running
|
|
121
|
+
- Rekordbox holds rows in memory and can write its own copy back over
|
|
122
|
+
ours, so the "Continue anyway?" prompt offered a choice nobody can make
|
|
123
|
+
safely. Dry runs still run: they write nothing.
|
|
124
|
+
- fix: stamp all edited/converted/imported rows with a USN
|
|
125
|
+
- - convert: per-file commits mean per-file stamps, so an interrupted batch leaves
|
|
126
|
+
every committed row correctly stamped.
|
|
127
|
+
- - import: Artist, album, genre, and label rows created along the way take one
|
|
128
|
+
each. They are collected as they are made: add_content flushes, which
|
|
129
|
+
moves them out of session.new first.
|
|
130
|
+
- fix(api): add USN stamping, wired to nothing yet
|
|
131
|
+
- Reserves a block of counter values in one expression UPDATE rather than
|
|
132
|
+
reading the counter and writing it back. Rekordbox writes to the same
|
|
133
|
+
counter, so the naive shape loses increments silently.
|
|
134
|
+
- chore(cli): Add thematic colors to console output
|
|
135
|
+
- feat(convert): show a live progress display while encoding
|
|
136
|
+
- A line per file in flight, capped by --threads, above an overall bar.
|
|
137
|
+
Files spin rather than fill: ffmpeg reports twice a second and a track
|
|
138
|
+
encodes in about two, so a per-file percentage would show three frames.
|
|
139
|
+
Suppressed in scripting modes and when stdout is not a terminal.
|
|
140
|
+
- refactor(logger): route console output through rich
|
|
141
|
+
- Log lines and rich tables now share one renderer. Markup is disabled
|
|
142
|
+
because rich reads a bracketed run as a style tag: a track named
|
|
143
|
+
"Set [b].wav" would otherwise log as "Set .wav".
|
|
144
|
+
- fix(convert): print the batch summary once
|
|
145
|
+
- Both the API and the CLI logged "Converted N files to X", so an
|
|
146
|
+
interactive run showed it twice. The API keeps its debug line; the
|
|
147
|
+
user-facing summary belongs to the caller.
|
|
148
|
+
- fix(convert): keep ffmpeg off the terminal with -nostdin
|
|
149
|
+
- ffmpeg puts the tty in non-canonical mode to watch for keys like "q".
|
|
150
|
+
Concurrent encodes race on saving and restoring that state, and the loser
|
|
151
|
+
restores raw mode, leaving the shell echoing ^M instead of accepting
|
|
152
|
+
Enter. One encode never showed it; four reproduce it every time.
|
|
153
|
+
- docs: measure how convert scales across output formats
|
|
154
|
+
- Uncompressed output is not disk-bound as assumed. ffmpeg already threads
|
|
155
|
+
the decode, so the gain from --threads is the spare cores divided by
|
|
156
|
+
those a single conversion already uses.
|
|
157
|
+
- chore: update codecov config
|
|
158
|
+
- docs(convert): document --threads and the result ordering
|
|
159
|
+
- feat(convert): print progress on completion and report an interrupt
|
|
160
|
+
- With several encodes in flight, a line printed at dispatch names a file
|
|
161
|
+
that is not the one being worked on next. Ctrl-C now says what it kept.
|
|
162
|
+
- feat(convert): add --threads to encode files concurrently
|
|
163
|
+
- Defaults to min(4, cpu_count): MP3 and FLAC output scale well across
|
|
164
|
+
files, while WAV and AIFF output is close to pure I/O and can get slower
|
|
165
|
+
under concurrency on the external drives DJs keep libraries on.
|
|
166
|
+
- refactor(convert): drain encodes through a thread pool
|
|
167
|
+
- Fixed at one worker, so behavior is unchanged. Results are drained in
|
|
168
|
+
submission order rather than completion order, and only as many jobs run
|
|
169
|
+
ahead of the drain point as the pool is wide, so an abort cannot burn the
|
|
170
|
+
whole batch's CPU first.
|
|
171
|
+
- refactor(convert): snapshot each encode's inputs into a plain job
|
|
172
|
+
- The encode half now takes values copied off the content row rather than
|
|
173
|
+
the row itself, so it can move onto a worker thread without reaching
|
|
174
|
+
back into a session that is not thread-safe.
|
|
175
|
+
- docs: record how master.db behaves under concurrent access
|
|
176
|
+
- Covers WAL mode, why a read opens no transaction, and how the identity
|
|
177
|
+
map hides fresh data, then applies it to the plan-apply window and to
|
|
178
|
+
maintaining the USN counter. Includes a glossary of the database terms.
|
|
179
|
+
- refactor(cli): pass confirmation flags to the scripting guard directly
|
|
180
|
+
- The guard read them off an object, so every caller built a throwaway class
|
|
181
|
+
to carry two booleans it already had as locals.
|
|
182
|
+
- refactor(convert): drop the record-update wrapper
|
|
183
|
+
- The probe and apply halves are called directly. The wrapper only chained
|
|
184
|
+
them and rebuilt a path the caller already had.
|
|
185
|
+
- docs(convert): describe what an interrupted run leaves behind
|
|
186
|
+
- feat(convert): report converted, failed, and unattempted counts on abort
|
|
187
|
+
- A stopped batch leaves real committed work, so it exits through a plain
|
|
188
|
+
error naming the failed file rather than through the crash handler.
|
|
189
|
+
- feat(convert): commit each conversion in its own transaction
|
|
190
|
+
- An interrupted run now leaves the database describing exactly the files
|
|
191
|
+
that converted, and each original is deleted right after its own commit,
|
|
192
|
+
so peak disk stays flat instead of doubling. ConvertAborted carries the
|
|
193
|
+
converted, failed, and not-attempted counts to the caller.
|
|
194
|
+
- feat(convert): encode to a temp file and move it into place
|
|
195
|
+
- A hard kill now leaves a recognizable orphan rather than a truncated file
|
|
196
|
+
at the path the database points at. Each run sweeps the destination
|
|
197
|
+
directories it is about to write to.
|
|
198
|
+
- refactor(convert): split the record update into probe and apply halves
|
|
199
|
+
- The probe half reads the converted file without touching the session, so
|
|
200
|
+
it can move onto a worker thread when encoding goes parallel. Passing the
|
|
201
|
+
content row in retires a redundant re-query.
|
|
4
202
|
- fix(locking): raise the scripted lock wait to 30 seconds
|
|
5
203
|
- Also corrects the FAQ, which read as a blanket block on concurrent runs.
|
|
6
204
|
- feat(cli): serialize write commands behind a single-writer lock
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: rekordbox-edit
|
|
3
|
-
Version: 0.11.0.
|
|
3
|
+
Version: 0.11.0.dev4
|
|
4
4
|
Summary: Tools for managing and modifying a RekordBox library en-masse
|
|
5
5
|
Project-URL: Homepage, https://github.com/jviall/rekordbox-edit
|
|
6
6
|
Project-URL: Repository, https://github.com/jviall/rekordbox-edit
|
|
@@ -65,14 +65,14 @@ Edit track metadata:
|
|
|
65
65
|
|
|
66
66
|
```bash
|
|
67
67
|
# Fix a typo across every matching track title
|
|
68
|
-
rbe edit --title "Teh" Title --match "Teh" --replace "The"
|
|
68
|
+
rbe edit --title "Teh" Title --match "Teh" --replace "The"
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
Convert audio files:
|
|
72
72
|
|
|
73
73
|
```bash
|
|
74
74
|
# Preview what would be converted
|
|
75
|
-
rbe convert --artist "Daft Punk" --dry-run
|
|
75
|
+
rbe convert --artist "Daft Punk" --format-out aiff --dry-run
|
|
76
76
|
|
|
77
77
|
# Convert all FLAC or WAV files to AIFF without confirming
|
|
78
78
|
rbe convert --format flac --format wav --format-out aiff --yes
|
|
@@ -82,7 +82,7 @@ Import new tracks:
|
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
84
|
# Import a folder into the library and an existing playlist
|
|
85
|
-
rbe import "/Users/me/Music/New Tracks" --to-playlist "Recently Added" --
|
|
85
|
+
rbe import "/Users/me/Music/New Tracks" --to-playlist "Recently Added" --yes
|
|
86
86
|
```
|
|
87
87
|
|
|
88
88
|
See the [documentation](https://rekordbox-edit.readthedocs.io/) for every command, the full filtering language, and scripting recipes.
|
|
@@ -43,14 +43,14 @@ Edit track metadata:
|
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
45
|
# Fix a typo across every matching track title
|
|
46
|
-
rbe edit --title "Teh" Title --match "Teh" --replace "The"
|
|
46
|
+
rbe edit --title "Teh" Title --match "Teh" --replace "The"
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
Convert audio files:
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
52
|
# Preview what would be converted
|
|
53
|
-
rbe convert --artist "Daft Punk" --dry-run
|
|
53
|
+
rbe convert --artist "Daft Punk" --format-out aiff --dry-run
|
|
54
54
|
|
|
55
55
|
# Convert all FLAC or WAV files to AIFF without confirming
|
|
56
56
|
rbe convert --format flac --format wav --format-out aiff --yes
|
|
@@ -60,7 +60,7 @@ Import new tracks:
|
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
62
|
# Import a folder into the library and an existing playlist
|
|
63
|
-
rbe import "/Users/me/Music/New Tracks" --to-playlist "Recently Added" --
|
|
63
|
+
rbe import "/Users/me/Music/New Tracks" --to-playlist "Recently Added" --yes
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
See the [documentation](https://rekordbox-edit.readthedocs.io/) for every command, the full filtering language, and scripting recipes.
|
|
@@ -17,6 +17,20 @@ Different filter kinds — `artist` and `format` above — AND together by defau
|
|
|
17
17
|
|
|
18
18
|
`--print json` on any CLI command emits exactly these response envelopes, so the models below also document the JSON you get when scripting.
|
|
19
19
|
|
|
20
|
+
## Writing Safely
|
|
21
|
+
|
|
22
|
+
`edit`, `convert`, and `import_tracks` each have checks against concurrent writes. They will refuse to run while Rekordbox is open, raising
|
|
23
|
+
[`RekordboxRunningError`][rekordbox_edit.errors.RekordboxRunningError], and each will grab a single-writer advisory lock for the
|
|
24
|
+
duration of the write to prevent concurrent writes by other rekordbox-edit processes.
|
|
25
|
+
|
|
26
|
+
## Errors
|
|
27
|
+
|
|
28
|
+
Most errors these functions raise descend from
|
|
29
|
+
[`RekordboxEditError`][rekordbox_edit.errors.RekordboxEditError].
|
|
30
|
+
[`InputError`][rekordbox_edit.errors.InputError] also subclasses `ValueError`.
|
|
31
|
+
|
|
32
|
+
::: rekordbox_edit.errors
|
|
33
|
+
|
|
20
34
|
## Functions
|
|
21
35
|
|
|
22
36
|
::: rekordbox_edit.api.search
|
|
@@ -32,83 +46,47 @@ Different filter kinds — `artist` and `format` above — AND together by defau
|
|
|
32
46
|
The models form three layers: the [`FilterArgs`][rekordbox_edit.models.FilterArgs] base that every command shares, the per-command requests and responses, and the lower-level domain types those req/resp models are built from.
|
|
33
47
|
|
|
34
48
|
::: rekordbox_edit.models.FilterArgs
|
|
35
|
-
options:
|
|
36
|
-
heading_level: 3
|
|
37
49
|
|
|
38
50
|
### Search
|
|
39
51
|
|
|
40
52
|
::: rekordbox_edit.models.SearchRequest
|
|
41
|
-
options:
|
|
42
|
-
heading_level: 4
|
|
43
53
|
|
|
44
54
|
::: rekordbox_edit.models.SearchResponse
|
|
45
|
-
options:
|
|
46
|
-
heading_level: 4
|
|
47
55
|
|
|
48
56
|
### Edit
|
|
49
57
|
|
|
50
58
|
::: rekordbox_edit.models.EditRequest
|
|
51
|
-
options:
|
|
52
|
-
heading_level: 4
|
|
53
59
|
|
|
54
60
|
::: rekordbox_edit.models.EditResponse
|
|
55
|
-
options:
|
|
56
|
-
heading_level: 4
|
|
57
61
|
|
|
58
62
|
::: rekordbox_edit.models.EditResult
|
|
59
|
-
options:
|
|
60
|
-
heading_level: 4
|
|
61
63
|
|
|
62
64
|
### Convert
|
|
63
65
|
|
|
64
66
|
::: rekordbox_edit.models.ConvertRequest
|
|
65
|
-
options:
|
|
66
|
-
heading_level: 4
|
|
67
67
|
|
|
68
68
|
::: rekordbox_edit.models.ConvertResponse
|
|
69
|
-
options:
|
|
70
|
-
heading_level: 4
|
|
71
69
|
|
|
72
70
|
::: rekordbox_edit.models.ConvertResult
|
|
73
|
-
options:
|
|
74
|
-
heading_level: 4
|
|
75
71
|
|
|
76
72
|
### Import
|
|
77
73
|
|
|
78
74
|
::: rekordbox_edit.models.ImportRequest
|
|
79
|
-
options:
|
|
80
|
-
heading_level: 4
|
|
81
75
|
|
|
82
76
|
::: rekordbox_edit.models.ImportResponse
|
|
83
|
-
options:
|
|
84
|
-
heading_level: 4
|
|
85
77
|
|
|
86
78
|
::: rekordbox_edit.models.ImportResult
|
|
87
|
-
options:
|
|
88
|
-
heading_level: 4
|
|
89
79
|
|
|
90
80
|
### Miscellaneous
|
|
91
81
|
|
|
92
82
|
::: rekordbox_edit.models.Track
|
|
93
|
-
options:
|
|
94
|
-
heading_level: 4
|
|
95
83
|
|
|
96
84
|
::: rekordbox_edit.models.EditOp
|
|
97
|
-
options:
|
|
98
|
-
heading_level: 4
|
|
99
85
|
|
|
100
86
|
::: rekordbox_edit.models.ConvertOp
|
|
101
|
-
options:
|
|
102
|
-
heading_level: 4
|
|
103
87
|
|
|
104
88
|
::: rekordbox_edit.models.ImportOp
|
|
105
|
-
options:
|
|
106
|
-
heading_level: 4
|
|
107
89
|
|
|
108
90
|
::: rekordbox_edit.models.SkippedTrack
|
|
109
|
-
options:
|
|
110
|
-
heading_level: 4
|
|
111
91
|
|
|
112
92
|
::: rekordbox_edit.models.SkipReason
|
|
113
|
-
options:
|
|
114
|
-
heading_level: 4
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# convert
|
|
2
|
+
|
|
3
|
+
Convert audio files between formats and update the Rekordbox database to point at the new files. Cues, analysis, beatgrids, and all other metadata are preserved — see [Frequently Asked Questions](../faqs.md) for more info.
|
|
4
|
+
|
|
5
|
+
## Supported Formats
|
|
6
|
+
|
|
7
|
+
- **Input:** FLAC, AIFF, WAV (hi-res formats only — lossy-compressed sources are skipped)
|
|
8
|
+
- **Output:** AIFF, FLAC, WAV, or MP3 (320kbps CBR), chosen with the required `--format-out`
|
|
9
|
+
|
|
10
|
+
Tracks already in the target format are skipped. So are tracks whose output file already exists: `convert` counts them and asks whether to overwrite, defaulting to no. `--yes` will skip these without asking, whereas `--overwrite` will overwrite them without asking.
|
|
11
|
+
|
|
12
|
+
## Bit Depth and Sample Rate
|
|
13
|
+
|
|
14
|
+
All conversions target **16-bit / 44.1 kHz**, with a few nuances:
|
|
15
|
+
|
|
16
|
+
- A source already at the target bit depth and sample rate converts losslessly.
|
|
17
|
+
- A higher-resolution source (say 24-bit or 96 kHz) is down-sampled to the target, and is considered **lossy** even between lossless formats.
|
|
18
|
+
- Other than conversion to MP3, which always encode to 44.1 kHz, a source with a lower sample rate than the target fidelity keeps its original sample rate.
|
|
19
|
+
|
|
20
|
+
## Originals: Delete or Keep
|
|
21
|
+
|
|
22
|
+
`--delete-originals` controls what happens to the source file after a successful conversion:
|
|
23
|
+
|
|
24
|
+
- `none` (default) — never delete the original
|
|
25
|
+
- `lossless` — delete the original only when the conversion lost no audio information; keep it when the conversion was lossy (MP3 output or down-sampled hi-res output)
|
|
26
|
+
- `all` — always delete the original
|
|
27
|
+
|
|
28
|
+
## Converting Several Files at Once
|
|
29
|
+
|
|
30
|
+
`convert` operates on four files at a time by default so long as your CPU has the cores to do so. You can customize this by passing `--threads N` (or `-t N`), with your CPU's number of cores as an upper limit.
|
|
31
|
+
|
|
32
|
+
Depending on your environment and target format, your mileage with more or less threads will vary. MP3 output speeds up close to linearly with more threads due to `libmp3lame` being a single-threaded process, whereas FLAC gains about a 50% with. WAV and AIFF outputs only see minor benefits, as `ffmpeg` already multithreads their decoding, and they don't require any encoding step. As such, you'll likely be limited by I/O speed rather than CPU when converting to WAV/AIFF.
|
|
33
|
+
|
|
34
|
+
If you're converting across a network (like a mapped drive), more threads will likely only slow you down as each thread competes for network capacity, but if you're converting on a local drive it is likely to improve performance at least somewhat.
|
|
35
|
+
|
|
36
|
+
## Interrupted Runs
|
|
37
|
+
|
|
38
|
+
If a run stops partway, whether from a conversion failure, a full disk, or a Ctrl-C, everything it finished is kept and nothing is left half-converted. `convert` tells you which file it stopped on, how many converted, and how many it never got to. Rerun the same command to pick up where it left off.
|
|
39
|
+
|
|
40
|
+
A track whose file has moved or been deleted since the preview is skipped, and the rest of the batch continues.
|
|
41
|
+
|
|
42
|
+
## Examples
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Preview conversion
|
|
46
|
+
rbe convert --format-out aiff --format flac --dry-run
|
|
47
|
+
|
|
48
|
+
# Convert and skip confirmation
|
|
49
|
+
rbe convert --format-out wav --artist "Burial" --yes
|
|
50
|
+
|
|
51
|
+
# Convert to MP3 but delete originals
|
|
52
|
+
rbe convert --format-out mp3 --playlist "Export" --yes --delete-originals all
|
|
53
|
+
|
|
54
|
+
# Delete originals only where the conversion lost nothing
|
|
55
|
+
rbe convert --format-out aiff --format flac --yes --delete-originals lossless
|
|
56
|
+
|
|
57
|
+
# Get just the IDs of files that would be converted
|
|
58
|
+
rbe convert --format-out aiff --format flac --print ids --dry-run
|
|
59
|
+
|
|
60
|
+
# Convert everything a search finds
|
|
61
|
+
rbe search --artist "Lauryn Hill" --print ids | rbe convert --format-out aiff --yes
|
|
62
|
+
|
|
63
|
+
# Max out your CPU to handle a batch of MP3s
|
|
64
|
+
rbe convert --format-out mp3 --playlist "NeedsConverting" --threads 8 --yes
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Checks
|
|
68
|
+
|
|
69
|
+
- Without flags, `convert` shows every planned change and asks once before applying. See [Confirmations](../filtering.md#confirmations) for how `--dry-run`, `--interactive`, and `--yes` change that.
|
|
70
|
+
- `convert` will encode exactly the tracks the preview showed. If in between the time you're prompted and later confirm a new track that matches your filters lands in your library, it won't be included.
|
|
71
|
+
- **Rekordbox running:** Writing while Rekordbox is open risks losing your changes, so `convert` will refuse to perform any writes. `--dry-run` is unaffected.
|
|
72
|
+
- Before a large run, walk through the checklist in [What Should I Do Before Converting?](../faqs.md#what-should-i-do-before-converting)
|
|
73
|
+
|
|
74
|
+
## Reference
|
|
75
|
+
|
|
76
|
+
<!-- prettier-ignore -->
|
|
77
|
+
::: mkdocs-click
|
|
78
|
+
:module: rekordbox_edit.cli.convert
|
|
79
|
+
:command: convert_command
|
|
80
|
+
:prog_name: rbe convert
|
|
81
|
+
:depth: 1
|
|
@@ -15,50 +15,50 @@ rbe edit [OPTIONS] [TRACK-IDS]... FIELD
|
|
|
15
15
|
rbe edit --exact-title "Untitled 3" Title --replace "Acid Rain"
|
|
16
16
|
|
|
17
17
|
# Fix a typo across many titles (substring replacement)
|
|
18
|
-
rbe edit --title "Teh" Title --match "Teh" --replace "The"
|
|
18
|
+
rbe edit --title "Teh" Title --match "Teh" --replace "The"
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
## FolderPath
|
|
22
22
|
|
|
23
|
-
`FolderPath` repoints a track at an audio file on disk. Because
|
|
23
|
+
`FolderPath` repoints a track at an audio file on disk. Because several other columns are implicitly based on this path and other file metadata, the edit keeps these dependent columns consistent:
|
|
24
24
|
|
|
25
25
|
- `FileNameL` always matches the new path's file name, and `OrgFolderPath` is updated when it matched the old path.
|
|
26
26
|
- When the new file's size differs from the recorded `FileSize`, the file is probed and all of `FileType`, `SampleRate`, `BitDepth`, `BitRate`, `FileSize`, and `Length` are rewritten to match it.
|
|
27
|
-
- When the file name changes, the `PPTH` path tag inside the track's analysis (ANLZ) files is rewritten to match. All other analysis data is
|
|
27
|
+
- When the file name changes, the `PPTH` path tag inside the track's analysis (ANLZ) files is rewritten to match. All other analysis data is left alone.
|
|
28
28
|
|
|
29
29
|
By default edits will be skipped in the following cases:
|
|
30
30
|
|
|
31
31
|
- The new path's file does not exist.
|
|
32
32
|
- The new path points to a file whose duration doesn't match what's in rekordbox _and_ the track has cues or an analysis, since those are time-indexed and would land misaligned.
|
|
33
|
-
- The file's format is one Rekordbox doesn't support--always skipped.
|
|
33
|
+
- The file's format is one Rekordbox doesn't support--this is always skipped.
|
|
34
34
|
|
|
35
|
-
`edit` lists the
|
|
35
|
+
Each of the first two cases is a gate with its own flag, and `edit` lists the tracks it holds back and asks about it separately: `--allow-missing` writes a path with no file behind it, updating only the path columns, and `--allow-mismatch` accepts a duration that contradicts the stored length. Passing a flag answers its question up front, so no prompt appears. `--yes` takes the default answer to every prompt, and a gate's default is no, so `--yes` on its own leaves the held-back tracks skipped and reports them.
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
38
|
# Relocate a library folder in bulk
|
|
39
|
-
rbe edit FolderPath --match "/Volumes/OldDrive/Music" --replace "/Volumes/NewDrive/Music"
|
|
39
|
+
rbe edit FolderPath --match "/Volumes/OldDrive/Music" --replace "/Volumes/NewDrive/Music"
|
|
40
40
|
|
|
41
41
|
# Point one track at a replacement file
|
|
42
42
|
rbe edit --exact-title "Acid Rain" FolderPath --replace "/Users/me/Music/acid-rain-remaster.flac"
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
##
|
|
45
|
+
## Checks
|
|
46
46
|
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
- **Rekordbox running:**
|
|
47
|
+
- Without flags, `edit` shows every planned change and asks once before applying. See [Confirmations](../filtering.md#confirmations) for how `--dry-run`, `--interactive`, and `--yes` change that.
|
|
48
|
+
- `edit` writes exactly the tracks the preview showed. If in between the time you're prompted and later confirm a new track lands in your library that matches your filters, it won't be included. A track whose file changed in that window is skipped rather than written with stale metadata.
|
|
49
|
+
- **Rekordbox running:** writing while Rekordbox is open risks losing your changes, so `edit` will refuse to perform any writes. `--dry-run` is unaffected.
|
|
50
50
|
|
|
51
51
|
## Examples
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
# Preview a cleanup without touching the database
|
|
55
|
-
rbe edit --title "(Original Mix)" Title --match " (Original Mix)" --replace "" --
|
|
55
|
+
rbe edit --title "(Original Mix)" Title --match " (Original Mix)" --replace "" --dry-run
|
|
56
56
|
|
|
57
57
|
# Apply it, confirming each track
|
|
58
|
-
rbe edit --title "(Original Mix)" Title --match " (Original Mix)" --replace "" --
|
|
58
|
+
rbe edit --title "(Original Mix)" Title --match " (Original Mix)" --replace "" --interactive
|
|
59
59
|
|
|
60
60
|
# Pipe a search result in and edit those exact tracks
|
|
61
|
-
rbe search --playlist "Mislabeled" --print ids | rbe edit Title --match " " --replace " " --
|
|
61
|
+
rbe search --playlist "Mislabeled" --print ids | rbe edit Title --match " " --replace " " --yes
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
See [Filtering](../filtering.md) for the full filter language.
|
|
@@ -31,18 +31,15 @@ It does not analyze audio. `SampleRate`, `BitDepth`, and `BPM` read as `0` on a
|
|
|
31
31
|
|
|
32
32
|
A file that already has a row in the library but is missing from the named playlist is added to that playlist rather than skipped outright.
|
|
33
33
|
|
|
34
|
-
## Directories
|
|
35
|
-
|
|
36
|
-
A directory argument is walked recursively for audio files. Ran interactively, `import` reports how many files it found and asks you to confirm before continuing. `--yes` skips this prompt, and is required when providing a non-interactive `--print` mode and a directory argument.
|
|
37
|
-
|
|
38
34
|
## Skipped Files
|
|
39
35
|
|
|
40
|
-
A file already in the library, matched by its resolved, case-insensitive path, is skipped rather than duplicated. One that cannot be read as audio, or that is not an audio file at all, is skipped with a warning, and the rest of the batch continues.
|
|
36
|
+
A file already in the library, matched by its resolved, case-insensitive path, is skipped rather than duplicated. One that cannot be read as audio, or that is not an audio file at all, is skipped with a warning, and the rest of the batch continues. A file that disappears between the preview and the write is skipped too.
|
|
41
37
|
|
|
42
|
-
##
|
|
38
|
+
## Checks
|
|
43
39
|
|
|
44
|
-
-
|
|
45
|
-
-
|
|
40
|
+
- Without flags, `import` shows every track it plans to add and asks once before writing. See [Confirmations](../filtering.md#confirmations) for how `--dry-run`, `--interactive`, and `--yes` change that.
|
|
41
|
+
- A directory argument is walked recursively for audio files. Ran interactively, `import` reports how many files it found and asks before continuing. `--yes` authorizes the walk outright, and is required alongside a non-interactive `--print` mode. `--dry-run` walks without asking, since it writes nothing.
|
|
42
|
+
- **Rekordbox running:** writing while Rekordbox is open risks losing your changes, so `import` will refuse to perform any writes. `--dry-run` is unaffected.
|
|
46
43
|
|
|
47
44
|
## Reference
|
|
48
45
|
|
|
@@ -15,7 +15,7 @@ rbe search --playlist "Techno" --print ids
|
|
|
15
15
|
rbe search --playlist "Techno" --format flac --match-any
|
|
16
16
|
|
|
17
17
|
# Feed results to another command
|
|
18
|
-
rbe search --artist "Lauryn Hill" --print ids | rbe convert --yes
|
|
18
|
+
rbe search --artist "Lauryn Hill" --print ids | rbe convert --format-out aiff --yes
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
See [Filtering](../filtering.md) for the full filter language and piping recipes.
|