A Tvheadend client for jailbroken PlayStation 5 consoles where the majority of the source code was generated by Claude.ai (including this readme).
It speaks HTSP directly — no transcoding proxy, no browser — and decodes the stream with FFmpeg, so live TV and recordings play from the same connection that carries the channel list and the guide.
- Live TV — channel list with now/next and a progress bar, full programme guide per channel, full-screen playback with channel zapping.
- Scheduling — record any programme from the guide with one button
- Recordings — browse everything the DVR holds, play it back, and cancel or delete entries.
- Playback of recordings over HTSP, using the server's file API.
- Multiple servers — save as many as you like and switch between them without restarting.
- Designed for a 1920x1080 screen at couch distance: large type, high contrast, and a single unmistakable focus colour.
tvhp can be driven from a DualSense pad, from an HDMI-CEC remote control, or
from a USB keyboard. The PS5 port of SDL2 reports the remote as keyboard keys,
so all three devices meet in one table (src/keymap.h) and every command is
reachable from any of them.
| Command | Pad | Remote | Keyboard |
|---|---|---|---|
| Navigate | D-pad | D-pad | Arrows |
| Page up / down | L1 / R1 | P+ / P- | Page Up / Page Down |
| Select, record, play/pause | Cross | Enter | Enter |
| Back, cancel | Circle | Back | Escape, Backspace |
| Guide ↔ recordings, info bar | Square | Display | Tab |
| Delete recording or server | Triangle | Red | Delete |
| Add a server | Options | Menu | Insert |
| Jump to the guide | — | Guide | F9 |
| Play / pause | Cross | Play, Pause | Space |
| Stop | Circle | Stop | — |
| Seek ±5 min | Up / Down | Rewind, Fast forward | — |
| Seek ±30 s | Left / Right | — | Left / Right |
The remote's table is fixed by SDL, so it decides the key identifiers and the pad is mapped onto them rather than the other way round. That is why Circle is Escape rather than Backspace, and why Square is Tab rather than Space: the remote's back button sends Escape, and its play/pause button sends Space.
- A jailbroken PS5 running ps5-payload-dev/websrv or an equivalent homebrew launcher.
- A Tvheadend server reachable on your network, with an HTSP user. The default HTSP port is 9982.
- HTSP protocol version 8 or later for recording playback.
tvhpannounces version 35; anything Tvheadend 4.2 or newer is comfortably sufficient.
Download TVHP.zip from the releases page and unpack it into its
own folder under /data/homebrew on the console, so you end up with:
/data/homebrew/TVHP/
├── tvhp # the payload
├── homebrew.js # tells the launcher what to run
├── assets/ # RML documents, stylesheets, icons
├── fonts/
└── sce_sys/
└── icon0.png
TVHP then appears in the Homebrew Launcher. Copying the folder over FTP or
onto USB both work, depending on how your launcher is set up.
- Channel icons are fetched from the server but not displayed yet.
- Only programme-based recording is exposed. The client can also schedule a
manual time range (
HtspClient::RecordTimespan), but nothing in the UI calls it. - No series recording:
autorecandtimerecrules are neither listed nor editable. - No transcoding profile selection; the server's default is used.
- Rebuilding the resampler at a mid-stream audio format change discards a few milliseconds, so there can be a very brief gap at, for example, an ad break.
