soulsync/webui/static
BoulderBadgeDad 9bf7881f7a #704: add "Relocate" fix for AcoustID mismatches — retag + restage for re-import
The 'retag' fix corrects a mismatched file's tags/DB but leaves it in the WRONG
artist/album folder, so the library shows the right title while the file sits under
the previous track. AcoustID yields only title+artist (no reliable album), so an
in-place move has no safe target.

New 'relocate' action: retag the file, move it into Staging, drop the stale tracks
row, and clean up the emptied folder. The auto-import worker (which watches Staging)
re-identifies it with full metadata and files it correctly — reusing the import
pipeline instead of guessing a destination.

- core/repair_jobs/relocate.py: pure, injectable orchestration (retag -> move ->
  drop row) + collision-safe staging_destination. Row is dropped only AFTER a
  successful move, so a failed move never orphans the library entry.
- _fix_acoustid_mismatch gains the 'relocate' branch (thin wrapper: resolve path,
  staging dir, drop-row closure, empty-parent cleanup).
- UI: "Relocate" button on the AcoustID-mismatch fix modal.

Tests (8): staging-dest collision suffixing; relocate happy path; tag-write failure
still relocates; FAILED move does NOT drop the row; no-tags skips write; a real
file move through safe_move_file; and a handler integration test (file moved to
staging + tracks row deleted end-to-end). Repair + integrity suites green.
2026-06-11 12:01:05 -07:00
..
docs
vendor
amazon.svg Wire Amazon Music enrichment worker into dashboard UI 2026-05-16 17:43:38 -07:00
api-monitor.js Watchlist page: hued action chips, meta chips, Global Settings reskin (#831 round 3) 2026-06-09 21:22:02 -07:00
artists.png
audiodb.png Dashboard: equalizer bars now show real brand logos in the avatar disc 2026-05-27 19:22:28 -07:00
auto-sync.js Fix organize-by-playlist downloads: library entries, wishlist, and stale Spotify cache 2026-06-03 10:26:32 +02:00
automation.png
basic-search-v2.css Basic search: visual overhaul + per-source picker in hybrid mode 2026-05-28 10:22:07 -07:00
beatport-ui.js
blocklist.js Blocklist Phase 1 (backfill + API + modal): the Blocklist button on the watchlist page 2026-06-07 15:25:52 -07:00
core.js Auto-Sync tile: light for the WHOLE pipeline, including scheduled auto-sync 2026-06-06 16:32:10 -07:00
dashboard.png
discover-section-controller.js
discover.js Discover: promote recommendations to a first-class section + show the 'why' 2026-06-03 18:28:19 -07:00
discover.png
docs-images-needed.md
docs.js
downloads.js resolve merge conflict in style.css 2026-06-11 18:21:04 +02:00
enrichment-manager.js Show "Running (Spotify Free)" instead of "rate limited" while the worker bridges 2026-06-05 22:08:07 -07:00
enrichment.js #704: add "Relocate" fix for AcoustID mismatches — retag + restage for re-import 2026-06-11 12:01:05 -07:00
explorer.png
favicon.png
help.png
helper.js What's New + version modal: 2.7.0-only, summarize the rest 2026-06-10 23:05:01 -07:00
hydrabase.png
import.png
init.js Security UI: show saved login password / recovery question state 2026-06-10 22:46:15 -07:00
library.js Artist Sync: unify with deep scan — server-diff stale removal, scoped to one artist 2026-06-10 19:43:25 -07:00
library.png
manifest.json
media-player.js #809 review follow-up: crossfade preload also streams un-mounted Navidrome tracks 2026-06-07 13:55:58 -07:00
mobile.css Mobile: notification panel fits the screen (override inline JS positioning) 2026-06-04 20:50:33 -07:00
my-accounts.js Profiles: Tidal logo on a light disc (dark logo) in My Accounts 2026-06-10 13:49:25 -07:00
origin-history.js Watchlist: show WHICH tracks a scan found/added + group Download Origins (#831) 2026-06-09 20:14:02 -07:00
pages-extra.js resolve merge conflict in style.css 2026-06-11 18:21:04 +02:00
particles.js perf(webui): faster navigation, smoother scroll, no spurious settings save 2026-06-04 02:40:27 +02:00
placeholder-album.png
pwa-icon-192.png
pwa-icon-512.png
search.js Multi-artist tags: Search → Download Now finally knows its metadata source (Netti93) 2026-06-09 17:20:16 -07:00
search.png
service-switch.js Profiles: revert Service Status modal to admin-only 2026-06-10 11:43:22 -07:00
settings.js resolve merge conflict in style.css 2026-06-11 18:21:04 +02:00
settings.png
setup-wizard.css
setup-wizard.js
shared-helpers.js Search: auto-select Spotify when "Spotify (no auth)" is the active source 2026-06-11 09:39:40 -07:00
shell-bridge.js perf(webui): faster navigation, smoother scroll, no spurious settings save 2026-06-04 02:40:27 +02:00
stats-automations.js Downloads: fix collapsed-batch overflow (#814) + Retry Failed result feedback (#815) 2026-06-07 23:53:18 -07:00
style.css resolve merge conflict in style.css 2026-06-11 18:21:04 +02:00
sw.js SW: stop cover-art burst from hard-failing on first load 2026-06-11 12:03:41 +02:00
sync-lastfm.js Add Last.fm Radio tab to Sync page (Phase 1c.2) 2026-05-26 15:24:23 -07:00
sync-listenbrainz.js Add Last.fm Radio tab to Sync page (Phase 1c.2) 2026-05-26 15:24:23 -07:00
sync-services.js Downloads: fix collapsed-batch overflow (#814) + Retry Failed result feedback (#815) 2026-06-07 23:53:18 -07:00
sync-soulsync-discovery.js SoulSync Discovery tab: open mirror detail modal after refresh 2026-05-26 20:02:50 -07:00
sync-spotify.js Fix standalone mirrored playlist sync and post-sync downloads. 2026-06-04 00:24:00 +02:00
sync.png
track-detail.js Track-detail modal: click any download row for a rich, status-aware view 2026-05-31 20:24:37 -07:00
trans.png
trans2.png
watchlist-history.js Watchlist: bespoke live scan deck + persistent per-run Scan History (#831 round 2) 2026-06-09 20:35:16 -07:00
whisoul.png
wishlist-tools.js resolve merge conflict in style.css 2026-06-11 18:21:04 +02:00
worker-orbs.js Dashboard animations: GPU pass — same visuals, compositor-only where possible 2026-06-06 16:05:05 -07:00