feat(quality): quality-rank streaming results after the match filter
search_and_download_best applied confidence scoring to streaming results but never quality-ranked them — only the Soulseek path did. Apply rank_for_profile to the confidence-passing survivors so the best version wins (match first, then quality). Stable ranking keeps confidence order within an equal tier; an "or scored" fail-safe keeps a candidate to try. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
310a5fe1bd
commit
71f7c4a5e1
1 changed files with 10 additions and 2 deletions
|
|
@ -412,9 +412,17 @@ class DownloadOrchestrator:
|
||||||
|
|
||||||
if scored:
|
if scored:
|
||||||
scored.sort(key=lambda x: x._match_confidence, reverse=True)
|
scored.sort(key=lambda x: x._match_confidence, reverse=True)
|
||||||
filtered_results = scored
|
# Match filter done (right track); now prefer the best quality
|
||||||
|
# among the confidence-passing survivors so streaming isn't
|
||||||
|
# quality-blind like Soulseek already isn't. Stable ranking
|
||||||
|
# keeps confidence order within an equal quality tier; the
|
||||||
|
# `or scored` fail-safe never leaves us with nothing to try.
|
||||||
|
from core.quality.selection import rank_for_profile
|
||||||
|
ranked, _ = rank_for_profile(scored)
|
||||||
|
filtered_results = ranked or scored
|
||||||
logger.info(f"Streaming validation: {len(scored)}/{len(tracks)} passed "
|
logger.info(f"Streaming validation: {len(scored)}/{len(tracks)} passed "
|
||||||
f"(best: {scored[0]._match_confidence:.2f})")
|
f"(best: {scored[0]._match_confidence:.2f}, "
|
||||||
|
f"quality pick: {filtered_results[0].audio_quality.label()})")
|
||||||
else:
|
else:
|
||||||
logger.warning(f"No streaming results passed validation for: {query}")
|
logger.warning(f"No streaming results passed validation for: {query}")
|
||||||
return None
|
return None
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue