Files
arr-tui/dev
nilsandClaude Opus 5.5 7f6d4d07b9 webOS: a TV app with the views of arr-tui
A TypeScript web app for LG webOS TVs (webOS 5 / Chromium 68 and newer),
driven by the remote: Movies and Series search with the Trakt lists,
Library with status, title and file-property filters and download marks,
seasons and episodes, release search and grab, Downloads, Calendar,
Settings and Log. It talks to Radarr, Sonarr, SABnzbd and Trakt directly
(they answer cross-origin requests); the arr-tui config is baked in at
build time and can be changed on the TV.

dev/screenshots/server.py answers cross-origin requests and accepts writes
for it; webos/dev/drive.mjs drives the app in Chromium for screenshots.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 16:51:48 +01:00
..

Local test instances

Radarr, Sonarr and SABnzbd in containers (same versions as the author's setup), pre-wired together: fixed dev API keys, root folders /media/movies and /media/tv, and SABnzbd registered as the download client in both (categories radarr / sonarr).

dev/up.sh                       # start + configure (idempotent); needs docker/podman compose
go run ./cmd/arr-tui --config dev/config.json
docker compose -f dev/compose.yaml down   # stop; state lives in dev/data (gitignored)
Service URL Port
Radarr http://127.0.0.1:17878 17878
Sonarr http://127.0.0.1:18989 18989
SABnzbd http://127.0.0.1:18080 18080

No indexers or Usenet servers are configured, so nothing actually downloads. To get something into the SABnzbd queue, upload any NZB:

curl -F name=@some.nzb -F cat=radarr \
  "http://127.0.0.1:18080/api?mode=addfile&output=json&apikey=devsabnzbdapikey0000000000000000"

Metadata lookups (search) need internet access, since Radarr/Sonarr query their cloud metadata services.

To get an item into the Radarr (or Sonarr) queue as well, add a movie to Radarr, serve an NZB from the host and push it as a release. Containers reach the host as host.containers.internal:

python3 -m http.server 19191 --bind 0.0.0.0 &     # directory containing some.nzb
curl -H "X-Api-Key: devradarrapikey00000000000000000" -H 'Content-Type: application/json' \
  -d '{"title":"The.Matrix.1999.1080p.BluRay.x264-DEV","downloadUrl":"http://host.containers.internal:19191/some.nzb","protocol":"usenet","publishDate":"2026-01-01T00:00:00Z"}' \
  http://127.0.0.1:17878/api/v3/release/push

Interactive search without a real indexer

dev/fake-indexer.py is a tiny Newznab indexer that returns a fixed set of releases for "The Matrix (1999)" and "Breaking Bad"; Radarr/Sonarr still do their own parsing and approve/reject decisions. Its NZBs are dummies, so grabbed releases just sit in the SABnzbd queue.

python3 dev/fake-indexer.py &    # listens on :19292
dev/add-indexer.sh               # registers it in the dev Radarr and Sonarr

Add the movie / series to the dev instances first (e.g. from the TUI), then press i on it. To test with a real indexer, add it in the dev Radarr/Sonarr web UI (Settings, Indexers) instead of pasting credentials anywhere else.

Screenshots

dev/screenshots/take.sh makes the README screenshots from a fake, made-up library; see screenshots/README.md.