video search: evaluate/rank pipeline + mock indexer + /downloads/search
Phase 2 of live search (indexer mocked, pipeline real):
- quality_eval.evaluate_release(parsed, profile, scope, want_season/episode, size_gb)
→ {accepted, score, rejected, tier, quality_label}. Sonarr-style: rejects junk
sources/codecs/3D, requires an ENABLED ladder tier, honours HDR-require + size caps,
and VALIDATES scope (episode wants SxxExx, season wants the whole-season PACK, show
wants a complete-series pack, with season/episode-number checks). Scores keepers by
resolution/source/codec-pref/HDR/audio/repack for ranking.
- mock_search.py: deterministic stand-in indexer returning scope-shaped raw hits
(the single swap-point for real slskd/Prowlarr).
- POST /downloads/search: mock → parse → evaluate → rank (accepted, score, seeders).
16 tests, isolation guard + ruff clean. UI wiring next.