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.
Files changed (341) hide show
  1. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/workflows/cd.yml +1 -1
  2. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/workflows/release.yml +1 -1
  3. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.gitignore +1 -0
  4. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/CHANGELOG.md +201 -3
  5. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/PKG-INFO +4 -4
  6. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/README.md +3 -3
  7. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/codecov.yml +6 -0
  8. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/api.md +14 -36
  9. rekordbox_edit-0.11.0.dev4/docs/commands/convert.md +81 -0
  10. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/commands/edit.md +13 -13
  11. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/commands/import.md +5 -8
  12. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/commands/search.md +1 -1
  13. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/faqs.md +16 -18
  14. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/filtering.md +16 -2
  15. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/pyproject.toml +1 -1
  16. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/__init__.py +2 -2
  17. rekordbox_edit-0.11.0.dev4/rekordbox_edit/api/_utils.py +152 -0
  18. rekordbox_edit-0.11.0.dev4/rekordbox_edit/api/convert.py +768 -0
  19. rekordbox_edit-0.11.0.dev4/rekordbox_edit/api/edit.py +151 -0
  20. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/api/field_handlers.py +28 -6
  21. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/api/import_.py +68 -35
  22. {rekordbox_edit-0.11.0.dev3/rekordbox_edit → rekordbox_edit-0.11.0.dev4/rekordbox_edit/cli}/_click.py +20 -18
  23. rekordbox_edit-0.11.0.dev4/rekordbox_edit/cli/_progress.py +98 -0
  24. rekordbox_edit-0.11.0.dev4/rekordbox_edit/cli/_utils.py +203 -0
  25. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/convert.py +101 -37
  26. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/edit.py +88 -40
  27. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/import_.py +66 -36
  28. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/search.py +2 -3
  29. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/display.py +81 -7
  30. rekordbox_edit-0.11.0.dev4/rekordbox_edit/errors.py +52 -0
  31. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/locking.py +10 -5
  32. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/logger.py +48 -12
  33. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/models.py +23 -9
  34. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/query.py +19 -1
  35. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/tags.py +3 -1
  36. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/utils.py +29 -81
  37. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/README.md +9 -0
  38. rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/convert-thread-scaling.md +113 -0
  39. rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/evidence/thread-scaling.txt +30 -0
  40. rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/scripts/_sources.py +52 -0
  41. rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/scripts/format_scaling.py +80 -0
  42. rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/scripts/shipped_path_scaling.py +71 -0
  43. rekordbox_edit-0.11.0.dev4/research/convert-thread-scaling/scripts/write_cost.py +83 -0
  44. rekordbox_edit-0.11.0.dev4/research/database-concurrency/database-concurrency.md +197 -0
  45. rekordbox_edit-0.11.0.dev4/research/database-concurrency/evidence/plan-apply-probes.txt +16 -0
  46. rekordbox_edit-0.11.0.dev4/research/database-concurrency/evidence/usn-spikes.txt +27 -0
  47. rekordbox_edit-0.11.0.dev4/research/database-concurrency/plan-apply-window.md +71 -0
  48. rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/block_reservation.py +77 -0
  49. rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/concurrent_increment.py +104 -0
  50. rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/identity_probe.py +50 -0
  51. rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/membership_probe.py +49 -0
  52. rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/snapshot_probe.py +44 -0
  53. rekordbox_edit-0.11.0.dev4/research/database-concurrency/scripts/wal_snapshot.py +62 -0
  54. rekordbox_edit-0.11.0.dev4/research/database-concurrency/usn-maintenance.md +146 -0
  55. rekordbox_edit-0.11.0.dev4/research/import-track-row-shape/decisions/commit-semantics-and-usn.md +121 -0
  56. rekordbox_edit-0.11.0.dev4/tests/api/conftest.py +45 -0
  57. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/test_convert.py +1189 -325
  58. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/test_edit.py +179 -21
  59. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/test_field_handlers.py +70 -9
  60. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/test_import.py +142 -1
  61. rekordbox_edit-0.11.0.dev4/tests/api/test_utils.py +277 -0
  62. rekordbox_edit-0.11.0.dev4/tests/cli/test_convert.py +580 -0
  63. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/test_edit.py +218 -42
  64. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/test_import.py +89 -22
  65. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/test_locking.py +14 -11
  66. rekordbox_edit-0.11.0.dev4/tests/cli/test_progress.py +118 -0
  67. rekordbox_edit-0.11.0.dev4/tests/cli/test_utils.py +324 -0
  68. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/conftest.py +8 -0
  69. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/test_edit_fields.py +1 -1
  70. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_display.py +66 -1
  71. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_locking.py +39 -5
  72. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_logger.py +37 -1
  73. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_models.py +7 -3
  74. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_query.py +27 -0
  75. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/test_utils.py +0 -96
  76. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/uv.lock +122 -122
  77. rekordbox_edit-0.11.0.dev3/docs/commands/convert.md +0 -62
  78. rekordbox_edit-0.11.0.dev3/rekordbox_edit/api/_utils.py +0 -79
  79. rekordbox_edit-0.11.0.dev3/rekordbox_edit/api/convert.py +0 -477
  80. rekordbox_edit-0.11.0.dev3/rekordbox_edit/api/edit.py +0 -112
  81. rekordbox_edit-0.11.0.dev3/rekordbox_edit/cli/_utils.py +0 -188
  82. rekordbox_edit-0.11.0.dev3/research/import-track-row-shape/decisions/commit-semantics-and-usn.md +0 -80
  83. rekordbox_edit-0.11.0.dev3/tests/api/test_utils.py +0 -56
  84. rekordbox_edit-0.11.0.dev3/tests/cli/test_convert.py +0 -308
  85. rekordbox_edit-0.11.0.dev3/tests/cli/test_utils.py +0 -195
  86. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.agent-style/RULES.md +0 -0
  87. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.agent-style/claude-code.md +0 -0
  88. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/build-release-notes/action.yml +0 -0
  89. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/build-release-notes/build_release_notes.py +0 -0
  90. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/commit-check/action.yml +0 -0
  91. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/commitizen-bump/action.yml +0 -0
  92. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/commitizen-bump/commitizen-bump.sh +0 -0
  93. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/e2e/action.yml +0 -0
  94. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/install/action.yml +0 -0
  95. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/lint/action.yml +0 -0
  96. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/actions/test/action.yml +0 -0
  97. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/workflows/ci.yml +0 -0
  98. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.github/workflows/publish.yml +0 -0
  99. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.pre-commit-config.yaml +0 -0
  100. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.python-version +0 -0
  101. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/.readthedocs.yaml +0 -0
  102. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/AGENTS.md +0 -0
  103. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/CLAUDE.md +0 -0
  104. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/CONTRIBUTING.md +0 -0
  105. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/LICENSE +0 -0
  106. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/Makefile +0 -0
  107. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docker-compose.yml +0 -0
  108. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/index.md +0 -0
  109. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/docs/stylesheets/extra.css +0 -0
  110. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/mkdocs.yml +0 -0
  111. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/api/__init__.py +0 -0
  112. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/api/search.py +0 -0
  113. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/__init__.py +0 -0
  114. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/rekordbox_edit/cli/main.py +0 -0
  115. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/renovate.json5 +0 -0
  116. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/convert-export-impact-test-plan.md +0 -0
  117. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/convert-export-impact.md +0 -0
  118. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r1-00-baseline.json +0 -0
  119. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r1-10-postconvert.json +0 -0
  120. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r1-20-postexport.json +0 -0
  121. {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
  122. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r2-00-baseline.json +0 -0
  123. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r2b-00-baseline.json +0 -0
  124. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r2b-10-deviceedit.json +0 -0
  125. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r2b-30-postsync.json +0 -0
  126. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r3-00-baseline.json +0 -0
  127. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r3-10-deviceedit.json +0 -0
  128. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/evidence/export-r3-40-resync.json +0 -0
  129. {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
  130. {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
  131. {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
  132. {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
  133. {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
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. {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
  143. {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
  144. {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
  145. {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
  146. {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
  147. {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
  148. {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
  149. {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
  150. {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
  151. {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
  152. {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
  153. {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
  154. {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
  155. {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
  156. {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
  157. {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
  158. {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
  159. {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
  160. {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
  161. {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
  162. {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
  163. {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
  164. {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
  165. {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
  166. {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
  167. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/scripts/export_diff.py +0 -0
  168. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-export-impact/scripts/export_snapshot.py +0 -0
  169. {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
  170. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/convert-anlz-cue-impact-experiment2.md +0 -0
  171. {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
  172. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/convert-anlz-cue-impact-verification.md +0 -0
  173. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/convert-anlz-cue-impact.md +0 -0
  174. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/decisions/convert-and-reanalysis-impact.md +0 -0
  175. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/decisions/convert-helper-structure.md +0 -0
  176. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/01-inventory.txt +0 -0
  177. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/02-cue-schema.txt +0 -0
  178. {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
  179. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/04-anlz-deep.txt +0 -0
  180. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/05-census.txt +0 -0
  181. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/06-content-columns.txt +0 -0
  182. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/07-analysis-flags.txt +0 -0
  183. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/exp2-00-pvb2-origin.txt +0 -0
  184. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-00-zero.json +0 -0
  185. {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
  186. {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
  187. {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
  188. {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
  189. {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
  190. {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
  191. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-01.json +0 -0
  192. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-02.json +0 -0
  193. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-03.json +0 -0
  194. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-04.json +0 -0
  195. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-high-05.json +0 -0
  196. {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
  197. {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
  198. {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
  199. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-01.json +0 -0
  200. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-02.json +0 -0
  201. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-03.json +0 -0
  202. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-04.json +0 -0
  203. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-05.json +0 -0
  204. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-174954387-normal-06.json +0 -0
  205. {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
  206. {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
  207. {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
  208. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205157376-00-baseline.json +0 -0
  209. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205157376-aiff-postanalyze.json +0 -0
  210. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205157376-aiff-postconv.json +0 -0
  211. {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
  212. {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
  213. {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
  214. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-00-baseline.json +0 -0
  215. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-aiff-postanalyze.json +0 -0
  216. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-aiff-postconv.json +0 -0
  217. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-aiff-postopen.json +0 -0
  218. {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
  219. {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
  220. {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
  221. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-flac-postconv.json +0 -0
  222. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-mp3-postanalyze.json +0 -0
  223. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-205795680-mp3-postconv.json +0 -0
  224. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-230928195-00-baseline.json +0 -0
  225. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-230928195-mp3-locked.json +0 -0
  226. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-230928195-mp3-postconv.json +0 -0
  227. {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
  228. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-230928195-postlock.json +0 -0
  229. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-230928195-prelock.json +0 -0
  230. {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
  231. {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
  232. {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
  233. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-00-zero.json +0 -0
  234. {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
  235. {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
  236. {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
  237. {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
  238. {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
  239. {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
  240. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-01.json +0 -0
  241. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-02.json +0 -0
  242. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-03.json +0 -0
  243. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-04.json +0 -0
  244. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-high-05.json +0 -0
  245. {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
  246. {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
  247. {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
  248. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-01.json +0 -0
  249. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-02.json +0 -0
  250. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-03.json +0 -0
  251. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-04.json +0 -0
  252. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-05.json +0 -0
  253. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-06.json +0 -0
  254. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-27790898-normal-locked.json +0 -0
  255. {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
  256. {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
  257. {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
  258. {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
  259. {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
  260. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-7691309-pvb2-baseline.json +0 -0
  261. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-7691309-pvb2-postanalyze.json +0 -0
  262. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/evidence/subject-7691309-pvb2-postconv.json +0 -0
  263. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/README.md +0 -0
  264. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/analysis_flags.py +0 -0
  265. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/anlz_census.py +0 -0
  266. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/anlz_deep.py +0 -0
  267. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/content_columns.py +0 -0
  268. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/cue_fields_by_format.py +0 -0
  269. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/cue_schema.py +0 -0
  270. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/grid_drift.py +0 -0
  271. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/inventory.py +0 -0
  272. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/pvb2_origin.py +0 -0
  273. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/reset_fresh_to_zero.py +0 -0
  274. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/restore_fixtures.sh +0 -0
  275. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/convert-reanalysis-impact/scripts/row_snapshot.py +0 -0
  276. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/decisions/edit-field-handlers.md +0 -0
  277. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/edit-relational-fields-test-plan.md +0 -0
  278. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/edit-relational-fields.md +0 -0
  279. {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
  280. {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
  281. {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
  282. {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
  283. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/evidence/rel-145166719-e0-census.json +0 -0
  284. {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
  285. {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
  286. {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
  287. {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
  288. {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
  289. {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
  290. {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
  291. {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
  292. {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
  293. {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
  294. {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
  295. {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
  296. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/scripts/relational_diff.py +0 -0
  297. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/edit-relational-fields/scripts/relational_snapshot.py +0 -0
  298. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/file-types/README.md +0 -0
  299. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/file-types/decisions/unknown-file-types.md +0 -0
  300. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/evidence/column-coverage-gig.json +0 -0
  301. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/evidence/datecreated-source-gig.json +0 -0
  302. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/evidence/filetype-searchstr-gig.json +0 -0
  303. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/evidence/filetype-searchstr-local.json +0 -0
  304. {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
  305. {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
  306. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/import-track-row-shape.md +0 -0
  307. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/scripts/column_coverage.py +0 -0
  308. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/scripts/datecreated_source.py +0 -0
  309. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/scripts/filetype_and_searchstr.py +0 -0
  310. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/scripts/import_row_shape.py +0 -0
  311. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/import-track-row-shape/scripts/tag_key_mapping.py +0 -0
  312. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/shared/scripts/subject_diff.py +0 -0
  313. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/research/shared/scripts/subject_snapshot.py +0 -0
  314. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/ruff.toml +0 -0
  315. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/__init__.py +0 -0
  316. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/__init__.py +0 -0
  317. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/api/test_search.py +0 -0
  318. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/__init__.py +0 -0
  319. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/test_main.py +0 -0
  320. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/cli/test_search.py +0 -0
  321. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/Dockerfile +0 -0
  322. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/__init__.py +0 -0
  323. {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
  324. {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
  325. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/__snapshots__/test_journey.ambr +0 -0
  326. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/conftest.py +0 -0
  327. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/01-flac-44_1k-16b.flac +0 -0
  328. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/02-flac-96k-24b.flac +0 -0
  329. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/03-alac-44_1k-16b.m4a +0 -0
  330. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/04-alac-48k-24b.m4a +0 -0
  331. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/05-aiff-44_1k-16b.aiff +0 -0
  332. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/06-wav-96k-24b.wav +0 -0
  333. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/07-mp3-44_1k-320cbr.mp3 +0 -0
  334. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/08-mp3-44_1k-v0vbr.mp3 +0 -0
  335. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/audio/09-aac-44_1k-256kbps.m4a +0 -0
  336. {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
  337. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/macos/master.6.8.6.db +0 -0
  338. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/fixtures/windows/master.6.8.6.db +0 -0
  339. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/test_import.py +0 -0
  340. {rekordbox_edit-0.11.0.dev3 → rekordbox_edit-0.11.0.dev4}/tests/e2e/test_journey.py +0 -0
  341. {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@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3
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@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3
52
+ uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3
53
53
  with:
54
54
  token: ${{ secrets.WORKFLOW_TOKEN }}
55
55
  body_path: release-notes.md
@@ -55,5 +55,6 @@ site/
55
55
 
56
56
  # Superpowers SDD scratch
57
57
  .superpowers/
58
+ docs/superpowers/
58
59
 
59
60
  worktrees/
@@ -1,6 +1,204 @@
1
- ## v0.11.0.dev3 (2026-08-31)
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.dev3
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" --multi
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" --directory --yes
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" --multi
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" --directory --yes
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.
@@ -6,5 +6,11 @@ coverage:
6
6
  target: auto #default
7
7
  threshold: 1%
8
8
  base: auto
9
+ patch:
10
+ default:
11
+ # basic
12
+ target: auto
13
+ threshold: 1%
14
+ base: auto
9
15
  comment:
10
16
  require_changes: true
@@ -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" --multi
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 the database row carries more than the path, the edit keeps the dependent columns consistent:
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 preserved.
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 held-back tracks and asks once whether to include them. Providing the `--yes` flag will skip them without prompting whereas `--force` edit them anyway. Including a missing file writes only the path columns.
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" --multi
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
- ## Guardrails
45
+ ## Checks
46
46
 
47
- - **Preview and confirm by default.** Without flags, `edit` shows every planned change and asks once before applying. `--interactive` confirms each track individually; `--dry-run` previews without writing; `--yes` confirms the default choice for all prompts without asking.
48
- - **Single-track by default.** When filters match more than one track, `edit` refuses unless you pass `--multi`. This prevents an unintentionally broad filter from making unintended edits across your library.
49
- - **Rekordbox running:** editing while Rekordbox is open risks corrupting your database. By default `edit` warns; in a non-interactive mode (e.g. `--print ids`) it throws an error.
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 "" --multi --dry-run
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 "" --multi --interactive
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 " " --multi --yes
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
- ## Guardrails
38
+ ## Checks
43
39
 
44
- - **Preview and confirm by default.** Without flags, `import` shows every track it plans to add and asks once before writing; `--dry-run` previews without writing; `--yes` confirms the default choice for all prompts without asking.
45
- - **Rekordbox running:** importing while Rekordbox is open risks corrupting your database. By default `import` warns; in a non-interactive mode (e.g. `--print ids`) it throws an error.
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.