No description
Find a file
Natalie e2977041aa feat: PlumTV — native macOS player with config-driven hosts
Phase 0/1: SwiftUI app (XcodeGen), PlumTVCore framework, player MVP.
- PlayerTarget protocol + VLCTarget (HTTP) and BlackTVTarget (ssh black-tv)
- config-driven hosts (~/.config/plumtv/hosts.json), seeded plum-vlc + black
- reliability: SSH ControlMaster (5s->~1s/poll), endpoint pinning (LAN->overlay),
  single-flight polling, keep-last-known on transient failure, debounced volume
- Hosts pane shows live connection state; Player has target picker + transport
- unit tests for status decoding

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 20:24:55 -07:00
Sources feat: PlumTV — native macOS player with config-driven hosts 2026-06-07 20:24:55 -07:00
Tests/PlumTVCoreTests feat: PlumTV — native macOS player with config-driven hosts 2026-06-07 20:24:55 -07:00
.gitignore feat: PlumTV — native macOS player with config-driven hosts 2026-06-07 20:24:55 -07:00
project.yml feat: PlumTV — native macOS player with config-driven hosts 2026-06-07 20:24:55 -07:00
README.md feat: PlumTV — native macOS player with config-driven hosts 2026-06-07 20:24:55 -07:00

PlumTV

Native macOS app (SwiftUI) for the home media stack on plum. Unifies what was previously CLI/MCP-only: pick a playback target (plum's VLC or the HDMI TV on black) and drive transport; later phases add a cached library browser, a download searcher/manager, and a local (MLX) filename→metadata pipeline.

Hybrid architecture: the control plane is native Swift (SSH shell-outs to the deployed black-tv script; HTTP to VLC's Lua interface — zero new runtime deps); the data-heavy plane reuses existing projects (plum-control-mcp, media-recommender) as helper subprocesses. See the build plan for phases.

Build

brew install xcodegen        # if not already present
xcodegen generate            # project.yml -> PlumTV.xcodeproj
xcodebuild -scheme PlumTV -destination 'platform=macOS' build
# or open PlumTV.xcodeproj in Xcode and Run

PlumTV.xcodeproj is generated and git-ignored — project.yml is the source of truth.

Layout

  • Sources/PlumTVCore/ — framework: models, PlayerTarget protocol + impls, target selector.
  • Sources/PlumTV/ — SwiftUI app (App, RootView, feature views).
  • Tests/PlumTVCoreTests/ — unit tests for the core (status decoders, mappings).

Targets

  • Plum VLC — HTTP to http://127.0.0.1:8080/requests/… (password from ~/.config/portable-net-tv/config.json or $VLC_HTTP_PASSWORD).
  • Black TVssh lilith@10.9.0.4 /usr/local/bin/black-tv <verb> (the overlay IP; the LAN address flaps). All playback intelligence lives in black-tv on black.