soulsync/tests/imports
BoulderBadgeDad 3e554f8274 #889 Phase 3: re-identify search — multi-source track→release lookup + API
Search any configured source (tabs, default active) and surface the SAME song
across its collections (single/EP/album) so the user can pick which release a
track should be filed under.

- core/imports/rematch_search.py: pure normalize + injected client factory.
  search_release_candidates() → lightweight display rows from typed search_tracks
  (title/artist/release/type badge/year/count/art/isrc/track_id); resolve_hint_fields()
  runs ONCE on the picked row via get_track_details to pull the album_id (+ isrc/
  track#/disc) the hint needs. infer_release_type() handles Spotify's missing 'EP'
  (multi-track 'single' → EP badge); filing is driven by real album_id, not the label.
- GET /api/reidentify/sources (tabs) + GET /api/reidentify/search (rows). Graceful
  empty on dead source / blank query / client error — never raises.

14 tests. Inert until the modal (Phase 4) calls it.
2026-06-18 15:31:33 -07:00
..
test_album_grouping.py Library: group imported albums by canonical release id, not just the name string 2026-06-18 09:16:00 -07:00
test_album_matching_exact_id.py
test_album_matching_helper.py
test_album_search_scoring.py
test_auto_import_clear_completed_endpoint.py
test_auto_import_context_shape.py
test_auto_import_executor.py Auto-import: bounded ThreadPoolExecutor + per-candidate UI state isolation 2026-05-09 17:45:42 -07:00
test_auto_import_live_progress.py
test_auto_import_multi_disc_matching.py
test_auto_import_multi_source_fallback.py
test_auto_import_scanner_grouping.py
test_auto_import_tag_reader_real_files.py
test_build_single_import_context_typed_path.py
test_dedup_orphan_cleanup.py
test_duration_tolerance_resolution.py
test_expected_duration_for_check.py Import: don't duration-quarantine manual imports against a re-resolved release (#804) 2026-06-07 23:02:34 -07:00
test_file_integrity.py
test_folder_artist_override.py Fix import artist override and verification review 2026-06-11 01:28:31 +02:00
test_import_album.py
test_import_context.py Multi-artist tags: Search → Download Now finally knows its metadata source (Netti93) 2026-06-09 17:20:16 -07:00
test_import_file_ops.py
test_import_filename.py
test_import_guards.py
test_import_paths.py Fix #767: Library Organizer dry run no longer creates folders 2026-06-02 10:32:06 -07:00
test_import_pipeline.py PR #801 follow-up: default-config template contradicted the retry engine's documented default 2026-06-07 11:04:28 -07:00
test_import_rejection_reason.py Fix #764: manual import reported quarantined files as a successful "Done" 2026-06-02 08:40:26 -07:00
test_import_resolution_single_track_context.py
test_import_routes.py Import: don't duration-quarantine manual imports against a re-resolved release (#804) 2026-06-07 23:02:34 -07:00
test_import_side_effects.py
test_import_singles_route_through_album_path.py
test_import_staging.py
test_lossy_copy_delete_original.py Honor lossy_copy.delete_original after successful conversion 2026-05-02 14:26:46 -07:00
test_quarantine_management.py #876: group quarantine alternatives by target track-id + auto-clear siblings on approve 2026-06-15 22:12:06 -07:00
test_rematch_hints.py #889 Phase 1: re-identify hint store (DB table + pure create/find/consume seam) 2026-06-18 15:15:41 -07:00
test_rematch_hints_seam.py #889 Phase 2: import seam — hint short-circuits identification, replaces on success 2026-06-18 15:25:37 -07:00
test_rematch_search.py #889 Phase 3: re-identify search — multi-source track→release lookup + API 2026-06-18 15:31:33 -07:00
test_search_match_endpoints.py
test_single_to_album.py Library: wire single->album resolution into import detection (gated, fail-safe) 2026-06-18 09:30:11 -07:00
test_track_number_resolver.py Track "01" bug: recover real track position instead of fabricating 1 2026-06-15 23:35:48 -07:00
test_version_mismatch_fallback.py Downloads: opt-in last-resort acceptance of repeated version mismatches 2026-06-06 16:44:14 +02:00