Google TV IPTV client for Dispatcharr
  • Kotlin 88.3%
  • HTML 6%
  • Shell 3.1%
  • Python 2.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
be-nj 196e0e2b88
All checks were successful
Build TV app / build (push) Successful in 3m27s
Release 0.25.0
2026-10-15 00:31:25 +02:00
.github/workflows CI: point the tool cache at the Forgejo runner's whitelisted path 2026-10-11 17:51:33 +02:00
app Release 0.25.0 2026-10-15 00:31:25 +02:00
docs README: generic group names in screenshots, consistent captions 2026-08-26 01:55:15 +02:00
gradle/wrapper Bootstrap Castarr from NodeCast prototype 2026-08-25 00:09:00 +02:00
tests Show only the logo on service tabs, order the main groups, add Sky Cinema, MagentaSport and RTL 2026-10-15 00:29:13 +02:00
tools New look: night blue, cyan and coral, with the ring-and-play mark 2026-10-11 20:04:29 +02:00
.gitignore Show crests and league sections when picking a club 2026-08-26 11:42:18 +02:00
build.gradle.kts Compose for TV UI, generic + Dispatcharr sources, device-flow login, favorites, stream profiles, richer remote 2026-08-25 01:35:48 +02:00
CONTEXT.md Emulator helper so tests start in seconds, not minutes 2026-08-26 13:29:33 +02:00
gradle.properties Bootstrap Castarr from NodeCast prototype 2026-08-25 00:09:00 +02:00
gradlew Bootstrap Castarr from NodeCast prototype 2026-08-25 00:09:00 +02:00
gradlew.bat Bootstrap Castarr from NodeCast prototype 2026-08-25 00:09:00 +02:00
README.md chore: point image and repo paths at the new Forgejo location [skip ci] 2026-09-13 12:26:03 +02:00
settings.gradle.kts Rename app to Castarr (dev.castarr.tv), add JDK toolchain resolution 2026-08-25 00:17:59 +02:00

Castarr

Live-TV auf dem Fernseher, eingerichtet in einer Minute — alles läuft übers Handy.

Castarr ist eine App für Google TV / Android TV. Auf dem Fernseher muss nie etwas getippt werden: Zum Einrichten scannt man einmal einen QR-Code mit dem Handy, meldet sich dort an — fertig. Danach zappt man mit der normalen TV-Fernbedienung oder steuert alles bequem vom Handy aus.

Senderliste Player
Senderliste Player
Nummerntasten Einrichtung
Nummerntasten Willkommens-Bildschirm

Was die App kann

  • Senderliste mit Logos und Programm — was gerade läuft, wie lange noch, was danach kommt. Gruppen und Favoriten links, Sender rechts.
  • Zappen wie früher — Nummerntasten auf der Fernbedienung schalten direkt um (mit großer Anzeige, welcher Sender gleich kommt), hoch/runter blättert durch die Sender.
  • Aufgeräumter Player — OK-Taste zeigt Sendung, Zeiten und Fortschritt, dazu Pause/Stopp-Buttons und Tonspur-Wahl, wenn der Sender mehrere hat. Blendet sich von selbst wieder aus.
  • Handy als Fernbedienung — QR-Code in den Einstellungen scannen, schon hat man Senderliste, Suche, Lautstärke und Favoriten im Handy-Browser. Keine App-Installation nötig.
  • Favoriten — OK auf einem Sender gedrückt halten, Stern gesetzt. Die Favoriten gelten pro Person und sind auf jedem Gerät dieselben.
  • Updates aus der App heraus — unter Einstellungen → App genügt ein Klick, wenn eine neue Version bereitsteht.

Installation auf dem Fernseher

  1. Auf dem Google TV die App Downloader installieren (oder einen anderen Weg nutzen, eine APK-Datei zu öffnen).
  2. Diese Adresse eingeben: git.beckm4nn.net/benjamin/castarr/raw/branch/apk/castarr.apk
  3. Installation bestätigen („Unbekannte Quellen" für Downloader erlauben, wenn der Fernseher fragt).
  4. Castarr starten und den drei Schritten auf dem Bildschirm folgen: QR-Code scannen, auf dem Handy Server angeben und anmelden — den Rest macht der Fernseher.

Danach hält sich die App über den eingebauten Updater selbst aktuell.


Für Technikinteressierte

Native Kotlin-App (Jetpack Compose for TV, Media3/ExoPlayer für HLS und MPEG-TS). Als Backend dient ein Dispatcharr-Fork mit OIDC-Unterstützung: Anmeldung per Device Authorization Grant (der Fernseher zeigt QR + Code, bestätigt wird am Handy beim Identity Provider), API-Zugriff per Bearer-Token, Favoriten und Ausgabeprofile pro Nutzer. Ohne Dispatcharr funktioniert auch jede M3U-Playlist (+ optionales XMLTV) als generische Quelle — ErsatzTV, Threadfin, Tunarr, einfache Playlists. Diese Quelle braucht überhaupt keine Anmeldung.

An einen bestimmten Identity Provider ist nichts gebunden: der Server nennt der App seinen Issuer und die Client-ID, alles Weitere ist Standard (OIDC Discovery, Device Authorization Grant nach RFC 8628). Authentik ist hier nur das, was im Haushalt läuft — Keycloak, Zitadel oder Authelia tun es genauso, solange sie den Device-Flow können.

Die Handy-Fernbedienung serviert der Fernseher selbst (eingebetteter HTTP/WebSocket-Server, Kopplung per QR-Token mit ratenlimitiertem Zahlencode als Fallback). Physische Mediatasten und Google Assistant funktionieren über eine Media3 MediaSession.

Selbst bauen

JDK 17+ und Android SDK (Platform 35) erforderlich; eine passende JDK-Toolchain wird automatisch aufgelöst (foojay).

./gradlew assembleDebug     # Debug-APK
./gradlew assembleRelease   # signiert, wenn CASTARR_STORE_*-Env gesetzt ist

APK-Ausgabe: app/build/outputs/apk/<variant>/. Die Releases hier im Repo sind signiert; über einem Debug-Build muss einmal deinstalliert werden (Signaturwechsel). Updates bezieht die App über die Release-API dieses Repos, die APK selbst liegt auf dem Branch apk.

Tests

./gradlew test          # Unit-Tests, Reports unter tests/runs/
tests/smoke.sh          # Emulator: bauen, starten, durchklicken (~40 s)
tests/smoke.sh --stop   # dasselbe, Emulator danach herunterfahren

tests/smoke.sh baut das Debug-APK, setzt die Demo-Playlist als Quelle, läuft mit dem D-Pad von der Senderliste bis in den Player und schlägt fehl bei Absturz, ANR oder leerer Senderliste. Screenshots und Log landen unter tests/runs/. Nicht abgedeckt: echte Wiedergabe, Onboarding am Handy, Kopplung.

Der Emulator dahinter lässt sich auch einzeln steuern:

tests/helpers/emulator.sh start | stop | status
tests/helpers/emulator.sh install <apk>
tests/helpers/emulator.sh shot <name>

Er startet aus einem Snapshot und ist in wenigen Sekunden oben; stop schreibt den Snapshot vorher neu. Ein Kaltstart entsteht nur, wenn der Snapshot fehlt (AVD castarr-googletv, API 34).

Release

tools/release.sh 0.11.6 --notes notes.md

Bumpt die Version, testet, baut signiert, taggt, schiebt die APK auf den Branch apk und legt das Gitea-Release an. Ohne --notes schreibt es einen Entwurf aus den Commit-Betreffs, den du selbst ausformulierst — Release-Notes erfindet das Skript nicht.

Architektur-Notizen: CONTEXT.md und docs/adr/.