What's New: Search Intelligence
The core differentiator — making searches smarter, not just scheduled.
Adaptive Search Prioritization (PR #78)
- Scoring engine: items scored 0-100 based on recency, search history, and time since last search
- Strategy-aware weights: Missing favors recently aired content; Cutoff Unmet spreads searches over time
- Per-queue batch limits:
max_items_per_run(default 50) ensures only highest-priority items are searched - Transparent: score and reason visible in search logs
Search Cooldown Intelligence (PR #79)
- Tiered cooldowns: 6h for <24h old content, 12h for <7d, 24h for <30d, 72h for <1y, 7d for >1y
- Exponential backoff: each search with no grab doubles the cooldown (capped at 14 days)
- Persistent: cooldowns stored in DB, survive restarts (replaces volatile in-memory dict)
- Per-queue configurable: adaptive (default) or flat mode with custom hours
Search Result Feedback Loop (PR #80)
- Grab detection: polls command statuses 15 minutes after search to detect successful downloads
- Learning: feed grab data back into scoring and cooldown calculations
- Dashboard metric: grab rate (successful grabs / searches triggered)
Search Intelligence UI (PR #81)
- Score + reason in search log entries on queue detail page
- Search stats on library detail page (attempts, grabs, last searched)
- Cooldown mode and max items config in Create Queue modal
- Grab rate metric on dashboard
Stats
- 99 new tests (19 library scoring + 41 scoring engine + 29 cooldown + 10 feedback)
- 4 PRs, stacked and merged in order
- 5 new service modules: scoring.py, cooldown.py, feedback.py