Adds Watchtower — a time-shifted watchdog that keeps the titles on your lists pre-resolved and verified so the first read lands on a known-good release with no search at request time — alongside a major Warden expansion (GitHub backup, remote sources, import/export), per-indexer search/retrieve user agents with authenticated proxies, smarter search-profile fallback and identity matching, and a round of read-path and connection-pool reliability work.
Highlights
- Watchtower: keep your lists ready before you ask. A new background service pre-resolves the titles on your lists to a healthy release and re-verifies them over time, so a request lands on a known-good release with no search on the hot path — the same watchdog ranker and STAT health check, run ahead of time instead of on demand. It is pointer-only by design (it stores the winning NZB's segment map and a small verified shortlist, never the file itself) and
resolve-onlyby default, so nothing downloads until a title is actually requested. Sources are agnostic: a manual IMDb id, any Stremio catalog URL (Trakt, MDBList, Letterboxd, and anything wrapped as a catalog addon), a URL/JSON list, or a whole series expanded into episodes via TVmaze with finished seasons warmed as a single season bundle. A dedicated Watchtower page shows the wanted-set live, and a Settings tab exposes the fullwatchtower.*tuning surface. (abd53d5, c5bdc0f, 75b16e5, 100eee3, b258aca) - Warden, grown into a portable, multi-source filter list. The dead-release filter gains scheduled backup and restore to a GitHub repo, remote fingerprint sources with per-source trust levels (full/corroborate/observe) that refresh on their own cadence, bulk import/export of those sources as a shareable JSON bundle, gzip-compressed fingerprint import/export, drag-and-drop import, and backbone-scoped filtering that only applies a source when its provider matches one of yours. (6b7d3c2, 3eff1cd, 567ed2d, 1bc001d, 125e975, 631b755)
- Per-indexer user agents and authenticated proxies. Each indexer can now carry its own search and retrieve user agent (blank falls back to the global default), proxy URLs may embed
user:pass@credentials, and the HTTP pool was rebuilt onSocketsHttpHandlerwith connection-lifetime and keep-alive tuning plus a one-shot retry on transient failures, so flaky indexers and authenticated proxies behave. (be18f22, c23fec1, 43548ff, 3920eaf) - Smarter search profiles. Movies and TV now get independent fallback modes and thresholds, series results are filtered against the canonical title (
FilenameMatcheridentity verification) to cut cross-show false positives, and Watchtower's already-verified pick is boosted to the top of the candidate list when present. (16fecb2, c1c8619, b258aca, b460138)
Features
- Watchtower engine: source-agnostic wanted-set built from a three-loop background service (sync, resolve, keep-fresh) over new
ListSource/WantedItemmodels, warmingPreflightCachewith the verified winner soProfilePlayControllerhits it instantly; bounded by an active warm-set cap, daily resolve budget, and per-resolve grab cap, and reusingIndexerHitTracker/NewznabRateLimiterfor the same per-indexer safety as the watchdog. (abd53d5, 75b16e5, 165dc16, 10b8339) - Watchtower sources & series: manual IMDb add, Stremio catalog discovery (
WatchtowerDiscoverControllerparses addon manifests), URL/JSON lists, and whole-series expansion via TVmaze withseries-scopebounding, finished seasons warmed as a single season bundle, and aseason-bundle-fallbackto per-episode warming. (c5bdc0f, 3b89593, 100eee3, 9d755f2) - Warden backup:
WardenBackupServicepushes a compressed.ndjson.gzof your list (local or merged scope) to a GitHub repo on a 1–30 day schedule with content-hash dedup, plus manual back-up-now and restore from the Warden settings. (3eff1cd, b4f443c, b97ab5b) - Warden remote sources:
WardenRemoteSourceServicetracks multiple remote fingerprint URLs, each with its own trust level, enable toggle, ETag-cached refresh on a 1–720 hour cadence, and manual refresh; bulk import/export of the source set as a JSON bundle. (567ed2d, 0733c63, 1bc001d) - Warden import/export & scope: import
.ndjson/.ndjson.gzmerged or as separate sources, export local or merged-and-deduped, gzip on the wire, drag-and-drop in the UI, and awarden.backbone-scopetoggle that applies remote/imported sources only when their backbone provider (matched byRootDomain) is one of yours. (125e975, 7b159a5, 631b755, 799c38e) - Indexer user agents & proxy: separate
SearchUserAgent/RetrieveUserAgentper indexer with global fallback,AddUrlRequesthonoring per-indexer agent and proxy, and clearer settings guidance. (be18f22, c23fec1, 43548ff, 98d20fb) - Search profile fallback: independent movie/TV fallback modes with their own minimum-result thresholds (legacy single-threshold config auto-migrated), with per-indexer query estimates surfaced in the fallback help text. (16fecb2, c1c8619, 12985ad)
Performance & reliability
- Fast seek in
NzbFileStream: estimate the target segment from file size and probe yEnc headers instead of scanning, so in-file seeks land quickly. (9d72a08) DavMultipartFileStreamresolves trailing RAR volumes in the background so the first read returns on byte 0 immediately, with on-demand resolution covering later seeks and pre-warm errors never breaking a read. (fa9f8a8)- Separate on-demand-read and queue connection semaphores in
DownloadingNntpClient/MultiConnectionNntpClient, so queue work no longer competes with on-demand reads against the provider connection limit. (02976ae) NzbFetchCoalescerdeduplicates concurrent NZB downloads by URL andPlayResolutionCoalescercollapses concurrent resolves of the same content, cutting redundant indexer fetches and duplicate work during request bursts. (0b7436e, 963e92b)NewznabClientretries once on transient network errors, and theSocketsHttpHandlerpool adds keep-alive probing to detect dead peers faster. (3920eaf)- Disable SQLite connection pooling in
DavDatabaseContextto avoid concurrency stalls under load. (e2ba41c) - Stremio catalog fetching paginates (deduping by
type:id, with a page ceiling and item cap) so large lists enumerate fully. (1cd7da4) - Tighter read verification with per-segment STAT timeouts that release a stalled provider connection. (8a9ec1a, 2c4c9b9)