soulsync/tests/downloads
dev 05b36704c3 fix(post-processing): prevent double-claim race that fails imported tracks
Two subsystems post-process the same completed transfer: the browser-poll
status endpoint (web_server) and the background download monitor. Both watch
the same slskd/streaming transfers and each launches the verification
pipeline. When one path quarantines + requeues the next-best candidate
(clearing username/filename, status -> 'searching'), the monitor's
already-submitted run_post_processing_worker then runs, finds no source info,
and falsely marks the task 'failed' ("missing file or source information") —
clobbering the in-flight retry while a parallel attempt imports the song.

Fix: a single atomic claim (downloading/queued -> post_processing under
tasks_lock) so exactly one path processes each download.

- runtime_state: new claim_for_post_processing() helper
- post_processing: race guard — worker bails (no fail/notify) if the task is
  no longer 'post_processing' when it runs
- web_server: both poll paths (Soulseek + streaming) claim before launching;
  claim is released on thread-launch failure

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 21:03:33 +02:00
..
__init__.py PR4a: lift sync history recording to core/downloads/history.py 2026-04-27 20:37:16 -07:00
test_album_bundle_staging_sweep.py Album-bundle staging: clean Soulseek copies + sweep orphans at startup 2026-05-27 22:18:42 -07:00
test_album_serialize_drain.py Wishlist: serialize album-bundle downloads so they stop flooding the search pool (Sokhi #740) 2026-06-09 10:06:53 -07:00
test_background_download_worker.py Add 5 test additions JohnBaumb suggested 2026-05-05 13:04:18 -07:00
test_candidate_ordering.py feat(downloads): best-quality search mode + clearer fallback UI 2026-06-14 18:46:01 +02:00
test_deezer_pinning.py Surface engine-not-wired errors + exclude soulseek from monitor aggregation 2026-05-05 12:20:51 -07:00
test_download_engine.py Add 5 test additions JohnBaumb suggested 2026-05-05 13:04:18 -07:00
test_download_orchestrator.py Fix Usenet settings reload without restart 2026-05-22 08:28:56 -07:00
test_downloads_cancel.py fix(downloads): keep terminal tasks visible during active batch + concurrent pool 2026-06-14 20:08:56 +02:00
test_downloads_candidates.py #797: stop AcoustID quarantining correct non-English-artist downloads 2026-06-05 16:02:01 -07:00
test_downloads_cleanup.py PR4c: lift _automatic_wishlist_cleanup_after_db_update to core/downloads/cleanup.py 2026-04-27 22:23:41 -07:00
test_downloads_history.py PR4a: lift sync history recording to core/downloads/history.py 2026-04-27 20:37:16 -07:00
test_downloads_lifecycle.py fix(downloads): stop phantom-completing stuck post_processing tasks 2026-06-14 23:25:33 +02:00
test_downloads_master.py Playlists: wire materialize triggers + retire per-track routing flag 2026-06-12 13:37:59 -07:00
test_downloads_post_processing.py fix(post-processing): prevent double-claim race that fails imported tracks 2026-06-25 21:03:33 +02:00
test_downloads_staging.py Fix album-bundle staging match + wishlist provenance (#700, #698) 2026-05-26 07:12:49 -07:00
test_downloads_status.py fix(downloads): always surface all unverified history on Downloads page 2026-06-15 19:46:26 +02:00
test_downloads_task_worker.py feat(downloads): best-quality search mode + clearer fallback UI 2026-06-14 18:46:01 +02:00
test_downloads_validation.py Add torrent and usenet release staging support 2026-05-21 14:22:21 -07:00
test_file_finder.py Fix: a '/' in a song title was treated as a path separator (#835) 2026-06-10 16:29:09 -07:00
test_hifi_pinning.py Support legacy HiFi track manifests 2026-05-21 18:11:14 -07:00
test_lidarr_pinning.py A8: Pin LidarrDownloadClient download lifecycle behavior 2026-05-04 12:10:49 -07:00
test_orchestrator_search_mode.py feat(downloads): best-quality search mode + clearer fallback UI 2026-06-14 18:46:01 +02:00
test_playlist_folder_exists.py Fix organize-by-playlist downloads: library entries, wishlist, and stale Spotify cache 2026-06-03 10:26:32 +02:00
test_qobuz_pinning.py Surface engine-not-wired errors + exclude soulseek from monitor aggregation 2026-05-05 12:20:51 -07:00
test_rate_limit_policy.py E1: Add RateLimitPolicy declaration mechanism 2026-05-04 14:38:20 -07:00
test_soulseek_aac_quality.py feat(quality): make every audio format controllable via ranked targets 2026-06-24 23:01:20 +02:00
test_soulseek_pinning.py Add Soulseek album bundle downloads 2026-05-23 15:08:21 -07:00
test_soundcloud_pinning.py Surface engine-not-wired errors + exclude soulseek from monitor aggregation 2026-05-05 12:20:51 -07:00
test_tidal_pinning.py Handle non-JSON Tidal auth responses 2026-05-20 14:04:45 -07:00
test_track_detail.py Downloads: add per-track detail endpoint for the track-detail modal 2026-05-31 20:18:35 -07:00
test_track_link.py Manual download search: paste a Tidal/Qobuz track link to grab the exact version (#813) 2026-06-08 15:03:54 -07:00
test_track_metadata_backfill.py #915: post-processing hydrates lean album context from the PRIMARY source (parity with Reorganize) 2026-06-23 18:46:35 -07:00
test_wishlist_aggregator.py Wishlist modal: surface most-advanced live phase, not least-complete 2026-05-26 22:35:53 -07:00
test_youtube_pinning.py Surface engine-not-wired errors + exclude soulseek from monitor aggregation 2026-05-05 12:20:51 -07:00