soulsync/core
BoulderBadgeDad 3af3a1cd24 video downloads Phase C: auto-retry + alternate-query requery
When a grabbed release fails (transfer error / peer-cancel / never lands), the engine
now retries instead of giving up — the music-style depth:
- Grab stores the OTHER accepted results as a retry pool + the search context (schema
  v16: candidates / search_ctx / tried_queries / tried_files / attempts).
- core/video/retry.py (pure, tested): plan_retry() → try the next-best candidate; when
  the pool is dry, next_query() generates an ALTERNATE query (movie: drop the year; TV:
  numbering variants) to re-search; budget MAX_ATTEMPTS=6. merge_candidates dedupes
  against already-tried releases.
- Monitor: on failure, _fail_or_retry hops to the next candidate inline; if none, flips
  the row to a new 'searching' state and a background requery thread re-searches the
  alternate query, evaluates against the profile, and starts the best fresh hit — or
  marks failed once truly exhausted. 'searching' rows are owned by their thread.
- Page: 'Searching' status (Trying another release…) + a 'Nx' attempt badge.
16 tests (retry engine + candidate-retry transition); ruff clean on touched files.
2026-06-19 17:12:44 -07:00
..
artists
automation Remove old auto-acting Quality Scanner tool (replaced by Quality Upgrade Finder job) 2026-06-13 12:14:45 -07:00
blocklist
credentials
diagnostics
discovery Remove old auto-acting Quality Scanner tool (replaced by Quality Upgrade Finder job) 2026-06-13 12:14:45 -07:00
download_engine
download_plugins Torrents: fix stall handling on "downloading metadata" + stop orphaning in qbit 2026-06-11 14:37:46 -07:00
downloads Playlists: remove dead _playlist_folder_mode routing branches (retired flag, now unreachable) 2026-06-12 18:52:57 -07:00
enrichment #868: disambiguate same-name artists by owned-catalog overlap during enrichment 2026-06-13 14:57:17 -07:00
exports Library export: export the whole library roster too (corruption's request) 2026-06-11 22:59:21 -07:00
imports Playlists: remove dead _playlist_folder_mode routing branches (retired flag, now unreachable) 2026-06-12 18:52:57 -07:00
library Orphan detector: hard-bail on a mass-orphan flood instead of warn-only 2026-06-12 08:15:23 -07:00
maintenance
matching #845 tests: lift history-path resolver to core/ + seam-test the delete-safety 2026-06-11 11:07:25 -07:00
media_server
metadata Spotify (no-auth): report connected + 'Spotify (no-auth)' test result instead of a Deezer fallback 2026-06-13 10:16:23 -07:00
personalized
playback
playlists Mirrored playlists: custom name alias (overrides display + sync name, survives upstream refresh) — card rename button like the source-ref editor 2026-06-13 00:23:56 -07:00
radio
repair_jobs Quality Upgrade: best-in-class matching (direct track-ID tier, dedup-skip, duration guard) 2026-06-13 13:34:48 -07:00
search
security Login mode: enforce "every profile has a password" at every write-point (no gaps) 2026-06-11 19:48:50 -07:00
stats
streaming
sync Sync: append mode actually dedupes — stop re-adding the whole playlist (#823) 2026-06-09 16:31:05 -07:00
text
torrent_clients Add Aria2 to the torrent client list (Shdjfgatdif's request) 2026-06-11 22:29:40 -07:00
usenet_clients
video video downloads Phase C: auto-retry + alternate-query requery 2026-06-19 17:12:44 -07:00
watchlist
webui
wishlist
workers
acoustid_client.py
acoustid_verification.py
album_consistency.py
amazon_client.py
amazon_download_client.py
amazon_outage.py Fix #759: Amazon enrichment floods when its public proxy is down 2026-06-01 13:10:51 -07:00
amazon_worker.py Enrichment manager: 'process this group first' + refined hero header 2026-06-02 19:45:04 -07:00
api_call_tracker.py Wire Amazon Music as a first-class download source 2026-05-16 09:40:50 -07:00
archive_pipeline.py
artist_source_detail.py
artist_source_lookup.py Fix artist-detail showing wrong artist when a source id is duplicated 2026-06-05 07:24:51 -07:00
audiodb_client.py
audiodb_worker.py
auto_import_worker.py Fix import artist override and verification review 2026-06-11 01:28:31 +02:00
automation_engine.py Automations: run each as its OWNER profile in the background (part 1 of per-profile sync) 2026-06-10 15:37:56 -07:00
connection_detect.py
connection_test.py Spotify (no-auth): report connected + 'Spotify (no-auth)' test result instead of a Deezer fallback 2026-06-13 10:16:23 -07:00
database_update_health.py #859: DB-update stall watchdog + UI self-heal (no more wedged 'Starting...' / frozen bar) 2026-06-12 19:38:30 -07:00
database_update_worker.py
db_integrity.py DB backups: verify integrity + never evict the last good backup 2026-05-30 21:13:04 -07:00
debug_info.py
deezer_client.py #853 follow-up: don't cache a partial Deezer discography on mid-pagination error 2026-06-11 15:35:36 -07:00
deezer_download_client.py
deezer_worker.py #868: disambiguate same-name artists by owned-catalog overlap during enrichment 2026-06-13 14:57:17 -07:00
discogs_client.py Cache artist album lists across metadata sources 2026-06-11 22:33:04 +02:00
discogs_worker.py
download_orchestrator.py Fix Usenet settings reload without restart 2026-05-22 08:28:56 -07:00
genius_client.py Genius 429 backoff: fail-fast gate instead of napping the import pipeline 2026-06-06 20:51:33 -07:00
genius_worker.py
genre_filter.py
hifi_client.py HiFi: auto-push genuinely-new default instances to existing installs once (so a newly-added working instance reaches everyone, not just Restore-Defaults clickers; removed defaults stay removed) 2026-06-13 09:31:15 -07:00
hydrabase_client.py feat: add explicit badges to discography modal and artist-detail cards 2026-05-12 23:35:08 -04:00
hydrabase_worker.py
image_cache.py
itunes_client.py Cache artist album lists across metadata sources 2026-06-11 22:33:04 +02:00
itunes_worker.py #868: disambiguate same-name artists by owned-catalog overlap during enrichment 2026-06-13 14:57:17 -07:00
jellyfin_client.py
lastfm_client.py
lastfm_worker.py
library_reorganize.py #767-2: reorganize finds the right album edition instead of mislabeling singles as deluxe 2026-06-06 10:53:13 -07:00
lidarr_download_client.py Surface silent exceptions across remaining modules — ~70 sites 2026-05-07 10:28:58 -07:00
listenbrainz_client.py
listenbrainz_manager.py
listening_stats_worker.py
lyrics_client.py
matching_engine.py fix: treat colon as separator in normalize_string so T:T matches T_T 2026-06-12 12:54:03 +02:00
metadata_service.py
musicbrainz_client.py
musicbrainz_search.py Fix: MusicBrainz artist discography capped at 25 releases 2026-05-28 12:00:05 -07:00
musicbrainz_service.py #868: disambiguate same-name artists by owned-catalog overlap during enrichment 2026-06-13 14:57:17 -07:00
musicbrainz_worker.py #868: disambiguate same-name artists by owned-catalog overlap during enrichment 2026-06-13 14:57:17 -07:00
navidrome_client.py Navidrome: self-heal the connection instead of latching disconnected (jimmydotcom) 2026-06-11 21:34:48 -07:00
personalized_playlists.py Blocklist Phase 1 (backend): artist/album/track bans enforced at the wishlist chokepoint 2026-06-07 15:18:25 -07:00
plex_client.py Fix #792: 'reconcile' playlist sync mode (edit in place, keep image/description) 2026-06-04 15:15:49 -07:00
profile_context.py Automations: run each as its OWNER profile in the background (part 1 of per-profile sync) 2026-06-10 15:37:56 -07:00
prowlarr_client.py feat(settings): add Prowlarr integration as indexer aggregator 2026-05-20 14:41:54 -07:00
qobuz_client.py
qobuz_worker.py
reorganize_queue.py
reorganize_runner.py Reorganize: optional embedded-tag mode (closes #592) 2026-05-15 07:56:18 -07:00
repair_worker.py Quality Upgrade Finder: new findings-based repair job (replaces auto-acting Quality Scanner) 2026-06-13 11:51:43 -07:00
replaygain.py
runtime_state.py
seasonal_discovery.py Fix source artist detail navigation from discover modals 2026-05-18 13:50:10 -07:00
similar_artists_worker.py
socketio_cors.py
soulid_worker.py
soulseek_client.py
soulsync_client.py
soundcloud_client.py #865: resolve pasted SoundCloud links (incl. unlisted/private share URLs) via direct yt-dlp resolve; manual-search forces the SoundCloud source 2026-06-13 00:41:47 -07:00
source_ids.py
spotify_client.py Cache artist album lists across metadata sources 2026-06-11 22:33:04 +02:00
spotify_free_metadata.py
spotify_public_api.py
spotify_public_scraper.py Diagnostics: route public-fetch logs to soulsync namespace + log HTTP status 2026-06-02 22:09:51 -07:00
spotify_token_cache.py Spotify tokens move into the database — daily Docker deauth fixed (wolf39us) 2026-06-07 12:01:33 -07:00
spotify_worker.py #868: disambiguate same-name artists by owned-catalog overlap during enrichment 2026-06-13 14:57:17 -07:00
tag_writer.py
tidal_client.py #867: Tidal playlist discovery shows all tracks (was capped to ~21) 2026-06-13 10:39:30 -07:00
tidal_download_client.py fix(tidal): honour version field in matching and back off on rate limits 2026-06-08 13:50:19 -04:00
tidal_worker.py Tighten artist matching: 0.85 gate + shared uniqueness guard 2026-06-05 10:01:17 -07:00
watchlist_scanner.py Watchlist: per-artist 'auto-download' toggle (follow-only) — off = discover/surface releases but skip the wishlist add; default on 2026-06-13 08:07:20 -07:00
web_scan_manager.py MS Cin-5: Drop per-server globals — engine owns the clients 2026-05-05 18:05:45 -07:00
wishlist_service.py Extract wishlist logic into dedicated package 2026-04-28 21:17:24 +03:00
worker_utils.py #868: disambiguate same-name artists by owned-catalog overlap during enrichment 2026-06-13 14:57:17 -07:00
youtube_client.py
youtube_track_meta.py #863: derive YouTube track artist from music fields / -Topic channel / 'Artist - Title' instead of the playlist owner 2026-06-12 20:14:55 -07:00