Adds an opt-in `rank_candidates_by_quality` profile flag. When on, the priority-mode download walk orders candidates by the ranked-target quality (confidence/speed only break ties) instead of confidence-first. Default off keeps the byte-for-byte old behaviour, so existing installs are unaffected. Best-quality search mode is always quality-first regardless of the flag; the toggle only affects priority mode. Search-time source selection is unchanged — nothing is skipped, so a track can never go missing, only the order in which copies are tried changes. The version-mismatch force-import follows automatically: it accepts the first-tried (= best-ordered) quarantined candidate, which is the highest-quality one once the walk is quality-first. No change to its selection logic needed. - core/quality/selection.py: load_rank_candidates_by_quality() (fail-closed). - core/downloads/task_worker.py: _best_quality_ordering -> _candidate_ordering; quality-first when best_quality mode OR the toggle is on. - database/music_database.py: default profile carries the flag (False). - web_server.py: flag is preserved globally across preset apply/reset, like search_mode. - core/imports/version_mismatch_fallback.py: comment clarified (no behaviour change). Tests (TDD): load_rank_candidates_by_quality default/enabled/disabled/error; _candidate_ordering across all mode+toggle combinations + fail-closed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
"""core.quality.selection.load_search_mode — reads the download search
|
|
strategy from the quality profile.
|
|
|
|
'priority' → today's behaviour: first satisfying source wins.
|
|
'best_quality' → pool all sources, work best→worst by actual quality.
|
|
|
|
Default and any unknown value resolve to 'priority' so every existing
|
|
install keeps its current behaviour.
|
|
"""
|
|
|
|
import core.quality.selection as selection
|
|
import database.music_database as music_database
|
|
|
|
|
|
def _patch_profile(monkeypatch, profile):
|
|
class _FakeDB:
|
|
def get_quality_profile(self):
|
|
return profile
|
|
|
|
monkeypatch.setattr(music_database, "MusicDatabase", _FakeDB)
|
|
|
|
|
|
def test_defaults_to_priority_when_key_absent(monkeypatch):
|
|
_patch_profile(monkeypatch, {"version": 3, "ranked_targets": []})
|
|
assert selection.load_search_mode() == "priority"
|
|
|
|
|
|
def test_returns_best_quality_when_set(monkeypatch):
|
|
_patch_profile(monkeypatch, {"version": 3, "search_mode": "best_quality"})
|
|
assert selection.load_search_mode() == "best_quality"
|
|
|
|
|
|
def test_unknown_value_falls_back_to_priority(monkeypatch):
|
|
_patch_profile(monkeypatch, {"version": 3, "search_mode": "nonsense"})
|
|
assert selection.load_search_mode() == "priority"
|
|
|
|
|
|
# ── rank_candidates_by_quality toggle ───────────────────────────────────────
|
|
# Opt-in: order the priority-mode download walk by ranked-target quality
|
|
# instead of confidence-first. Default OFF = byte-for-byte old behaviour.
|
|
|
|
|
|
def test_rank_by_quality_defaults_false_when_key_absent(monkeypatch):
|
|
_patch_profile(monkeypatch, {"version": 3, "ranked_targets": []})
|
|
assert selection.load_rank_candidates_by_quality() is False
|
|
|
|
|
|
def test_rank_by_quality_true_when_enabled(monkeypatch):
|
|
_patch_profile(monkeypatch, {"version": 3, "rank_candidates_by_quality": True})
|
|
assert selection.load_rank_candidates_by_quality() is True
|
|
|
|
|
|
def test_rank_by_quality_false_when_disabled(monkeypatch):
|
|
_patch_profile(monkeypatch, {"version": 3, "rank_candidates_by_quality": False})
|
|
assert selection.load_rank_candidates_by_quality() is False
|
|
|
|
|
|
def test_rank_by_quality_false_on_db_error(monkeypatch):
|
|
class _BoomDB:
|
|
def get_quality_profile(self):
|
|
raise RuntimeError("db down")
|
|
|
|
monkeypatch.setattr(music_database, "MusicDatabase", _BoomDB)
|
|
assert selection.load_rank_candidates_by_quality() is False
|