soulsync/tests
BoulderBadgeDad 4b8ddad9ff fix: stop the Tidal token-refresh loop (regression from #949)
#949 moved the "token still valid -> return True" short-circuit in TidalClient.is_authenticated()
into the boot-phase branch ONLY, so after boot every call fell through to the silent refresh
regardless of whether the token was actually expired. With multiple workers polling Tidal every
few seconds, that produced a constant "access token expired -> refresh -> success" loop (wolf39us
logs) — needless token churn, not an actual auth problem.

Restored the valid-token short-circuit on the post-boot path. The download client is unaffected
(it defers the tidalapi session differently, no manual expiry loop).

3 regression tests: valid token post-boot does NOT refresh, expired token still does, valid token
during boot returns True without probing.
2026-06-29 11:18:00 -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
database #901: one-time backfill — stable ids for EXISTING file-import mirrored tracks 2026-06-22 09:06:34 -07:00
discovery SoulSync Discovery sync tab: list all kinds + Listening Mix generator 2026-06-25 11:38:41 -07:00
downloads downloads: make the "file not found" failure actionable instead of opaque 2026-06-28 15:32:47 -07:00
enrichment #868: disambiguate same-name artists by owned-catalog overlap during enrichment 2026-06-13 14:57:17 -07:00
exports playlist export: opt-in confident-search backfill for the unmatched tail (#945, increment 7) 2026-06-28 23:02:08 -07:00
imports import: async staging scan so a large library doesn't time out the page (#947, phase 1 backend) 2026-06-29 09:24:41 -07:00
library jellyfin scan: page the bulk fetch so the no-progress watchdog can't false-stall 2026-06-28 13:41:38 -07:00
matching Cover art: a sequel digit glued to a CJK title ('…サウンドトラック2') now blocks the wrong-album match 2026-06-18 08:24:54 -07:00
media_server
metadata Merge pull request #949 from HellRa1SeR/fix/docker-spotify-boot-hang 2026-06-29 10:55:39 -07:00
playback
playlists #901: give file-import playlist tracks a stable id so manual matches stick 2026-06-22 08:53:24 -07:00
quality test: drift guard — frontend lossless lists must match backend LOSSLESS_FORMATS (#941) 2026-06-28 12:18:57 -07:00
radio
repair_jobs preview-clip job: enable select-all/fix-all + give the re-wishlist proper album art 2026-06-27 17:10:07 -07:00
search
static
stats
streaming
sync Sync: re-resolve a manual match against live Plex when its stored key went stale 2026-06-22 08:47:24 -07:00
text
tools feat(quality): quality-aware source fall-through in search_with_fallback 2026-06-14 12:33:34 +02:00
watchlist watchlist history: record automatic scans too (#933) 2026-06-27 00:42:58 -07:00
webui
wishlist wishlist: render library-sourced art (album + artist) — fix blank wishlist images 2026-06-27 17:35:28 -07:00
conftest.py Remove old auto-acting Quality Scanner tool (replaced by Quality Upgrade Finder job) 2026-06-13 12:14:45 -07:00
test_acoustid_error_reporting.py
test_acoustid_history_heal.py downloads: stop AcoustID scan duplicating history rows / leaving verified tracks 'unverified' (#934) 2026-06-27 09:52:39 -07:00
test_acoustid_normalize_angle_annotations.py
test_acoustid_scanner.py downloads: stop AcoustID scan duplicating history rows / leaving verified tracks 'unverified' (#934) 2026-06-27 09:52:39 -07:00
test_acoustid_skip_logic.py
test_acoustid_version_mismatch.py
test_admin_gating.py
test_album_bundle.py #857: custom in-container completed-downloads path for Torrent/Usenet sources (settings + UI; resolver already consumed the keys) 2026-06-13 07:15:02 -07:00
test_album_bundle_dispatch.py
test_album_completeness_fragmented_rows.py album completeness: fix excluded-sibling missing list + O(N) grouping (follow-up to #936) 2026-06-27 18:18:50 -07:00
test_album_completeness_job.py test(album-completeness): stop polluting sys.modules (fix flaky suite failure) 2026-06-26 19:56:11 -07:00
test_album_mbid_consistency.py
test_amazon_outage.py
test_archive_pipeline.py
test_aria2_adapter.py Add Aria2 to the torrent client list (Shdjfgatdif's request) 2026-06-11 22:29:40 -07:00
test_art_apply.py
test_art_preservation.py
test_artist_album_list_cache_nonspotify.py #853 follow-up: don't cache a partial Deezer discography on mid-pagination error 2026-06-11 15:35:36 -07:00
test_artist_albums_cache_poisoning.py
test_artist_catalog_disambiguation.py #868: disambiguate same-name artists by owned-catalog overlap during enrichment 2026-06-13 14:57:17 -07:00
test_artist_db_record_endpoint.py Artist detail: "DB Record" inspector — everything the DB knows about an artist 2026-06-11 16:57:48 -07:00
test_artist_export.py Export: combine watchlist + library into one button with a scope selector 2026-06-11 23:10:54 -07:00
test_artist_full_detail_source_id.py
test_artist_sync_stale_guard.py Artist Sync: unify with deep scan — server-diff stale removal, scoped to one artist 2026-06-10 19:43:25 -07:00
test_artist_the_prefix_variations.py Dedup: match artists across a leading "The" so "The X" and "X" don't download twice 2026-06-21 19:21:59 -07:00
test_artist_top_tracks_clients.py
test_atomic_audio_save.py
test_audiodb_worker_stuck_track.py
test_auth_proxy.py Security: trust a forward-auth proxy user header (Tier 3) 2026-06-10 20:57:48 -07:00
test_auth_usage_throttle.py
test_auto_sync_js.py
test_base_title_search_fallback.py Find & Add: match a Spotify 'Title - Remix' query to the base-titled library track 2026-06-13 16:55:33 -07:00
test_caa_release_art.py Special-edition cover art: prefer the pinned release own cover over the release-group representative 2026-06-21 22:47:09 -07:00
test_canonical_alternates.py
test_canonical_columns_migration.py
test_canonical_db.py
test_canonical_manual_lock.py canonical: recognize musicbrainz as a readable album source (PR #929 follow-up) 2026-06-26 19:04:24 -07:00
test_canonical_orchestration.py
test_canonical_resolver.py
test_canonical_version.py
test_canonical_version_job.py
test_clear_completed_download_history.py downloads: restore Clear Completed for persisted history (clears the whole completed list) 2026-06-27 23:37:06 -07:00
test_config_save_retry.py
test_content_filter_regex.py
test_context_qualifier_match.py
test_cover_art_targets.py
test_create_finding_dedup_counter.py
test_credentials_endpoints.py Security: trust a forward-auth proxy user header (Tier 3) 2026-06-10 20:57:48 -07:00
test_dashboard_events.py
test_database_io_resilience.py
test_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
test_database_update_reconcile_hook.py
test_db_genres_json_normalization.py
test_db_integrity.py
test_db_isolation_guard.py
test_db_migration_ledger.py
test_db_watchlist_amazon_id_migration.py
test_dead_file_cleaner_guard.py
test_debug_info_services.py
test_dedupe_source_ids.py
test_deezer_playlist_export.py deezer: playlist-write via the ARL gw-light gateway (#945, increment 3) 2026-06-28 21:15:04 -07:00
test_deezer_track_positions.py Deezer playlists: tag the REAL album track number, not the playlist index 2026-06-21 15:47:13 -07:00
test_deezer_worker_artist_id_guard.py
test_discogs_collection_id_tagging.py Discogs (#848 follow-up): tag collection album IDs for consistency 2026-06-11 08:33:26 -07:00
test_discogs_collection_source.py
test_discogs_id_typing.py
test_discogs_track_count.py
test_discover_section_controller_js.py
test_download_orchestrator_soundcloud.py
test_download_origins.py
test_download_plugin_conformance.py
test_downloads_pagination.py
test_duplicate_detector_mount_paths.py
test_duplicate_detector_slskd_dedup.py
test_duplicate_keep.py
test_embed_known_source_ids.py
test_empty_folder_cleaner.py #912: Empty Folder Cleaner reads its opt-in from the right config key 2026-06-23 11:26:00 -07:00
test_enrichment_art_preservation.py
test_enrichment_artist_id_guard.py
test_enrichment_services.py
test_enrichment_tag_preservation.py Metadata: a mid-enrichment crash on an art-less file no longer leaves it UNTAGGED 2026-06-18 08:42:04 -07:00
test_existing_album_folder.py
test_expired_download_cleaner.py
test_featured_artist_completion.py
test_genius_backoff.py
test_hifi_default_push.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
test_hifi_instance_methods.py
test_hifi_preview_detection.py fix(hifi): decline 30s preview manifests, fall through to a real source 2026-06-14 16:42:25 +02:00
test_hifi_preview_guard.py fix(quality): .aiff probe class + refresh tests drifted by the 2.7.4 merge (#896) 2026-06-24 21:40:14 +02:00
test_history_match.py downloads: stop AcoustID scan duplicating history rows / leaving verified tracks 'unverified' (#934) 2026-06-27 09:52:39 -07:00
test_hls_parsing.py
test_image_cache.py
test_import_album_match_endpoint.py
test_import_primary_source_label.py #922: import search labelled Spotify Free users' primary source as 'Deezer' 2026-06-24 08:43:52 -07:00
test_import_singles_parallel.py
test_import_tag_preservation.py
test_integrity_failure_marks_task_failed.py fix(imports): quality/audio-guard quarantine no longer also marks task completed 2026-06-14 22:18:40 +02:00
test_issue_837_find_add_preserves_playlist.py
test_itunes_album_tracks_limit.py #918 follow-up: self-heal stale truncated iTunes album-tracks cache 2026-06-24 09:37:14 -07:00
test_jellyfin_album_thumb.py
test_launch_lock_gate.py
test_lb_series_detect.py
test_library_disk_usage.py
test_library_reorganize.py #862: Library Reorganize falls back to tag-mode when an album has no source ID (media-server libs now actually reorganize) 2026-06-12 20:05:50 -07:00
test_library_reorganize_orchestrator.py
test_library_retag_job.py
test_library_stream_fallback.py
test_library_tag_payload.py
test_library_track_identity.py
test_lidarr_download_client.py
test_liked_songs_playlist.py
test_listenbrainz_manager.py
test_listening_stats_batch_queries.py stats: normalize image URLs at cache-build time, not per /api/stats/cached read (#935) 2026-06-28 09:32:48 -07:00
test_login_endpoints.py Login recovery (DB + backend): security question to reset a forgotten password 2026-06-10 22:24:54 -07:00
test_login_gate.py Native login (increment 2/3): login/logout endpoints + require_login gate 2026-06-10 22:01:53 -07:00
test_login_provisioning.py Login mode: enforce "every profile has a password" at every write-point (no gaps) 2026-06-11 19:48:50 -07:00
test_lyrics_reembed_from_sidecar.py
test_m3u_track_resolution.py M3U export: resolve paths via one bulk read instead of a per-artist search loop (fixes 'Export M3U hangs forever' under active enrichment/scan DB writes) 2026-06-13 08:55:46 -07:00
test_manual_library_match.py
test_manual_pick_no_auto_retry.py
test_manual_search_endpoint.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
test_matching_engine_cjk.py
test_media_track_disc_number.py Multi-disc (#927): capture real disc number at media-server scan time 2026-06-25 15:40:17 -07:00
test_member_login_password.py Login mode: let the admin set a member's login password (Manage Profiles) 2026-06-11 19:24:31 -07:00
test_memory_tracker.py
test_metadata_cache_table_recreate.py
test_mirrored_custom_name.py 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
test_missing_cover_art.py
test_missing_lyrics_job.py
test_navidrome_cover_url.py
test_navidrome_reconcile.py #905 (root cause): Navidrome reconcile read current tracks via missing t.id -> playlists doubled 2026-06-23 15:19:47 -07:00
test_navidrome_self_heal.py Navidrome: self-heal the connection instead of latching disconnected (jimmydotcom) 2026-06-11 21:34:48 -07:00
test_navidrome_stream_url.py
test_orphan_file_detector.py Orphan detector: hard-bail on a mass-orphan flood instead of warn-only 2026-06-12 08:15:23 -07:00
test_orphan_history.py unverified-history reconcile + orphan-clean: hardening follow-up to #938 2026-06-27 22:35:16 -07:00
test_path_resolve_confusables.py
test_personalized_api.py
test_personalized_generators_curated.py
test_personalized_generators_singletons.py
test_personalized_generators_variants.py
test_personalized_manager.py
test_personalized_playlists_id_gate.py test: correct deezer popularity-threshold test to the 0-100 scale 2026-06-25 16:55:53 -07:00
test_pin_rate_limit.py Security: brute-force limiter on the launch-PIN unlock (Tier 2) 2026-06-10 20:47:46 -07:00
test_playlist_edit.py Align playlists: reorder a server playlist to the source order (Navidrome) 2026-06-24 12:58:01 -07:00
test_playlist_materialize.py Playlists: config (separate root + symlink/copy) + pure materializer seam 2026-06-12 13:30:48 -07:00
test_playlist_materialize_service.py Organize-by-playlist: optional custom file naming for the playlist folder 2026-06-21 21:57:20 -07:00
test_playlist_reconcile.py Server playlist editor: surface 'accurate but out of order' + read-only server-order view 2026-06-24 12:15:47 -07:00
test_playlist_sources_adapters.py Fix: auto-sync capped public Spotify playlists at 100 tracks (#838) 2026-06-10 18:31:43 -07:00
test_playlist_sync_status.py Fix playlist sync status labels 2026-06-25 13:43:24 +02:00
test_popularity_thresholds.py Popular Picks: fix empty result for deezer (popularity threshold scale mismatch) 2026-06-25 16:30:52 -07:00
test_profile_context.py
test_profile_password.py Native login (increment 1/3): per-profile password DB layer 2026-06-10 21:57:44 -07:00
test_profile_recovery.py Login recovery (DB + backend): security question to reset a forgotten password 2026-06-10 22:24:54 -07:00
test_profile_spotify_resolution.py
test_provenance_id_persistence.py
test_prowlarr_client.py
test_qobuz_credential_sync.py
test_qobuz_playlists.py
test_recommendation_sources.py
test_reduce_effects_css.py reduce-effects: kill expensive GPU properties, stop freezing functional motion 2026-06-28 16:22:10 -07:00
test_release_dates.py
test_reorganize_alternate_edition.py
test_reorganize_canonical_source.py test(reorganize): verify MusicBrainz integration 2026-06-26 03:10:07 +02:00
test_reorganize_db_methods.py
test_reorganize_deleted_quarantine.py
test_reorganize_feat_matching.py #914: Reorganize matches bare local titles to iTunes '(feat. X)' tracks 2026-06-23 14:27:31 -07:00
test_reorganize_orphan_format_handling.py
test_reorganize_queue.py
test_reorganize_rename_only.py library reorganize: add a rename-only executor (#875) — core + tests 2026-06-28 18:52:42 -07:00
test_reorganize_runner.py library reorganize: wire rename-only mode through the queue (#875) 2026-06-28 19:08:42 -07:00
test_reorganize_tag_source.py
test_reorganize_unknown_artist_hint.py
test_repair_scheduler_tz.py #885: repair-job scheduling is timezone-independent (Australia/Sydney loop) 2026-06-18 14:02:09 -07:00
test_repair_worker_album_fill.py
test_repair_worker_unresolvable_folder_error.py
test_replaygain_filler_job.py #437: add ReplayGain Filler library-maintenance job 2026-06-11 18:41:12 -07:00
test_replaygain_summary_parse.py
test_request_cleanup_timer.py
test_resolve_mirrored_playlist.py Playlists: resolve synthetic mirrored batch refs (youtube_mirrored_<pk>/auto_mirror_<pk>) to PK 2026-06-12 17:27:35 -07:00
test_resolve_secret.py #870: Deezer ARL 'resets itself' — test the SAVED token, not the redaction mask 2026-06-13 15:37:29 -07:00
test_retag_planner.py
test_reverse_proxy_mode.py Security: add gated security headers in reverse-proxy mode (Tier 2) 2026-06-10 20:48:51 -07:00
test_runtime_state.py fix(post-processing): prevent double-claim race that fails imported tracks 2026-06-25 21:03:33 +02:00
test_scan_wait_action.py
test_script_split_integrity.py
test_search_tracks_relevance.py
test_server_playlist_append_mode.py
test_service_credentials.py
test_service_playlist_export.py spotify export: clickable authorize link (popup-block safe) + endpoint pre-check tests 2026-06-29 08:35:25 -07:00
test_settings_redaction.py #879: a failed settings load must never overwrite the saved config 2026-06-15 20:09:53 -07:00
test_similar_artists_status_codes.py
test_similar_artists_worker.py
test_socketio_cors.py
test_soulseek_album_fallback.py
test_soulseek_album_poll_stall.py
test_soulseek_search_throttle.py
test_soundcloud_client.py Download clients: don't crash init when the download path can't be created 2026-06-24 21:00:32 -07:00
test_source_ids_registry.py
test_source_title.py
test_spa_deep_linking.py
test_spotify_client.py spotify export: on-demand write-auth (restores Sync to Spotify safely, #945) 2026-06-29 08:32:19 -07:00
test_spotify_free_metadata.py
test_spotify_free_status.py Spotify (no-auth): report connected + 'Spotify (no-auth)' test result instead of a Deezer fallback 2026-06-13 10:16:23 -07:00
test_spotify_public_api.py
test_spotify_token_cache.py
test_spotify_unavailable_reason.py
test_spotify_worker_status.py #887: Spotify enrichment shows 'Running (Spotify Free)' for no-auth users, not 'Not Authenticated' 2026-06-18 13:00:33 -07:00
test_staging_album_provenance.py
test_stale_guard.py Orphan detector: hard-bail on a mass-orphan flood instead of warn-only 2026-06-12 08:15:23 -07:00
test_stats_automations_esc_js.py
test_status_engine_fallback.py
test_subtitle_qualifier_match.py
test_sync_dedupe.py #905 (part 1): push the deduped track list to the media server, not the raw matched list 2026-06-23 14:39:29 -07:00
test_sync_discovery_scan_events.py
test_sync_wishlist_readd.py Sync wishlist re-add: skip wing-it stubs (match the sync), no clickable button 2026-06-24 16:51:43 -07:00
test_tag_writer_multi_artist.py
test_tag_writer_placeholder_guard.py
test_tidal_album_tracks.py
test_tidal_auth_instructions.py
test_tidal_auth_redirect_uri.py
test_tidal_collection_tracks.py #880: retry 429 mid-walk when paginating Tidal Favorite Tracks (don't truncate) 2026-06-15 19:56:53 -07:00
test_tidal_favorite_albums_artists.py
test_tidal_playlist_batch_chunking.py #867: Tidal playlist discovery shows all tracks (was capped to ~21) 2026-06-13 10:39:30 -07:00
test_tidal_qualifier_filter.py
test_tidal_rate_limit_backoff.py
test_tidal_search_shortening.py
test_tidal_token_refresh_loop.py fix: stop the Tidal token-refresh loop (regression from #949) 2026-06-29 11:18:00 -07:00
test_title_match_guard.py
test_tool_progress_events.py Remove old auto-acting Quality Scanner tool (replaced by Quality Upgrade Finder job) 2026-06-13 12:14:45 -07:00
test_torrent_cleanup_orphan.py Torrents: fix stall handling on "downloading metadata" + stop orphaning in qbit 2026-06-11 14:37:46 -07:00
test_torrent_client_adapters.py
test_torrent_stall.py Torrents: fix stall handling on "downloading metadata" + stop orphaning in qbit 2026-06-11 14:37:46 -07:00
test_torrent_usenet_plugins.py
test_track_artist_matching.py
test_track_number_repair.py
test_track_repair_canonical.py
test_track_search_single_query.py
test_tracks_year_migration.py #910: add the per-track 'year' column the Full Refresh insert needs 2026-06-23 11:03:24 -07:00
test_ui_appearance.py ui appearance: default worker orbs OFF on Firefox for first-time users 2026-06-28 16:50:22 -07:00
test_unknown_artist_fixer.py
test_unverified_history_reconcile.py unverified-history reconcile + orphan-clean: hardening follow-up to #938 2026-06-27 22:35:16 -07:00
test_usenet_client_adapters.py NZBGet: import from the final location, not the incomplete '….#NZBID' dir 2026-06-18 12:47:19 -07:00
test_verification_admin_gate.py #845 follow-up: admin-gate the mutating verification-review endpoints 2026-06-11 10:43:40 -07:00
test_verification_status_backfill.py #845 tests: cover the verification_status migration backfill 2026-06-11 11:17:09 -07:00
test_verification_tag_roundtrip.py
test_watchlist_album_match.py watchlist: don't fuse different editions as the same album (Sokhi: Expedition 33) 2026-06-26 20:38:10 -07:00
test_watchlist_auto_download.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
test_watchlist_bulk_add.py
test_watchlist_itunes_id_repair.py
test_watchlist_itunes_match.py
test_watchlist_scan_history.py watchlist history: record automatic scans too (#933) 2026-06-27 00:42:58 -07:00
test_watchlist_scanner_scan.py Discover: listening-driven recommendations + mix (#913), Fresh Tape fix 2026-06-25 10:15:20 -07:00
test_websocket_client_transport.py
test_websocket_infrastructure.py
test_wing_it_pool.py Wing It Pool: two-card landing (review + resolved), matching the Discovery Pool 2026-06-25 14:15:42 -07:00
test_wishlist_pagination.py
test_worker_artist_disambiguation.py #868: disambiguate same-name artists by owned-catalog overlap during enrichment 2026-06-13 14:57:17 -07:00
test_worker_artist_match_gate.py
test_worker_existing_id_marks_matched.py
test_worker_utils_album_track_count.py
test_ws_connect_gate.py #852 tests: cover the login-mode WS gate (the reported bypass was the login modal) 2026-06-11 17:38:24 -07:00
test_yield_policy.py
test_youtube_cookies.py youtube: use pasted cookies.txt instead of passing 'custom' as a browser to yt-dlp 2026-06-27 23:47:38 -07:00
test_youtube_ffmpeg_no_eager_download.py
test_youtube_js_runtime.py
test_youtube_search_dash_query.py
test_youtube_sync_idempotent_endpoints.py #702: make mirrored-playlist cancel/reset/delete idempotent (un-wedge LB weekly sync) 2026-06-11 12:55:55 -07:00
test_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