Releases: roto31/StreamTV
Release list
StreamTV v1.3.6
StreamTV v1.3.6
Signed and notarized macOS build of StreamTV.
- Drag StreamTV.app to Applications
- Requires Python 3.10+ on first launch (venv created in ~/Library/Application Support/StreamTV/)
- FFmpeg recommended (install via Homebrew:
brew install ffmpeg)
Web UI remains available at http://localhost:8410 while using the native app.
StreamTV v1.3.5
StreamTV v1.3.5
Signed and notarized macOS build of StreamTV.
- Drag StreamTV.app to Applications
- Requires Python 3.10+ on first launch (venv created in ~/Library/Application Support/StreamTV/)
- FFmpeg recommended (install via Homebrew:
brew install ffmpeg)
Web UI remains available at http://localhost:8410 while using the native app.
StreamTV v1.3.4
StreamTV v1.3.4
Signed and notarized macOS build of StreamTV.
- Drag StreamTV.app to Applications
- Requires Python 3.10+ on first launch (venv created in ~/Library/Application Support/StreamTV/)
- FFmpeg recommended (install via Homebrew:
brew install ffmpeg)
Web UI remains available at http://localhost:8410 while using the native app.
StreamTV v1.3.2
StreamTV v1.3.2
Signed and notarized macOS build. Core platform closure release — all 15 core components brought to production-ready completeness (YouTube, Archive.org, PBS, channels, media, import, builder, playout, FFmpeg, HDHR, WebGUI, docs).
Highlights
Core streaming & sources
- PBS metadata enrichment on
POST /api/media(get_media_infoPBS branch) - Boot-defer channel lists moved to
config.playout(youtube_only_boot_defer,hybrid_boot_defer) - HDHomeRun returns 503 when
ChannelManageris unavailable (no silent fallback) - Bedrock backup script:
scripts/backup_bedrock_snapshot.sh
WebGUI & operator UX
authenticatedFetchon media, playlists, player, logs, dashboard- Media library: add from URL, delete, edit title (
PATCH /api/media/{id}) - Dashboard PBS auth tile + core quick links (Builder, Import, Auth)
- Resources nav: Guides (Markdown), Channel Builder, Import; OpenAPI (Swagger) label
Channel Builder
- Block build when PBS show URLs are not expanded (resolve before build)
Import & docs
/docs/channel_builderand Import vs Builder guide routes fixed- Local path import gated (
security.allow_local_path_import, defaultfalse) - Operator guides: Archive.org, PBS/Playwright, FFmpeg profiles, YouTube geo-blocks, quickstart
API & tests
POST /api/channels/bulk-enabled- HDHR, IPTV, builder, media, import HTTP smoke tests
Install
- Download StreamTV.1.3.2-macos.dmg
- Drag StreamTV.app to Applications
- Requires Python 3.10+ on first launch
- FFmpeg recommended:
brew install ffmpeg - Web UI: http://localhost:8410
Documentation
StreamTV v1.3.1
StreamTV v1.3.1
Highlights
- Channel Builder v2 — Source-first wizard with Playwright auth, PBS show expander, and community source registry
- WebGUI remediation — Settings hub, YAML export/schedule compile bridge, Plex UI cleanup, cache status page
- macOS tree protection — Forbidden-path guards and Linux export tooling (see docs)
Install
- Download
StreamTV.1.3.1-macos.dmg - Drag StreamTV.app to Applications
- Requires Python 3.10+ on first launch (venv in
~/Library/Application Support/StreamTV/) - FFmpeg recommended:
brew install ffmpeg
Web UI: http://localhost:8410
See CHANGELOG for full notes.
StreamTV v1.3.0
[1.3.0] - 2026-07-11
See Docs index · Plex Live TV recovery · Streaming bedrock freeze
Added
- YouTube RAM full-cache (
youtube_full_cache) — Inbufferplayback mode, YouTube VOD can download via yt-dlp tocache_directory(e.g. TunarrRAM) before FFmpeg plays the local file, eliminating googlevideo signed-URL 403 mid-song pauses. Archive.org channels stay CDN-first. Config:youtube_full_cache: true,prefetch_count: 2,download_strategy.enabled: true,youtube_cache_wait_seconds: 120. — 152 classic rock music videos from the Top40Weekly best 80s rock bands ranking (Van Halen through The Cars), expanded with signature MTV-era hits per act; Vevo/official YouTube sources preferred. Artifacts:data/unified/1986.channel.yaml,data/channels_generated_1986.yaml,schedules/1986.yml; builder scriptscripts/create_1986_80s_rock_channel.py - Channel 1991 playlist extension —
scripts/extend_channel_1991.pyadds five YouTube playlists plus Garth Brooks official videos (randomly interleaved), backfills per-videoruntimeindata/unified/1991.channel.yaml, and skips geo-blocked/unavailable entries; channel now has 422 items (was 250) - Channel 1984 Sarajevo exhaustive catalog —
Retro Olympics - 1984 Sarajevo Chronological(222 ABC/Archive.org streams, Feb 8–19); Archive.org day 3/day 5 tapes preferred; Not Just Every Four Years ABC splits; scheduleall: 1984_olympics;scripts/rebuild_1984_sarajevo_sources.py - Channel 1984 Twin Cities time-capsule schedule — Day-by-day Olympics (Feb 8–19) interleaved with weekday ~5PM blocks (KSTP/KARE/WCCO/KMSP local then ABC/CBS/NBC national from TC Media Now + Malg2025) and weekend late news; exact Games-date WCCO Feb 16 5/6pm and KSTP Feb 17 10pm;
scripts/rebuild_1984_local_schedule.py; date gate: local/national/bumpers must match the Olympics coverage day exactly (Feb 8–19 only; no ±1 or month/year fallbacks) - Channels 1988 & 1994 Twin Cities time-capsule schedules — Same day-exact insert model as 1984: Calgary (Feb 13–28) with ABC preview on Feb 12, KSTP + CBS national on matching dates; Lillehammer (Feb 12–27) with WCCO/CBS inserts and Late Show on verified air dates;
scripts/rebuild_1988_local_schedule.py,scripts/rebuild_1994_local_schedule.py - Channel 1998 Nagano Winter Olympics — CBS coverage Feb 7–22: Archive.org day tapes (Days 1–5), 3Axel1996 figure-skating splits, full women's hockey gold (
Gvfx_0IETtM, Feb 17), day-exact CBS Evening News inserts, opening-day CBS commercials, verified Late Show Feb 20 clip;scripts/rebuild_1998_nagano_sources.py,scripts/rebuild_1998_local_schedule.py,data/unified/1998.channel.yaml - Channels 1980 & 1992 Twin Cities time-capsule schedules — Lake Placid 1980 (ABC Feb 13–24): day-exact ~5PM ABC World News (Feb 18), ~10PM WCCO newscast (Feb 23), KSTP hockey special (Feb 22 Miracle day), WCCO/KSTP team-return coverage (Feb 24), WCCO bumpers/commercials shuffle;
scripts/rebuild_1980_local_schedule.py. Albertville 1992 (CBS Feb 8–23): full 63-part Archive.org catalog restored (scripts/rebuild_1992_albertville_sources.py), CBS Evening News ~5PM blocks Feb 15/18/20;scripts/rebuild_1992_local_schedule.py
Changed
-
CI pytest — GitHub Actions installs
pytest-asyncioalongsidepytest;pytest.inisetsasyncio_mode = autoso async streaming tests execute on the M4 self-hosted runner. -
CI test determinism — golden FFmpeg snapshots pin
ffmpeg.threads/extra_flagsin-test (no dependency on gitignoredconfig.yaml);test_youtube_ydl_opts_includes_ejs_from_configmonkeypatches YouTube EJS settings instead of requiring operator config on the runner. -
CI Xcode 27 beta — workflows set
DEVELOPER_DIRto/Applications/Xcode-beta.appand select it before Swift builds; addedscripts/configure-m4-xcode-ci.shfor M4 runner setup on macOS 27. -
Channel 1994 Letterman/local hunt — Multi-host search (Archive.org, YouTube uploaders, tcmedianow, Malg2025, AVTB): no Twin Cities newscasts dated Feb 12–27, 1994 besides WCCO commercial pod Feb 25; CBS Evening News full broadcasts remain Feb 23/25 only. WCCO Feb 25 pod now uses Archive.org (
cbswcco22594) with YouTube mirror noted. Added verified Letterman Feb 18 (FMareiAe0q8) and Feb 22 partial (tJ-Ze7Ur7VM); dropped wrong-date WCCO Jan 16 / May 23 filler from generated stream list. -
Olympics local source policy —
rebuild_1988/1994/1998_local_schedule.pydocument that tcmedianow is not the sole valid host; Archive.org, YouTube, Vimeo, and other verified uploads are eligible whenbroadcast_datematches the Games day exactly. -
Channel 1998 Nagano local — KARE 10pm newscast Feb 22 (
dT3fwu2ZpGg, tcmedianow/YouTube) wired as closing-day late block; only verified Games-week Twin Cities newscast in the Feb 7–22 window. -
1980/1992 local source gaps — Exhaustive multi-host search (tcmedianow, Smoke, Malg2025, AVTB, tvandmoviearchive, Rick's Clips, Bob Parker, archive.org TV News): no additional WCCO/KSTP dated newscasts for Feb 13–24, 1980 beyond WCCO 10pm Feb 23; no Twin Cities newscasts Feb 8–23, 1992. 1980 hockey specials anchored on Feb 22/24 where title lacks air date. 1992 CBS Evening News full broadcasts: Feb 15/18/20 only.
-
Chronological playout verify gate —
scripts/verify_chronological_playout.pyasserts everyorder: chronologicalcollection keepsCollectionItem.orderin the generated playlist (ads/shuffleskipped); optional--yaml-dateschecks Olympics unified YAMLbroadcast_datemonotonicity -
Playout reset at arbitrary item —
scripts/reset_channel_playout.pyandPOST .../playout-resetaccept--item-index/--item-titleso operators can restart troubleshooting at e.g. Randy Travis Promises (idx 12) instead of always rewinding to item 0. -
Streaming bedrock FROZEN (2026-07-11) — Owner approval required for all changes to streaming pipeline code. Manifest: docs/STREAMING_BEDROCK_FROZEN.md. Rules:
.cursor/rules/streaming-bedrock-frozen.mdc(project),~/.cursor/rules/streamtv-streaming-bedrock-frozen.mdc(global, perpetual). -
Tunarr-style RAM cache eviction —
evict_after_playremoves a YouTube full-cache.mp4when playout advances after complete/fail;evict_off_scheduledrops READY/QUEUED manifest entries outside the current + prefetch window so/Volumes/TunarrRAM/streamtv-cachedoes not fill with orphan files. Config:cache.evict_after_play,cache.evict_off_schedule(defaulttrue). -
Smoother post-restart Plex tune — off-schedule eviction is scoped per channel schedule (one channel cannot delete another's cache); currently playing
source_idis always kept; YouTube full-cache waits usetune_buffer_max_wait_seconds(default 5s) when a tuner is connected instead of 120s. Docs: Plex Live TV recovery.
Fixed
- Plex guide stale after playout resume — StreamTV XMLTV (and merged
/tuners/guide.xml) already air-anchor to the on-air item; Plex GUI “Refresh Guide” does not re-fetch XMLTV. Merged guide now sendsCache-Control: no-cache;discover.jsonEPGURLpoints at/tuners/guide.xmlwhenmerged_guideis enabled. StreamTV POSTs PlexreloadGuideonce per process when playout resumes behind wall-clock. See Plex Live TV recovery. - Plex
reloadGuide404 (wrong DVR id) —config.yamlplex.dvr_idwas109but the active StreamTV DVR on PMS is113; auto-reload andscripts/reload_plex_streamtv_guide.shsilently failed, leaving Plex guide ~28+ items ahead of lagged playout (e.g. Born to be Alive in guide while Dancing With Myself on air). Default scriptDVR_IDupdated to113. - YouTube RAM-cache audio-only (Randy Travis / ch 1991) —
ffprobe -select_streams v:0,a:0returned empty streams on cached.mp4, forcing bad transcode; cached local YouTube files now use standard local FFmpeg input (no-re) and H.264/AAC copy mode when probe succeeds. — Regression fix: local cached YouTube VOD must use-repacing (same as CDN VOD) or playout restarts the same song every ~1s (hold_partialloop); idletune_onlysnap no longer jumps from playout index to wall-clock guide when behind (skipping e.g. Garth The Dance); LRU eviction protects entries accessed within 20 minutes so in-play cache is not deleted during large prefetch downloads. - EPG / playout lag (channel 1991 and all continuous channels) — XMLTV used wall-clock guide index while playout resumed behind on
last_item_index(e.g. guide I Told You So while air was Randy Promises); EPG assignment now prefers live/saved on-air index when lagging. - Plex Apple TV guide “overlayed” titles — When playout lagged past a song’s scheduled end, XMLTV advanced to the next item while FFmpeg was still on the prior one; Plex showed both titles stacked. EPG now stretches the on-air slot until playout advances.
- Plex guide stacked airings after
reloadGuide— Plex accumulated duplicate near-overlapping programme rows when each XMLTV fetch shifted start times by seconds. EPG now caches per-channel start times until the on-air item changes and emits whole-minute XMLTV stamps. - XMLTV EPG 500 (
Unable to generate EPG) — Stabilized programme start times were timezone-aware while the EPG builder compared against naive UTCnow; fixed by normalizing cached starts to naive UTC. - All channels infinite Plex tune spinner —
ChannelManagerfailed to import (Anymissing fromchannel_manager.pyafter EPG live-state helper); HDHomeRun on-demand fallback referenced undefinedstreamer. Both prevented any MPEG-TS bytes on tune. - Docs —
LESSONS_LEARNED.mdIssues 35–40 (YouTube RAM-cache-re, EPG lag, startup regressions, disk full); new rules `youtube-r...