You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Inspiration:am385/lineup — a .NET app for physical HDHomeRun tuners with Blazor dashboard, TUI, SQLite EPG cache, incremental guide fetch, and ffmpeg HLS/fMP4 transcoding profiles.
IPTV Tunerr’s mission stays IPTV/Xtream → HDHR-shaped bridge for Plex/Emby/Jellyfin. This epic adds optional operator-grade surfaces and hardware-adjacent paths that Lineup highlights, without replacing Tunerr’s core value.
North star
Hardware path: Optionally ingest real SiliconDust HDHomeRun lineups and EPG (LAN discovery + HTTP/API), alongside existing M3U/Xtream flows, so one binary can serve hybrid deployments.
Operator path: Provide a web dashboard (settings, guide preview, health, stream smoke) so fewer tasks require CLI + logs alone.
Persistence path: Move long-lived EPG/guide data toward a SQLite model (retention, incremental windows, expiry) while keeping current XMLTV outputs correct for media servers.
Playback path: Offer named transcoding profiles (e.g. mobile / 720p / bandwidth tiers) producing HLS and/or fMP4 where today the stack is TS/HLS-relay-centric.
Non-goals
Rewriting Tunerr in .NET or abandoning the single Go binary story.
Matching Lineup feature-for-feature on day one (TUI, duplicate Blazor stack, etc.).
Promising perfect feature parity with Silicondust firmware or every HDHR model before validation.
Replacing Plex’s Live TV UI or becoming a full media server.
Relationship to existing code
Area
Already in repo
Epic extends
HDHomeRun
internal/hdhomerun/ — virtual discovery/server side for Plex compatibility
Client to real devices: discovery, lineup fetch, optional guide from device/API
Two+ transcode profiles with stable names in config/env; HLS or fMP4 path exercised in scripts/verify or integration test.
Implementation status (repo snapshot)
LP-001 (MVP shipped):internal/hdhomerun implements DiscoverLAN (UDP broadcast + optional IPTV_TUNERR_HDHR_DISCOVER_BROADCASTS IPv4 and literal IPv6 on UDP6), ParseDiscoverReply, FetchDiscoverJSON, FetchLineupJSON, FetchGuideXML. Operators run iptv-tunerr hdhr-scan (LAN discovery or -addr http://device). Remaining: polish (extra multicast defaults) and LP-002 merge semantics if catalog rules evolve.
LP-002 / LP-003 (shipped):IPTV_TUNERR_HDHR_LINEUP_URL at index time; IPTV_TUNERR_HDHR_GUIDE_URL runtime /guide.xml merge — see Current status below and ADR 0002 / ADR 0004.
LP-007–LP-009 (shipped):internal/epgstore, incremental/overlap upsert knobs, retention/VACUUM/max-bytes, GET /guide/epg-store.json — ADR 0003. Remaining optimization: provider pulls still download the fullxmltv.php body when panels omit ETag / Last-Modified (conditional GET + IPTV_TUNERR_PROVIDER_EPG_DISK_CACHE helps when validators exist); IPTV_TUNERR_PROVIDER_EPG_INCREMENTAL + horizon tokens reduce SQLite churn for windowed panels — see features §5 / cli-and-env.
LP-010 / LP-011 (shipped core): Hardware-style profile aliases + IPTV_TUNERR_STREAM_PROFILES_FILE + preferred output_mux (mpegts / fmp4 / packaged hls) + native ?mux=hls|dash + X-IptvTunerr-Native-Mux. Named profiles can now drive a short-lived ffmpeg-generated HLS playlist/segment packager served back through Tunerr. Remaining depth is polish/tuning, not a missing product mode.
LP-004–LP-006: Dashboard + /ui/ live in internal/webui + tuner JSON; iterative hardening continues with EPIC-live-tv-intelligence (e.g. intelligence.autopilot on /provider/profile.json).
ADR in PR-1; default lean: tagged source so channels don’t collide blindly
Web auth
mTLS / token / localhost-only
localhost-only first, token optional
SQLite
Single file path vs per-instance
IPTV_TUNERR_EPG_SQLITE_PATH-style single file
Profiles
Env list vs YAML
Env + JSON file consistent with supervisor patterns
Current status
PR-1: LP-001 discovery; LP-002 — IPTV_TUNERR_HDHR_LINEUP_URL merges device lineup.json at index time (IPTV_TUNERR_HDHR_LINEUP_ID_PREFIX); imported rows are source-tagged and no longer dropped just because an IPTV row already uses the same tvg_id; ADR 0002; how-to hybrid HDHR+IPTV.
PR-6: LP-008/LP-009 — SQLite sync, retain/VACUUM/max-bytes, /guide/epg-store.json. Provider EPG: disk cache + conditional GET (IPTV_TUNERR_PROVIDER_EPG_DISK_CACHE), horizon/incremental URL suffixes (IPTV_TUNERR_PROVIDER_EPG_INCREMENTAL), overlap upsert — see features §5. Full body download each refresh still happens when upstream omits validators; replacing that needs provider-specific contracts.
PR-7: LP-010/LP-011 — profiles + ffmpeg TS default; optional ?mux=fmp4 (transcode). Update (2026-03): Tunerr-native HLS playlist proxy via ?mux=hls (rewrite + proxy) plus named-profile ffmpeg-generated HLS packaging (output_mux: "hls") served through Tunerr session URLs.
EPIC-live-tv-intelligence.md — Dashboard should surface channel intelligence and guide-confidence outputs where available (INT-*).
memory-bank/work_breakdown.md — Do not start LP-* work until stories are pulled into an active PR plan; keep HR-* / INT-* / REC-* scopes from thrashing.