Summary
The automatic-search sweep ran on a hardcoded 6-hour cadence that also served as the "not searched since" cutoff, and it searched every eligible book back-to-back. On a large wanted list that hammers the indexers (and a shared Prowlarr). This makes the timing configurable and, per review, keeps the sweep cadence and the per-book eligibility separate: the worker can check hourly while each book is only searched once per cooldown.
Scope is timing only. The title-only fallback from the earlier revision is gone; that lane belongs to #1072 and the identity-matching follow-ups.
Changes
Added
ApplicationSettings.AutomaticSearchIntervalHours(default 1, clamped [1, 168]) — how often the worker sweeps for eligible books. Only the cadence of the check.ApplicationSettings.AutomaticSearchCooldownHours(default 24, clamped [1, 720]) — how long a book stays ineligible after its last search. One shared cooldown for every book.ApplicationSettings.AutomaticSearchBookDelaySeconds(default 5, clamped [0, 300]) — pause between consecutive books inside one sweep.0disables it. Manual "Search now" is unaffected.AutomaticSearchTiming(HostedServices/Search/) — resolves and clamps the three from settings soAutomaticSearchServiceandAutomaticSearchProcessorshare one definition;EligibilityCutoff(now)isnow − cooldown.- Migration
20261021212418_AddAutomaticSearchTiming(+ Designer, snapshot). Column defaults match the property initializers so the existing singleton settings row behaves exactly like a fresh install.
Changed
AutomaticSearchService: the periodic runner'sintervalProviderreads the sweep interval from settings each cycle (falls back to the default on a read error), so a change takes effect without a restart.AutomaticSearchProcessor: the eligibility cutoff comes from the cooldown instead of the sweep interval; the per-book delay is applied between books (not after ...
Automated Canary build