A PeerTube client for Android TV.
Find a file
Jeena c19024355c player: Usable D-pad controls when paused
The paused state was unusable (#4): the semi-transparent info overlay
covered the seek line, and the key handler kept owning CENTER/LEFT/RIGHT
(they toggled/seeked directly), so the transport buttons could never be
selected at all.

Replace it with a SmartTube-style pause screen: a big seek bar above an
info bar (never covered again — the panel below it is near-opaque) and
focusable Back 10 s / Play / Forward 10 s buttons. While paused the
arrows pick a control and OK activates it; the bar itself scrubs ±10 s
with arrows and OK starts playback. Focus moves into the overlay on
pause (Play button) and back to the plain key handler on resume, so
while playing, OK still toggles pause and LEFT/RIGHT still seek.

Refs #4
2026-10-12 09:54:58 +00:00
app player: Usable D-pad controls when paused 2026-10-12 09:54:58 +00:00
docs docs: Agent container emulator workflow 2026-10-12 09:42:08 +00:00
gradle app: Scaffold Android TV PeerTube client (MVP) 2026-10-10 10:20:02 +00:00
scripts docs: Agent container emulator workflow 2026-10-12 09:42:08 +00:00
.gitignore docs: Drop instance-specific storage-security notes 2026-10-12 00:27:08 +00:00
AGENTS.md docs: Agent container emulator workflow 2026-10-12 09:42:08 +00:00
BACKLOG.md docs: Remove the test account name from the public repo 2026-10-12 00:33:42 +00:00
build.gradle.kts app: Scaffold Android TV PeerTube client (MVP) 2026-10-10 10:20:02 +00:00
gradle.properties app: Scaffold Android TV PeerTube client (MVP) 2026-10-10 10:20:02 +00:00
gradlew app: Scaffold Android TV PeerTube client (MVP) 2026-10-10 10:20:02 +00:00
gradlew.bat app: Scaffold Android TV PeerTube client (MVP) 2026-10-10 10:20:02 +00:00
LICENSE license: Adopt GPL-3.0-or-later 2026-10-12 00:41:17 +00:00
README.md docs: Real screenshots 2026-10-12 03:06:15 +00:00
settings.gradle.kts app: Scaffold Android TV PeerTube client (MVP) 2026-10-10 10:20:02 +00:00
TESTS.md docs: Remove the test account name from the public repo 2026-10-12 00:33:42 +00:00

JTube TV

The JTube TV logo, a little orange TV

JTube TV is an Android TV app for PeerTube. It puts a PeerTube instance on the big screen the way SmartTube puts YouTube there: browse from the couch, play with the remote, nothing else in the way.

It talks to any PeerTube instance over the REST API. The default is tube.jeena.net, my own instance, where most videos are private family uploads. Signing in matters because "My videos" shows them all, privacy levels included.

What it looks like

Screenshots come from a demo instance serving real, CC-licensed open-movie content, courtesy of the Blender Foundation movies and the A propos de PeerTube channel. All of it plays in the app.

The home screen. Continue watching picks up at the position the server saved, new videos first, page after page.

Home screen with Continue watching and New videos rows

A slide-in drawer opens with the left D-pad button. My videos shows your own uploads, every privacy level included, with a badge on anything not public.

Menu drawer with the destinations

My videos grid with Private and Internal badges

Channels, one row per owner, with video and play counts on every card.

Channels screen with channel cards

The player speaks remote: play and pause, seek back and forward, a seek bar with position and duration. Watching is reported to the server every 20 seconds, so where you left off survives the app.

Player with controls, seek bar and title

What it does in v0.1

  • Sign in once. The app exchanges your username and password for OAuth tokens and stores only those, encrypted with the Android Keystore. The password itself is never kept.
  • Home with Continue watching and New videos.
  • Browse the instance's public videos, and search them by title.
  • My videos: every video you own, private, internal and unlisted included.
  • Channels: local channels with their videos, plus your subscriptions and your server-side watch history.
  • Player: HLS, with a progressive MP4 fallback, resume from the saved position, and watching reports.

What it deliberately does not do (yet, or ever): uploading, editing, deleting, managing subscriptions. That's tracked in BACKLOG.md.

Build

Requirements: JDK 17 or newer (21 recommended) and an Android SDK with platform 35. The Gradle wrapper is checked in, so no local Gradle install is needed.

./gradlew :app:assembleDebug

Then put it on the TV:

adb connect <tv-ip>:<port>
adb install -r app/build/outputs/apk/debug/app-debug.apk

Architecture

A single-module app, deliberately small:

  • data/api — Retrofit interface and kotlinx-serialization DTOs for the PeerTube API.
  • data/auth — TokenStore, the encrypted preference storage for tokens.
  • data/network — OkHttp/Retrofit wiring: dynamic base URL, bearer token interceptor, single-flight token refresh.
  • data/PeerTubeRepository.kt — one suspend-call surface for the whole UI.
  • ui/ — Compose for TV screens, one for each of the destinations above.
  • No DI framework, no database. The service locator is AppGraph.

License

JTube TV is free software under GPL-3.0-or-later.