soulsync/core/imports
BoulderBadgeDad 8abf470018 imports: never delete a file we couldn't quarantine — leave it for retry
Discord (Shdjfgatdif): "if a track isn't imported it should remain there, not be deleted, so we
can retry." He was seeing failed downloads disappear and having to re-download.

Normally a rejected file is QUARANTINED (moved to ss_quarantine, preserved + retryable), not
deleted. But all four quarantine blocks (integrity / silence / quality / acoustid) had the same
fallback: if move_to_quarantine itself raised, os.remove(file_path). On a NAS that move can fail
(cross-device / permissions), so the except fired and the user's download was DELETED — the worst
outcome, and exactly the re-download pain he reported.

fix: on quarantine failure, log and LEAVE the file in place — never delete. The task is still
marked failed and the batch still notified (that code runs after the try/except and never touched
the deleted file), so the only behaviour change is "preserved instead of destroyed". Reviewed
every os.remove in the pipeline: the remaining ones are success-path cleanups (replacing an
existing destination, or removing a redundant download when the track is already in the library at
equal/better quality) — left untouched.

regression test drives the REAL pipeline through integrity-rejection with quarantine forced to
raise, and asserts the source file is preserved while the task is still failed + notified.
1311 imports/downloads/quality tests green, ruff clean.
2026-06-28 15:10:43 -07:00
..
__init__.py Rehome import helpers into core/imports 2026-04-27 19:54:44 +03:00
album.py Show MusicBrainz release variants in import 2026-05-24 09:33:19 -07:00
album_grouping.py lint: log the skipped album source-id lookup instead of a bare try/except/pass (ruff S110) 2026-06-18 12:09:22 -07:00
album_matching.py #890: strip leading track-number prefix from filename-derived titles 2026-06-18 18:35:04 -07:00
album_naming.py Rehome import helpers into core/imports 2026-04-27 19:54:44 +03:00
album_position.py Auto-download: resolve an album track's real position from its album (not 1/1) 2026-06-22 13:32:24 -07:00
context.py Auto-download: resolve an album track's real position from its album (not 1/1) 2026-06-22 13:32:24 -07:00
file_integrity.py integrity: don't quarantine longer masters/versions as 'truncated' (#937) 2026-06-27 15:25:13 -07:00
file_ops.py lossy copy: support all lossless formats, not just FLAC (#941) 2026-06-28 12:13:05 -07:00
filename.py Fix album-bundle downloads landing every track as track 1 2026-05-26 21:04:27 -07:00
folder_artist.py Use app confirm modal for verification review actions 2026-06-11 01:53:05 +02:00
guards.py feat(import): master toggle for quality-filtering on import + collapsible tile 2026-06-15 15:29:29 +02:00
paths.py #890: strip leading track-number prefix from filename-derived titles 2026-06-18 18:35:04 -07:00
pipeline.py imports: never delete a file we couldn't quarantine — leave it for retry 2026-06-28 15:10:43 -07:00
quarantine.py fix(quarantine): use name-based group key across batches/sources 2026-06-24 12:48:04 +02:00
rematch_apply.py #889 Phase 4: the Re-identify modal + apply backend 2026-06-18 15:37:56 -07:00
rematch_hints.py #889: FIX data loss — re-identify to the same release no longer deletes the file 2026-06-18 17:13:46 -07:00
rematch_search.py #889 Phase 3: re-identify search — multi-source track→release lookup + API 2026-06-18 15:31:33 -07:00
resolution.py Surface silent exceptions across remaining modules — ~70 sites 2026-05-07 10:28:58 -07:00
routes.py import page: share ONE staging scan across files/groups/hints (#935) 2026-06-28 09:49:03 -07:00
side_effects.py merge: pull upstream/main (2.7.4) into feature/best-quality-search-mode 2026-06-19 16:54:51 +02:00
silence.py quality: recognize DSD (.dsf/.dff) as lossless + stop the false "truncated" flag (#939) 2026-06-28 11:45:16 -07:00
single_to_album.py Library: single->parent-album resolution core (pure selector + injected-I/O resolver) 2026-06-18 09:24:06 -07:00
staging.py #922: import search labelled Spotify Free users' primary source as 'Deezer' 2026-06-24 08:43:52 -07:00
tag_policy.py Import: never wipe a clean/matched import's tags when enhancement fails (#804) 2026-06-07 22:44:43 -07:00
track_number.py Multi-disc: file the track in the disc folder that matches its tag (Sokhi) 2026-06-22 10:56:53 -07:00
version_mismatch_fallback.py feat(quality): rank-based candidate ordering toggle for priority mode 2026-06-25 22:00:57 +02:00