Skip to content

kdklv/pond

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

55 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PondTV

A Raspberry Pi that boots into a fullscreen video channel. Plug in a USB drive, it plays. No apps, no accounts, no menus.

Your folder structure is the channel guide. Up/down arrows switch channels, left/right scrubs. Swap USB drives like tapes — each one carries its own watch state, so a drive works on any RPI running PondTV. Pull the power when you're done.

How it works

One long-lived mpv process, fullscreen over DRM/KMS — no desktop, no X11. Channel switches are a socket message, not a new process, so they're instant.

Channels from folders. The first folder under a top-level category is a channel; everything deeper collapses into it. Loose files in a category are one channel. Natural sort keeps episode ordering sane. The list is derived on every mount, never stored.

State on the USB. A .pondtv/ directory at the drive root holds resume positions and seen flags, keyed by relative path. Writes are atomic (temp → fsync → rename) and infrequent. The RPI's OS can run on a read-only overlay root, so hard power-off can't brick either side.

Full architecture in docs/PLAN.md.

Media layout

USB_DRIVE/
├── Movies/
│   └── The Film/
│       ├── The Film.mkv
│       └── The Film.srt          ← same name = auto-subtitles
├── TV_Shows/
│   └── ShowName/                 ← whole show = one channel
│       ├── Season 01/
│       │   ├── S01E01.mp4
│       │   └── S01E02.mp4
│       └── Specials/
├── Ripped YT/                    ← loose files = one channel
│   ├── Video 01.mp4
│   └── Video 02.mp4
└── Selections/                   ← hand-picked mix = one channel

Controls

Key Action
Space / Enter Play / Pause
← / → Seek 10s (hold = rewind / fast-forward)
A / D Previous / next video in channel
↑ / ↓ Change channel
Backspace Restart video
S Mark seen (skip to next)
T Trailer mode (skip to unwatched)
B Browser — channel & episode guide

In the browser: ↑/↓ move the cursor, (or D / Space) drills into a channel or plays the highlighted episode, (or A / Backspace) goes back, S toggles seen, B closes. The list shows a · against watched episodes and a seen/total count per channel.

Input is abstracted behind an action enum — HDMI-CEC or a GPIO rotary encoder can plug in later.

Setup

RPI 4, RPI OS Lite (64-bit), USB drive with media.

sudo apt install -y mpv python3 python3-venv python3-pip exfatprogs ntfs-3g
python3 -m venv .venv && . .venv/bin/activate && pip install -e .
sudo python3 -m pondtv

Install as a boot service:

sudo cp packaging/pondtv.service /etc/systemd/system/ && sudo systemctl enable --now pondtv

See docs/DEVELOPMENT.md for RPI setup details, running mpv from SSH, and testing without a real USB drive.

Configuration

Optional config.yml, layered: defaults → machine (/etc/pondtv/ or ~/.config/pondtv/) → per-drive (.pondtv/config.yml on the USB) → env vars. Later wins. See packaging/config.example.yml.

trailer_default: false
seek_seconds: 10.0
allow_quit: true

Roadmap

  • Sleep timer — clean shutdown on a timer
  • Smart-seen — auto-mark watched when leaving near the end
  • HDMI-CEC input — use the TV's remote
  • GPIO channel knob — rotary encoder as a physical channel dial
  • Prebuilt OS image — flashable SD card, ready to boot

License

MIT

About

Pond: A minimalist, offline media player for Raspberry Pi. Turn your USB drive into a personal dumb-TV channel with instant playback and smart playlists.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Contributors

Languages