An async Python proxy that sits between Radarr/Sonarr and Prowlarr to detect Danish subtitles and audio tracks. It scans release titles and NFO files from Usenet indexers, adding surgical tags to release titles so Radarr/Sonarr custom formats can automatically prioritize Danish releases.
Many Usenet indexers don't correctly tag Danish/Nordic subtitles or audio in their metadata. Radarr and Sonarr miss high-quality Danish releases because Danish isn't in the title. This proxy fixes that by:
- Title scanning: Instantly tags releases with
NORDiC,DANISH,DANSK, etc. in the title - NFO deep scan: Downloads and parses NFO/MediaInfo files for releases that don't advertise Danish in the title — catches multi-language releases with hidden Danish tracks
- Smart caching: SQLite cache remembers results (positives forever, negatives 6h), so each release is only fetched once
- Background processing: Returns tagged results in ~5 seconds; remaining NFO fetches continue in the background for the next poll
| Tag | Meaning |
|---|---|
[DKSubs:Title] |
Danish subtitles detected from the release title |
[DKAudio:Title] |
Danish audio detected from the release title |
[DKSubs:NFO] |
Danish subtitles found in the NFO/MediaInfo file |
[DKAudio:NFO] |
Danish audio found in the NFO/MediaInfo file |
git clone https://github.com/unknown0152/dksubs-proxy.git
cd dksubs-proxy
bash setup-proxy.shThe setup script auto-discovers your Prowlarr/Radarr/Sonarr containers, extracts real API keys from Prowlarr's database, configures networking, starts the proxy, and syncs all Arr indexers to route through the proxy.
After setup: In Radarr/Sonarr, the DKSubs custom format is created automatically with a score of 10,000 in Danish/Nordic/Mandatory quality profiles.
Radarr/Sonarr → dksubs-proxy:9699/{indexer_id} → Prowlarr → NZB Indexer
↓
[Scans titles + fetches NFOs]
↓
Returns tagged RSS to Radarr/Sonarr
NFO fetching uses two stages per release:
- Prowlarr's
t=getnfoproxy (usually returns error 202 — most indexers don't support it via Prowlarr) - Direct call to the indexer's own API using real API keys extracted from Prowlarr's database
Background model: The proxy returns partial results (title hits + fast NFO fetches) within 5 seconds. Slow NFO fetches continue in the background and populate the cache for the next poll.
All variables are written to .env by setup-proxy.sh. You can override them manually:
| Variable | Default | Description |
|---|---|---|
PROWLARR_URL |
http://Prowlarr:9696 |
Prowlarr internal URL |
PROWLARR_API_KEY |
(required) | Prowlarr API key |
NFO_INDEXERS |
auto-detected | Comma-separated Prowlarr indexer IDs for NFO scanning |
INDEXER_{id}_APIKEY |
auto | Real API key for indexer (from Prowlarr's SQLite DB) |
INDEXER_{id}_BASEURL |
auto | Base URL for indexer |
NFO_TIMEOUT |
5.0 |
Foreground NFO fetch budget in seconds |
NFO_DIRECT_RATE_CALLS |
8 |
Max direct NFO API calls per rate window |
NFO_DIRECT_RATE_WINDOW |
10 |
Rate limit window in seconds |
CACHE_TTL_NEGATIVE |
21600 |
Seconds before a "no Danish" result is retried (6h) |
DEBUG_LOGGING |
0 |
Set to 1 for verbose logs |
# Live logs
docker logs -f dksubs-proxy
# Health check
curl http://dksubs-proxy:9699/health
# Metrics (JSON)
curl http://dksubs-proxy:9699/metricsMetrics include: requests_total, hunt_total, dk_hits, nfo_fetches, nfo_direct_fetches, nfo_direct_hits, cache_hits, cache_misses.
bash setup-proxy.sh && docker compose up -dDirect NFO API calls are rate-limited per indexer (default: 8 requests/10s). For indexers with stricter limits, add to .env:
INDEXER_{id}_RATE_CALLS=5
INDEXER_{id}_RATE_WINDOW=10
For indexers with very strict limits (e.g. 300 calls/5 min):
INDEXER_{id}_RATE_CALLS=250
INDEXER_{id}_RATE_WINDOW=300
MIT — built for the home-lab community.