Skip to content

davex 1.2.0

Latest

Choose a tag to compare

@qooode qooode released this 16 Jun 22:48

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

  1. 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-only by 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 full watchtower.* tuning surface. (abd53d5, c5bdc0f, 75b16e5, 100eee3, b258aca)
  2. 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)
  3. 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 on SocketsHttpHandler with 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)
  4. Smarter search profiles. Movies and TV now get independent fallback modes and thresholds, series results are filtered against the canonical title (FilenameMatcher identity 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/WantedItem models, warming PreflightCache with the verified winner so ProfilePlayController hits it instantly; bounded by an active warm-set cap, daily resolve budget, and per-resolve grab cap, and reusing IndexerHitTracker/NewznabRateLimiter for the same per-indexer safety as the watchdog. (abd53d5, 75b16e5, 165dc16, 10b8339)
  • Watchtower sources & series: manual IMDb add, Stremio catalog discovery (WatchtowerDiscoverController parses addon manifests), URL/JSON lists, and whole-series expansion via TVmaze with series-scope bounding, finished seasons warmed as a single season bundle, and a season-bundle-fallback to per-episode warming. (c5bdc0f, 3b89593, 100eee3, 9d755f2)
  • Warden backup: WardenBackupService pushes a compressed .ndjson.gz of 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: WardenRemoteSourceService tracks 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.gz merged or as separate sources, export local or merged-and-deduped, gzip on the wire, drag-and-drop in the UI, and a warden.backbone-scope toggle that applies remote/imported sources only when their backbone provider (matched by RootDomain) is one of yours. (125e975, 7b159a5, 631b755, 799c38e)
  • Indexer user agents & proxy: separate SearchUserAgent/RetrieveUserAgent per indexer with global fallback, AddUrlRequest honoring 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)
  • DavMultipartFileStream resolves 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)
  • NzbFetchCoalescer deduplicates concurrent NZB downloads by URL and PlayResolutionCoalescer collapses concurrent resolves of the same content, cutting redundant indexer fetches and duplicate work during request bursts. (0b7436e, 963e92b)
  • NewznabClient retries once on transient network errors, and the SocketsHttpHandler pool adds keep-alive probing to detect dead peers faster. (3920eaf)
  • Disable SQLite connection pooling in DavDatabaseContext to 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)

Documentation

  • Add docs/watchtower.md documenting the design, sources, safety model, and full watchtower.* configuration. (48c0b72)
  • Document IPv6 support in the README and setup guide, and extend the Docker CI workflow to mirror images to Docker Hub. (1879dd1)