# Whisparr

Adult content collection manager (Arr-suite).

## Service Info

| Property | Value |
|----------|-------|
| **Host** | Atlantis (`192.168.0.200`) |
| **URL** | `http://192.168.0.200:6969` |
| **Portainer stack** | `atlantis-arr-stack` (stack ID 696, env 2) |
| **Compose file** | Portainer-managed — `/volume2/metadata/docker/portainer/compose/696/v1/docker-compose.yml` on Atlantis |
| **Config volume** | `/volume2/metadata/docker2/whisparr` |
| **Image** | `ghcr.io/hotio/whisparr:nightly` |

## Download Clients

| Client | Type | Status | Notes |
|--------|------|--------|-------|
| **SABnzbd** | Usenet | ✅ Enabled | `192.168.0.200:8080`, remote path: `/data/complete/` → `/sab/complete/` |
| **Deluge** | Torrent | ✅ Enabled | `192.168.0.200:8112` (web UI behind gluetun VPN), password: "REDACTED_PASSWORD" <!-- pragma: allowlist secret --> |

### Deluge notes
- Runs behind **gluetun** VPN container (network_mode: container) — ports exposed via gluetun
- No Label plugin installed — category field must be left empty
- Downloads to `/downloads/complete/` on Atlantis → mapped to `/torrents/complete/` in Whisparr
- Compose volume added 2026-03-18: `/volume2/torrents/complete:/torrents/complete`
- Remote path mapping: `192.168.0.200: /downloads/complete/` → `/torrents/complete/`

### SABnzbd API key sync
If SABnzbd restarts or is reinstalled, its API key may change. Update in Whisparr:
**Settings → Download Clients → SABnzbd → API Key**

Or via API:
```bash
# Get current SABnzbd API key
ssh atlantis "grep -oP '(?<=^api_key = )[^\s]+' /volume2/metadata/docker2/sabnzbd/sabnzbd.ini"
```

## Root Folder

`/data/media/misc` (46TB free as of 2026-03-18)

## Import Path Mappings

| Host | Remote Path | Local Path (in container) | Purpose |
|------|------------|--------------------------|---------|
| `192.168.0.200` | `/data/complete/` | `/sab/complete/` | SABnzbd usenet downloads |
| `192.168.0.200` | `/downloads/complete/` | `/torrents/complete/` | Deluge torrent downloads |

## Troubleshooting

### `downloadClientUnavailable` in queue
Happens when SABnzbd or Deluge restarts. Items stay stuck until cleared manually.

Clear all stuck items:
```bash
WHISPARR_KEY=$(ssh atlantis "cat /volume2/metadata/docker2/whisparr/config.xml | grep -oP '(?<=<ApiKey>)[^<]+'")
python3 -c "
import requests
s = requests.Session()
s.headers.update({'X-Api-Key': '$WHISPARR_KEY'})
q = s.get('http://192.168.0.200:6969/api/v3/queue').json()
for item in q.get('records',[]):
    if item['status'] == 'downloadClientUnavailable':
        s.delete(f'http://192.168.0.200:6969/api/v3/queue/{item[\"id\"]}?removeFromClient=true&blocklist=false')
        print('Cleared:', item['title'][:50])
"
```

### Import fails after adding Deluge
Whisparr must have `/volume2/torrents/complete` mounted and a remote path mapping configured.
Check mounts: container must have `/torrents/complete` volume.
Check mappings: **Settings → Download Clients → Remote Path Mappings**.

### Deluge Label plugin error
If Whisparr reports "Label plugin not enabled" — leave the **Category** field blank in the Deluge download client config. The Label plugin egg exists but doesn't load in the linuxserver.io image.

**Last updated:** 2026-03-18
