soulsync/tests
BoulderBadgeDad b404420c76 video automations: auto-download movie + episode wishlist (soulseek)
the soulseek counterpart of the youtube drain — finally makes the people/airing
scans pay off. two automations (Auto-Download Movie / Episode Wishlist, hourly):
for each wished+released item, do a bounded blocking slskd search, pick the top
ACCEPTED release per the quality profile, and enqueue it exactly like a manual
grab (same add_video_download shape → the monitor finishes + organises it).

same standard as youtube: processes the WHOLE eligible wishlist (no total cap)
but searches a few at a time (max_concurrent, default 3, via a thread pool). a
busy guard skips the next hourly tick while a drain is still working. movies gate
on status='wanted' (skips monitored); episodes are all-wished. items already
downloading are skipped. quiet skip if the library folder isn't set.

reuses the real infra (build_query/slskd_search/_evaluate_hits/start_download/
download_monitor) — pure pick/select/record seam-tested; db queries added. 377
automation+video tests green.
2026-06-25 22:08:02 -07:00
..
artists Direct ID lookup in Enhance Quality, like Download Discography 2026-05-06 12:05:41 -07:00
automation video automations: auto-download movie + episode wishlist (soulseek) 2026-06-25 22:08:02 -07:00
blocklist Blocklist Phase 2b: gate manual downloads with a "download anyway?" confirm 2026-06-07 16:15:23 -07:00
database Preserve Navidrome album cover art 2026-05-25 19:51:38 -07:00
discovery Remove old auto-acting Quality Scanner tool (replaced by Quality Upgrade Finder job) 2026-06-13 12:14:45 -07:00
downloads Playlists: wire materialize triggers + retire per-track routing flag 2026-06-12 13:37:59 -07:00
enrichment #868: disambiguate same-name artists by owned-catalog overlap during enrichment 2026-06-13 14:57:17 -07:00
imports Fix import artist override and verification review 2026-06-11 01:28:31 +02:00
library Expired Download Cleaner: retention-based cleanup of watchlist/playlist downloads (Boulder) 2026-06-07 22:06:56 -07:00
matching #845 tests: lift history-path resolver to core/ + seam-test the delete-safety 2026-06-11 11:07:25 -07:00
media_server Navidrome: pin music-folder selection by id, not name (survives renames) 2026-06-04 11:47:31 -07:00
metadata Multi-artist tags: Search → Download Now finally knows its metadata source (Netti93) 2026-06-09 17:20:16 -07:00
playback Player: log SoulSync web-player plays (recently-played + smart-radio recency) 2026-05-30 15:11:46 -07:00
playlists Expose mirrored playlist source-ref health 2026-05-24 19:32:39 -07:00
radio Player revamp Phase 2: smart radio ranking (play-count + popularity) 2026-05-30 08:47:18 -07:00
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 Multi-artist tags: Search → Download Now finally knows its metadata source (Netti93) 2026-06-09 17:20:16 -07:00
static Fix: mirrored playlist action buttons dead when name has an apostrophe 2026-06-01 09:02:25 -07:00
stats Lift /api/stats/* and /api/listening-stats/* into core/stats/ 2026-04-27 14:27:03 -07:00
streaming Stream button: the player never learns its stream is ready (2.6.5 regression) 2026-06-06 12:43:20 -07:00
sync Fix #792: 'reconcile' playlist sync mode (edit in place, keep image/description) 2026-06-04 15:15:49 -07:00
text Address Cin review: extract helpers, indexed pool fetch, tidy nits 2026-05-24 23:33:55 -07:00
tools test(amazon): update search_albums test for derived-from-tracks behavior 2026-05-19 18:24:27 -07:00
video tests: add missing tests/video package marker 2026-06-23 10:54:27 -07:00
watchlist Complete MusicBrainz watchlist source parity 2026-05-18 19:19:25 -07:00
webui Fix missing album placeholder asset path 2026-05-22 08:34:42 -07:00
wishlist Wishlist: manual "add to wishlist" now skips already-owned tracks (#825) 2026-06-09 10:55:45 -07:00
conftest.py tests: isolate the VIDEO database too (never open the real video_library.db) 2026-06-19 23:02:38 -07:00
test_acoustid_error_reporting.py AcoustID: report errors honestly instead of masking them as 'Skipped' 2026-05-31 20:10:31 -07:00
test_acoustid_normalize_angle_annotations.py feat(verification): persist status (db+tag), surface on Downloads, scan-aware force-imports 2026-06-11 01:28:31 +02:00
test_acoustid_scanner.py Fix import artist override and verification review 2026-06-11 01:28:31 +02:00
test_acoustid_skip_logic.py #797: stop AcoustID quarantining correct non-English-artist downloads 2026-06-05 16:02:01 -07:00
test_acoustid_version_mismatch.py AcoustID: report errors honestly instead of masking them as 'Skipped' 2026-05-31 20:10:31 -07:00
test_admin_gating.py tests: use soulsync-testdb- prefix in the web_server endpoint tests 2026-06-10 14:27:35 -07:00
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 Album bundle: fall back to per-track on an I/O error, don't hard-fail the batch 2026-06-01 13:29:05 -07:00
test_album_completeness_job.py Fix: maintenance findings badge inflated when scan dedup-skipped 2026-05-04 08:55:13 -07:00
test_album_mbid_consistency.py Update mbid consistency test mock to match new create_finding bool contract 2026-05-04 09:11:01 -07:00
test_amazon_outage.py Fix #759: Amazon enrichment floods when its public proxy is down 2026-06-01 13:10:51 -07:00
test_archive_pipeline.py feat(downloads): add archive_pipeline module for torrent/usenet downloads 2026-05-20 17:05:00 -07:00
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 Cover Art Filler: write cover.jpg to the RESOLVED folder, not the raw DB path (Sokhi — the actual bug) 2026-06-08 18:25:50 -07:00
test_art_preservation.py Fix #764: import no longer destroys embedded cover art 2026-06-02 08:40:05 -07:00
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 Artist pages: stop watchlist probes from poisoning the album-list cache 2026-06-07 09:49:30 -07:00
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 Fix: enhanced artist view 404s for library artists opened via source ID 2026-05-28 12:00:29 -07:00
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_top_tracks_clients.py Add download buttons + bulk action to artist top-tracks sidebar 2026-05-07 15:44:47 -07:00
test_atomic_audio_save.py Import: atomic tag saves so an interrupted/OOM save can't destroy the file (#819) 2026-06-08 13:46:28 -07:00
test_audiodb_worker_stuck_track.py AudioDB worker: stop infinite loop on direct-ID lookup failure (#553) 2026-05-11 14:18:55 -07:00
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: auth last_used_at write throttle 2026-04-19 15:22:24 -07:00
test_auto_sync_js.py Add node:test contract for auto-sync.js helpers 2026-05-25 00:01:34 -07:00
test_canonical_alternates.py #767-2: reorganize finds the right album edition instead of mislabeling singles as deluxe 2026-06-06 10:53:13 -07:00
test_canonical_columns_migration.py Canonical album version — Stage 1: schema + pure scorer (dormant) 2026-06-02 11:30:58 -07:00
test_canonical_db.py Canonical album version — Stage 2 (core): resolver + persistence (dormant) 2026-06-02 11:36:19 -07:00
test_canonical_manual_lock.py #758: a manual album match pins + locks the canonical version 2026-06-05 23:28:19 -07:00
test_canonical_orchestration.py Canonical findings: include as much (free) data as possible 2026-06-02 14:10:02 -07:00
test_canonical_resolver.py #767-2: reorganize finds the right album edition instead of mislabeling singles as deluxe 2026-06-06 10:53:13 -07:00
test_canonical_version.py Canonical album version — Stage 1: schema + pure scorer (dormant) 2026-06-02 11:30:58 -07:00
test_canonical_version_job.py Repair settings: dropdown for fixed-choice settings (canonical source_selection) 2026-06-02 15:33:13 -07:00
test_config_save_retry.py Stop config retry tests from writing to the real DB 2026-04-30 14:07:00 -07:00
test_content_filter_regex.py Fix watchlist content filters: live false positives + auto-scan bypass 2026-04-21 19:16:25 -07:00
test_context_qualifier_match.py #808: album-context qualifiers stop blocking library-presence matching 2026-06-07 09:24:03 -07:00
test_cover_art_targets.py Cover art: stop crying "(read-only?)" when files are simply already arted (Sokhi/Boulder) 2026-06-08 09:06:37 -07:00
test_create_finding_dedup_counter.py Repair job card badge — show pending count, not last-scan count 2026-05-07 08:28:17 -07:00
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 Realign test file names 2026-04-17 21:25:01 +03:00
test_database_io_resilience.py Handle transient SQLite IO during maintenance 2026-05-21 17:50:30 -07:00
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 Run auto-reconcile as a scan phase inside the running window 2026-06-05 19:10:31 -07:00
test_db_genres_json_normalization.py DB: normalize legacy comma-separated genres to canonical JSON 2026-05-29 12:11:09 -07:00
test_db_integrity.py DB backups: verify integrity + never evict the last good backup 2026-05-30 21:13:04 -07:00
test_db_isolation_guard.py tests: isolate the VIDEO database too (never open the real video_library.db) 2026-06-19 23:02:38 -07:00
test_db_migration_ledger.py DB: add schema_migrations ledger + PRAGMA user_version backstop 2026-05-29 12:14:20 -07:00
test_db_watchlist_amazon_id_migration.py DB: stop watchlist_artists rebuilds from dropping amazon_artist_id 2026-05-29 12:04:11 -07:00
test_dead_file_cleaner_guard.py Dead File Cleaner: don't flag a whole library when paths just aren't reachable (#828) 2026-06-09 13:12:50 -07:00
test_debug_info_services.py Fix Copy Debug Info music_source + surface missing services 2026-05-12 16:47:55 -07:00
test_dedupe_source_ids.py Auto-repair duplicated source ids on startup (one-time migration) 2026-06-05 10:21:52 -07:00
test_deezer_worker_artist_id_guard.py Fix Deezer enrichment stamping one artist id onto multiple artists 2026-06-05 07:32:51 -07:00
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 Discogs: strip artist disambiguation suffixes at every name surface (#634) 2026-05-27 09:05:47 -07:00
test_discogs_id_typing.py Discogs: fix master/release ID collision fetching the wrong album 2026-06-10 15:01:31 +02:00
test_discogs_track_count.py Discogs: count rows with empty type_ as real tracks too 2026-04-25 08:27:44 -07:00
test_discover_section_controller_js.py Discover controller — Cin pre-review polish 2026-05-07 20:35:10 -07:00
test_download_orchestrator_soundcloud.py Cin-5: Drop per-source attrs from orchestrator 2026-05-04 23:14:05 -07:00
test_download_origins.py Download Origins: see (and delete) exactly what watchlist + playlist syncs downloaded 2026-06-07 00:15:31 -07:00
test_download_plugin_conformance.py Add torrent usenet PR notes and test updates 2026-05-21 15:28:48 -07:00
test_downloads_pagination.py Lift shared runtime state into core 2026-04-27 19:54:44 +03:00
test_duplicate_detector_mount_paths.py Filter same-physical-file duplicates from duplicate detector 2026-04-30 14:06:10 -07:00
test_duplicate_detector_slskd_dedup.py Fix: maintenance findings badge inflated when scan dedup-skipped 2026-05-04 08:55:13 -07:00
test_duplicate_keep.py Fix: duplicate detector kept lossy over lossless (rank format first) 2026-06-01 12:49:34 -07:00
test_embed_known_source_ids.py Library re-tag: seam tests for the job scan, apply handler, and source-id embed 2026-06-04 09:46:35 -07:00
test_empty_folder_cleaner.py Add Empty Folder Cleaner library-maintenance job (corruption's request) 2026-06-11 22:11:26 -07:00
test_enrichment_art_preservation.py Fix #764: import no longer destroys embedded cover art 2026-06-02 08:40:05 -07:00
test_enrichment_artist_id_guard.py Apply artist-id name-guard to audiodb/qobuz/tidal workers too 2026-06-05 07:47:59 -07:00
test_enrichment_services.py Consolidate enrichment bubble routes behind a service registry 2026-05-01 20:14:30 -07:00
test_existing_album_folder.py Downloads: reuse an album's existing folder so batches don't split it (#829) 2026-06-09 13:47:25 -07:00
test_expired_download_cleaner.py Expired Cleaner: rename the safety toggle to dry_run (default ON), matching Re-tag 2026-06-07 22:13:30 -07:00
test_featured_artist_completion.py Match featured-artist tracks across discography completion 2026-04-30 19:31:11 -07:00
test_genius_backoff.py Genius 429 backoff: fail-fast gate instead of napping the import pipeline 2026-06-06 20:51:33 -07:00
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 Fix "no such table: hifi_instances" via defensive lazy-create 2026-05-06 17:49:44 -07:00
test_hls_parsing.py fix: pick OS-specific ffmpeg binary in hls demux fallback test 2026-04-28 21:13:54 -07:00
test_image_cache.py Image cache: reject truncated downloads instead of caching broken covers (#750) 2026-05-30 17:45:01 -07:00
test_import_album_match_endpoint.py Lift auto-import matching to testable helper + pin contracts 2026-05-09 09:13:23 -07:00
test_import_singles_parallel.py Restore soulsync logger state between parallel-imports tests 2026-05-01 08:45:17 -07:00
test_import_tag_preservation.py Import: never wipe a clean/matched import's tags when enhancement fails (#804) 2026-06-07 22:44:43 -07:00
test_integrity_failure_marks_task_failed.py Fix: tasks showed Completed when file was quarantined 2026-05-03 18:28:32 -07:00
test_issue_837_find_add_preserves_playlist.py Fix: manual Find & Add recreated the Jellyfin/Emby playlist (#837) 2026-06-10 16:55:08 -07:00
test_jellyfin_album_thumb.py Jellyfin/Emby: populate album thumb_url during the library scan (root cause of "flags every album") 2026-06-08 09:40:27 -07:00
test_launch_lock_gate.py Fix: launch PIN re-triggered the first-run setup wizard every visit (#842) 2026-06-10 11:40:47 -07:00
test_lb_series_detect.py Roll LB Weekly / Top series into single rolling mirrors (Phase 1c.2.1) 2026-05-26 15:49:49 -07:00
test_library_disk_usage.py Repair stale media schema during refresh 2026-05-21 17:41:54 -07:00
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 Fix #767: Library Organizer dry run no longer creates folders 2026-06-02 10:32:06 -07:00
test_library_retag_job.py Lyrics: add a "Lyrics Filler" maintenance job + lyrics option in the Re-tag tool (Sokhi) 2026-06-07 17:27:52 -07:00
test_library_stream_fallback.py #809 Navidrome playback: stream via the server's API when the library isn't mounted on disk 2026-06-07 13:52:14 -07:00
test_library_tag_payload.py Add _build_library_tag_db_data helper 2026-05-25 18:48:45 -07:00
test_library_track_identity.py Make extract_external_ids recognize all source-tagging conventions 2026-05-02 18:26:12 -07:00
test_lidarr_download_client.py Fix three Lidarr bugs that prevented it from being a real download source 2026-05-03 15:49:38 -07:00
test_liked_songs_playlist.py Mirrored "Liked Songs" stops 400ing on every auto-refresh (wolf39us) 2026-06-06 13:50:49 -07:00
test_listenbrainz_manager.py Auto-Sync: fix LB pipelines stuck on "Refreshing:" for 5+ minutes 2026-05-27 18:04:55 -07:00
test_listening_stats_batch_queries.py test: listening stats worker batched query paths 2026-04-19 15:22:25 -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 Fix CI: drop dead RetagDeps tests + pointless f-string 2026-06-04 12:53:05 -07:00
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 Fix #787: Find & Add now records a durable manual match that survives a rescan 2026-06-04 13:46:24 -07:00
test_manual_pick_no_auto_retry.py Add torrent and usenet release staging support 2026-05-21 14:22:21 -07:00
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 Fix: duplicate tracks in albums with Japanese / CJK titles (#722) 2026-05-28 08:53:43 -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 #802: on-demand memory-growth diagnostic (tracemalloc, browser-drivable) 2026-06-06 18:31:14 -07:00
test_metadata_cache_table_recreate.py Fix: metadata cache tables silently missing after DB recovery (stale migration marker) 2026-05-31 23:27:14 -07:00
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 Cover Art Filler: scan falls back to the raw file path when mapping fails (Sokhi #fix) 2026-06-08 17:32:38 -07:00
test_missing_lyrics_job.py Lyrics Filler: convert track duration ms→s for LRClib (exact-match was silently defeated) 2026-06-07 19:45:10 -07:00
test_navidrome_cover_url.py Fix #766: Navidrome album covers blank in the sync editor (+ other modals) 2026-06-02 11:01:28 -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 #809 Navidrome playback: stream via the server's API when the library isn't mounted on disk 2026-06-07 13:52:14 -07:00
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_path_resolve_confusables.py Delete: resolve the real on-disk file when DB metadata uses curly quotes (#833) 2026-06-09 22:28:53 -07:00
test_personalized_api.py Personalized playlists (3/N): standardized API endpoints 2026-05-15 17:15:25 -07:00
test_personalized_generators_curated.py Personalized playlists (2/N): all 8 generators wired through manager 2026-05-15 17:02:08 -07:00
test_personalized_generators_singletons.py Personalized playlists (2/N): all 8 generators wired through manager 2026-05-15 17:02:08 -07:00
test_personalized_generators_variants.py Personalized playlists (2/N): all 8 generators wired through manager 2026-05-15 17:02:08 -07:00
test_personalized_manager.py Personalized pipeline: auto-refresh stale snapshots after watchlist scan 2026-05-15 20:53:03 -07:00
test_personalized_playlists_id_gate.py Blocklist Phase 1 (backend): artist/album/track bans enforced at the wishlist chokepoint 2026-06-07 15:18:25 -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 Sync: append mode actually dedupes — stop re-adding the whole playlist (#823) 2026-06-09 16:31:05 -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 Playlists: batch toggle force-rebuilds its own folder (row flag = provenance only) + resolve diagnostics 2026-06-12 17:19:45 -07:00
test_playlist_reconcile.py #766 follow-on: source rows borrow their matched server track's cover 2026-06-02 11:08:35 -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_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
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 Profiles: per-profile Spotify builds for own-app creds OR a token cache 2026-06-10 12:28:03 -07:00
test_provenance_id_persistence.py Persist source IDs at download time + backfill onto tracks on sync 2026-05-02 17:44:10 -07:00
test_prowlarr_client.py test: cover Prowlarr + torrent + usenet adapters 2026-05-20 15:43:18 -07:00
test_qobuz_credential_sync.py Address Copilot review nits 2026-05-05 11:22:01 -07:00
test_qobuz_playlists.py Fetch all Qobuz favorite tracks for discovery 2026-05-24 01:17:38 -07:00
test_recommendation_sources.py Recommendations: explain WHICH of your artists drive each suggestion 2026-06-03 18:23:51 -07:00
test_release_dates.py #705: release-date gate — unreleased tracks stay out of the wishlist cycle and Fresh Tape 2026-06-07 00:29:05 -07:00
test_reorganize_alternate_edition.py #767-2: reorganize finds the right album edition instead of mislabeling singles as deluxe 2026-06-06 10:53:13 -07:00
test_reorganize_canonical_source.py Canonical album version — Stage 3: Reorganizer prefers pinned canonical (read) 2026-06-02 11:45:31 -07:00
test_reorganize_db_methods.py Reorganize queue: race + dedupe fixes from kettui review 2026-04-26 08:40:24 -07:00
test_reorganize_deleted_quarantine.py Reorganize: skip files in the duplicate-cleaner /deleted quarantine (#746) 2026-05-30 00:15:06 -07:00
test_reorganize_orphan_format_handling.py Reorganize: move orphan-format siblings alongside the canonical 2026-05-10 19:58:31 -07:00
test_reorganize_queue.py Reorganize queue: race + dedupe fixes from kettui review 2026-04-26 08:40:24 -07:00
test_reorganize_runner.py Library reorganize: FIFO queue with live status panel 2026-04-25 18:01:32 -07:00
test_reorganize_tag_source.py Reorganize: optional embedded-tag mode (closes #592) 2026-05-15 07:56:18 -07:00
test_reorganize_unknown_artist_hint.py Reorganize: hint at Unknown Artist Fixer for placeholder-metadata rows 2026-05-10 20:16:28 -07:00
test_repair_worker_album_fill.py fix(album-completeness): block cross-artist auto-fill 2026-05-21 16:49:12 -07:00
test_repair_worker_unresolvable_folder_error.py Album Completeness: surface diagnostic when resolver can't find album folder 2026-05-12 14:04:15 -07:00
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 Fix: ReplayGain wrote same +52 dB gain to every track 2026-05-03 19:08:35 -07:00
test_request_cleanup_timer.py test: api/request periodic cleanup timer 2026-04-19 15:22:25 -07:00
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 Library re-tag (1/3): pure planner — match source tracklist + per-field tag diff 2026-06-04 08:50:40 -07:00
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 Tighten metadata and import safety 2026-04-27 20:28:05 +03:00
test_scan_wait_action.py Fix: deep-scan / DB-update automation falsely errors on large libraries (stall-based timeout) 2026-06-01 16:30:28 -07:00
test_script_split_integrity.py Profiles: per-profile Spotify self-auth (shared app) + My Accounts modal + read wiring 2026-06-10 12:21:17 -07:00
test_search_tracks_relevance.py Fix: Find & Add library search buried exact matches (case-sensitive ordering) 2026-06-10 17:23:13 -07:00
test_server_playlist_append_mode.py Sync: append mode actually dedupes — stop re-adding the whole playlist (#823) 2026-06-09 16:31:05 -07:00
test_service_credentials.py Profiles: review fixes — close two gating gaps + reject whitespace secrets 2026-06-10 00:48:03 -07:00
test_settings_redaction.py Security: stop GET /api/settings from shipping decrypted secrets to the browser 2026-06-09 22:50:18 -07:00
test_similar_artists_status_codes.py Fix: MusicMap 404s miscounted as errors in similar-artists worker 2026-06-03 18:04:31 -07:00
test_similar_artists_worker.py Similar Artists worker: guarantee every stored similar has a source id 2026-06-03 16:26:29 -07:00
test_socketio_cors.py Socket.IO CORS: handle self-review nits 2026-04-26 19:24:43 -07:00
test_soulseek_album_fallback.py Fix #796: Soulseek album bundle left completed files in slskd download folder 2026-06-04 21:56:07 -07:00
test_soulseek_album_poll_stall.py Soulseek album poll: treat 'Aborted'/'Cancelled' transfers as failed 2026-05-29 19:29:55 -07:00
test_soulseek_search_throttle.py Add min delay between slskd searches (Bell Canada anti-abuse fix) 2026-05-12 19:11:12 -07:00
test_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
test_source_ids_registry.py Source IDs: add canonical registry, adopt at the highest-value sites 2026-05-29 12:19:59 -07:00
test_source_title.py Fix #768: playlist sync editor refusing to match certain tracks 2026-06-02 10:16:21 -07:00
test_spa_deep_linking.py feat: artist-detail deep linking — /artist-detail/:source/:id 2026-05-18 13:07:54 -07:00
test_spotify_free_metadata.py Spotify: rename "Spotify Free" → "Spotify (no auth)", default enrichment to it 2026-06-09 12:55:19 -07:00
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 SpotipyFree integration confirmed working (236 tracks live); deps + meta tweak 2026-06-02 22:50:04 -07:00
test_spotify_token_cache.py Spotify tokens move into the database — daily Docker deauth fixed (wolf39us) 2026-06-07 12:01:33 -07:00
test_spotify_unavailable_reason.py Spotify: log WHY a request was skipped, not a catch-all "Not authenticated" 2026-06-06 09:40:52 -07:00
test_staging_album_provenance.py refactor(staging): inject batch-field accessor instead of importing runtime_state 2026-05-20 20:43:35 -07:00
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 Fix: mirrored playlist action buttons dead when name has an apostrophe 2026-06-01 09:02:25 -07:00
test_status_engine_fallback.py Manual picks: stream results, don't auto-retry, fix stuck-at-0% 2026-05-08 15:12:58 -07:00
test_subtitle_qualifier_match.py Matcher: bracketed subtitles no longer read as different songs (#825) 2026-06-09 16:03:11 -07:00
test_sync_discovery_scan_events.py Realign test file names 2026-04-17 21:25:01 +03:00
test_tag_writer_multi_artist.py AcoustID scanner: multi-candidate match + duration guard + multi-value retag 2026-05-14 14:09:38 -07:00
test_tag_writer_placeholder_guard.py Full release dates: store + write yyyy-mm-dd end to end (#824 part 2) 2026-06-08 23:32:42 -07:00
test_tidal_album_tracks.py Your Albums: selectable wishlist modal + Tidal album resolution 2026-05-11 12:36:16 -07:00
test_tidal_auth_instructions.py Show Tidal callback port (not Spotify's) in auth instructions 2026-04-30 20:54:06 -07:00
test_tidal_auth_redirect_uri.py Honor configured Tidal redirect_uri, drop request-host fallback 2026-05-02 19:20:18 -07:00
test_tidal_collection_tracks.py Tidal: surface Favorite Tracks as virtual playlist (issue #502) 2026-05-10 21:36:22 -07:00
test_tidal_favorite_albums_artists.py Tidal: rewire favorite albums + artists to V2 user-collection endpoints 2026-05-11 10:03:27 -07:00
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 fix(tidal): honour version field in matching and back off on rate limits 2026-06-08 13:50:19 -04:00
test_tidal_rate_limit_backoff.py fix(tidal): honour version field in matching and back off on rate limits 2026-06-08 13:50:19 -04:00
test_tidal_search_shortening.py Reject Tidal streams that silently downgrade from the requested quality 2026-04-24 13:12:30 -07:00
test_title_match_guard.py Fix #769: playlist sync matched wrong same-artist track with high confidence 2026-06-02 09:14:26 -07:00
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 Fix #790: torrent client URL without http:// scheme fails to connect 2026-06-04 11:57:53 -07:00
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 Torrents: stalled-torrent handling — abandon a dead magnet instead of holding a worker 6h (noldevin) 2026-06-07 12:38:51 -07:00
test_track_artist_matching.py Add fallback negative-case test for track-artist matching 2026-04-30 17:13:15 -07:00
test_track_number_repair.py Fix CI test failures from incomplete dummy config and encoding 2026-04-19 13:04:55 -07:00
test_track_repair_canonical.py Canonical album version — Stage 4: Track Number Repair prefers canonical (read) 2026-06-02 11:47:42 -07:00
test_track_search_single_query.py test: api_search_tracks single-query track search 2026-04-19 15:22:24 -07:00
test_unknown_artist_fixer.py fix(repair): rewire Unknown Artist Fixer deferred imports (#646) 2026-05-19 22:09:15 -07:00
test_usenet_client_adapters.py Fix: Usenet bundle stuck at 99%/100% — SAB reports post-processing in History as non-terminal (#721) 2026-05-29 00:49:02 -04: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 feat(verification): status vocabulary, DB column, SOULSYNC_VERIFICATION tag 2026-06-11 01:27:29 +02:00
test_video_api.py Video tools: add a Server Scan tool (trigger the media server to index new downloads) 2026-06-22 08:26:24 -07:00
test_video_auto_wishlist_airing.py Watchlist hygiene: auto-prune ended/canceled followed shows 2026-06-21 15:05:20 -07:00
test_video_automations_builder.py video automations: working builder + New Automation button (own builder, not music's) 2026-06-19 23:02:52 -07:00
test_video_backfill.py video enrichment: keyless workers read 'Disabled' (not 'Not configured') when off 2026-06-18 23:29:22 -07:00
test_video_cache.py video: real TTL+LRU cache (thread-safe) + cache search — the kettui way 2026-06-15 13:02:24 -07:00
test_video_calendar_scope.py video calendar: watchlist-driven by default + an 'All library' toggle 2026-06-20 14:07:40 -07:00
test_video_database.py Video watchlist: strip dirty titles when sorting (leading-space fix) 2026-06-21 08:52:49 -07:00
test_video_detail_yt_reset.py video downloads: header 'Auto' picks ONE best across all sources; fix YT playlist leak 2026-06-20 10:48:55 -07:00
test_video_download_auto.py Video downloads: best-in-class post-process pipeline 2026-06-21 01:44:35 -07:00
test_video_download_config.py video downloads (phase 3): source mode + hybrid chain (soulseek/torrent/usenet only) 2026-06-19 00:15:13 -07:00
test_video_download_events.py video automations: post-download scan chain (parity with music's batch→scan→update) 2026-06-20 14:47:00 -07:00
test_video_download_history.py Video download history: permanent archive snapshotted at terminal status (phase 1) 2026-06-21 14:10:22 -07:00
test_video_download_pipeline.py video downloads Phase C: auto-retry + alternate-query requery 2026-06-19 17:12:44 -07:00
test_video_download_tracking.py Video: live per-episode download tracking + auto-wishlist today's airings 2026-06-21 02:27:08 -07:00
test_video_enrichment.py video enrichment: add a GLOBAL 'Retry all failed' (all workers, all kinds) 2026-06-20 14:15:18 -07:00
test_video_enrichment_manager.py video enrichment: add a GLOBAL 'Retry all failed' (all workers, all kinds) 2026-06-20 14:15:18 -07:00
test_video_followed_shows.py Watchlist hygiene: auto-prune ended/canceled followed shows 2026-06-21 15:05:20 -07:00
test_video_import_page.py Video downloads: best-in-class post-process pipeline 2026-06-21 01:44:35 -07:00
test_video_importer.py Video downloads: best-in-class post-process pipeline 2026-06-21 01:44:35 -07:00
test_video_library_paths.py Video downloads: best-in-class post-process pipeline 2026-06-21 01:44:35 -07:00
test_video_manual_import.py Video downloads: best-in-class post-process pipeline 2026-06-21 01:44:35 -07:00
test_video_mediainfo.py Video downloads: best-in-class post-process pipeline 2026-06-21 01:44:35 -07:00
test_video_organization.py settings: youtube path template field on the Library tab 2026-06-25 19:40:56 -07:00
test_video_person_watchlist.py video: add 'Add to Watchlist' button to person detail pages 2026-06-20 13:50:34 -07:00
test_video_process_wishlist.py video automations: auto-download movie + episode wishlist (soulseek) 2026-06-25 22:08:02 -07:00
test_video_process_youtube_wishlist.py video automations: seed the three new ones as system automations 2026-06-25 20:56:37 -07:00
test_video_quality_eval.py Video quality: recognize plain WEB + accept resolution-only releases 2026-06-21 02:11:40 -07:00
test_video_quality_profile.py video quality profile: loose resolution cutoff + movie/episode size split 2026-06-19 10:40:53 -07:00
test_video_release_parse.py Video quality: recognize plain WEB + accept resolution-only releases 2026-06-21 02:11:40 -07:00
test_video_retry.py video downloads Phase C: auto-retry + alternate-query requery 2026-06-19 17:12:44 -07:00
test_video_scan_scope.py Smart post-download scan: skip the crawl when the server already has the grab (phase 3) 2026-06-21 14:20:49 -07:00
test_video_scan_watchlist_channels.py video automations: watchlist scans for people + channels 2026-06-25 19:07:06 -07:00
test_video_scan_watchlist_people.py video automations: watchlist scans for people + channels 2026-06-25 19:07:06 -07:00
test_video_scan_watchlist_playlists.py video automations: scan watchlist YouTube playlists (mirror-all) 2026-06-25 21:18:53 -07:00
test_video_scanner.py Video: two system deep-scan automations (Movie + TV), independently scoped 2026-06-21 12:14:46 -07:00
test_video_search_pipeline.py video search: each source returns its own results (was identical) 2026-06-19 13:56:04 -07:00
test_video_server_resolution.py Video side: own server connection (Plex/Jellyfin), music-style picker, isolated 2026-06-15 16:42:22 -07:00
test_video_side_shell.py Video downloads: best-in-class post-process pipeline 2026-06-21 01:44:35 -07:00
test_video_sidecars.py Video downloads: best-in-class post-process pipeline 2026-06-21 01:44:35 -07:00
test_video_slskd_search.py video search: REAL slskd search for the Soulseek source (was mocked) 2026-06-19 14:16:44 -07:00
test_video_subtitles.py Video downloads: best-in-class post-process pipeline 2026-06-21 01:44:35 -07:00
test_video_upsert_preserve.py video scan: only FULL resets enrichment; incremental/deep preserve it 2026-06-20 15:06:44 -07:00
test_video_wishlist_clear.py video wishlist: add a 'Clear all' button (movies / TV / YouTube) 2026-06-20 16:42:57 -07:00
test_video_youtube.py Playlist count: show the TRUE total + load ~200 (was capped at ~100 via yt-dlp) 2026-06-17 21:40:56 -07:00
test_video_youtube_enrichment.py video enrichment: fix DeArrow retry (was a silent no-op) 2026-06-20 12:52:06 -07:00
test_video_youtube_quality.py youtube quality: map profile -> yt-dlp format selection 2026-06-25 19:11:35 -07:00
test_watchlist_album_match.py Watchlist: stop treating different decimal-volume albums as duplicates (Sokhi — the real bug) 2026-06-08 20:46:40 -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 Complete MusicBrainz watchlist source parity 2026-05-18 19:19:25 -07:00
test_watchlist_itunes_id_repair.py Watchlist: repair iTunes ids that are actually Deezer ids (the 37725457 corruption, proven live) 2026-06-07 11:27:28 -07:00
test_watchlist_itunes_match.py Watchlist: iTunes ID backfill never worked in the normal wiring — use the registry client 2026-06-07 11:22:03 -07:00
test_watchlist_scan_history.py Watchlist: bespoke live scan deck + persistent per-run Scan History (#831 round 2) 2026-06-09 20:35:16 -07:00
test_watchlist_scanner_scan.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_websocket_client_transport.py Repoint websocket transport test to core.js after split 2026-04-22 11:30:39 -07:00
test_websocket_infrastructure.py Split metadata source and Spotify status 2026-05-02 22:02:00 +03:00
test_wishlist_pagination.py test: wishlist SQL pagination and category filter 2026-04-19 15:22:24 -07:00
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 Tighten artist matching: 0.85 gate + shared uniqueness guard 2026-06-05 10:01:17 -07:00
test_worker_existing_id_marks_matched.py test: enrichment worker re-processing fix and migration backfill 2026-04-19 15:22:24 -07:00
test_worker_utils_album_track_count.py Repair stale media schema during refresh 2026-05-21 17:41:54 -07:00
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 Import speed: downloads pause ALL enrichment workers, discovery pauses the contention five 2026-06-06 19:05:56 -07:00
test_youtube_download.py youtube fulfillment: download worker (pure core) 2026-06-25 19:24:58 -07:00
test_youtube_ffmpeg_no_eager_download.py ffmpeg gate also covers is_available — fixes the actual leak path 2026-05-08 15:46:31 -07:00
test_youtube_js_runtime.py Tests: lock the yt-dlp JS-runtime startup warning seam 2026-06-06 16:52:52 -07:00
test_youtube_search_dash_query.py Escape dash-leading YouTube search queries 2026-05-24 08:54:47 -07:00
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