A track marked missing whose replacement is already on disk under another row is now folded into that replacement. Its likes, plays, playlist entries and tags move across, and the stale row goes. On the operator's library this applies to about 355 of 451 missing tracks, nearly all Lidarr mp3 → flac upgrades. Move adoption could not link them: a re-encode never shares the audio hash, and the new files had no recording MBID at import.
2df28345 refactor: the per-copy fold is now a helper (foldTrackInto) that the duplicate merge calls. No behaviour change.
865a3176 feat: ListMissingTrackPairs and PairMissingTracks.
Matching: the same recording MBID within the album group, or the same album plus the same title ignoring case. Each side must have exactly one candidate, and conflicting MBIDs refuse a pair.
When it runs: after each full scan, each watcher batch, and each AcoustID pass that matched a track.
The first scan after deploy repairs the existing rows. No migration.
A track marked missing whose replacement is already on disk under another row is now folded into that replacement. Its likes, plays, playlist entries and tags move across, and the stale row goes. On the operator's library this applies to about 355 of 451 missing tracks, nearly all Lidarr mp3 → flac upgrades. Move adoption could not link them: a re-encode never shares the audio hash, and the new files had no recording MBID at import.
- `2df28345` refactor: the per-copy fold is now a helper (`foldTrackInto`) that the duplicate merge calls. No behaviour change.
- `865a3176` feat: `ListMissingTrackPairs` and `PairMissingTracks`.
- **Matching:** the same recording MBID within the album group, or the same album plus the same title ignoring case. Each side must have exactly one candidate, and conflicting MBIDs refuse a pair.
- **When it runs:** after each full scan, each watcher batch, and each AcoustID pass that matched a track.
The first scan after deploy repairs the existing rows. No migration.
CI is green on dev at 865a3176 (run 8607).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
MergeDuplicateGroup's loop body — repoint and copy every FK from a removed
copy onto the survivor, inherit its MBID, delete its row, tidy an emptied
album — moves into foldTrackInto, so the missing-pair pass can fold a stale
missing row into its replacement with the same mechanics. The group lock,
file removal and group bookkeeping stay in the merge. No behaviour change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A track marked missing whose replacement is already on disk under another
row — on the operator's library 355 of 451 missing tracks, nearly all Lidarr
mp3 -> flac upgrades — is folded into the replacement: likes, plays, playlist
entries and tags move across and the missing row goes. Move adoption could
not catch these: the replacements were re-encodes (no shared audio hash) with
no recording MBID at import.
Pairs (ListMissingTrackPairs): the same recording MBID within the album
group, or the same album row and title ignoring case. Each side must have
exactly one candidate; conflicting MBIDs refuse a pair. No duration or track
position gate: on the 142 pairs known to be one recording, 18% differed by
over 2s and the poorly tagged set is where numbering is broken (spike #5274).
Each pair folds in its own transaction after locking both rows and checking
the pair still holds. Runs automatically (operator, 2026-10-07) after a full
scan, after a watcher batch that added or updated tracks, and after an
AcoustID pass that matched any track. The first scan after deploy repairs the
existing rows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
A track marked missing whose replacement is already on disk under another row is now folded into that replacement. Its likes, plays, playlist entries and tags move across, and the stale row goes. On the operator's library this applies to about 355 of 451 missing tracks, nearly all Lidarr mp3 → flac upgrades. Move adoption could not link them: a re-encode never shares the audio hash, and the new files had no recording MBID at import.
2df28345refactor: the per-copy fold is now a helper (foldTrackInto) that the duplicate merge calls. No behaviour change.865a3176feat:ListMissingTrackPairsandPairMissingTracks.The first scan after deploy repairs the existing rows. No migration.
CI is green on dev at
865a3176(run 8607).🤖 Generated with Claude Code