Skip to content

Commit 12169df

Browse files
Bump version to v0.2.2 — Live Channels (auto-updating channels)
Documentation + version bump for the Live Channels feature shipped across the preceding commits (the channel_engine refactor, scheduler + control UI, and the edit-modal bounce fix). - frontend/package.json: 0.2.1 -> 0.2.2 (surfaced in the UI sidebar via the package.json version import in AppLayout). - CHANGELOG.md (new): a verbose, Keep-a-Changelog-style history. The 0.2.2 entry documents the full Live Channels feature — per-channel live toggle, the word-boundary title_contains franchise matcher with author-time preview and exclude list, in-place updates that preserve the Tunarr channel id (so Plex's DVR mapping is never disturbed), change-detection (no state file, idempotent no-ops, no guide churn), the background asyncio scheduler that ships off and re-reads config live, the Settings/Dashboard controls and /api/recipes/* endpoints, the shared channel_engine.py extraction, and the deploy/scheduler lock. Prior versions (0.2.1, 0.2.0, 0.1.x) summarized from git history. - README.md: overhauled to lead with self-maintaining channels — a new intro line, a dedicated "Live Channels (auto-updating)" section explaining the TV-marathon and franchise patterns and why in-place updates matter, and an updated channel-editor feature bullet. Verified locally in Docker: image rebuilt, boots clean on 7979, SPA serves 200, and the v0.2.2 string is present in the built frontend bundle (sidebar version). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 8495515 commit 12169df

3 files changed

Lines changed: 122 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# Changelog
2+
3+
All notable changes to Programmarr are documented here. This project follows
4+
[Semantic Versioning](https://semver.org/) and the spirit of
5+
[Keep a Changelog](https://keepachangelog.com/).
6+
7+
## [0.2.2] — 2026-06-04
8+
9+
### Added — Live Channels (auto-updating channels)
10+
11+
The headline feature of this release. Channels can now be **self-maintaining**:
12+
mark one "live" and Programmarr re-checks it against your library on a schedule
13+
and patches it **in place** as the library grows — no redeploy, no manual edits.
14+
15+
- **Live toggle per channel.** In the channel editor, an "Auto-update on a
16+
schedule" switch marks a channel live. Live channels show an orange badge in
17+
the list. A channel without the flag behaves exactly as before.
18+
- **Franchise auto-match.** A new content rule, `title_contains`, pulls in every
19+
library title matching a phrase (e.g. `Bad Boys` → all four films, in release
20+
order) and auto-adds new sequels as they appear. Matching is **word-boundary**,
21+
not raw substring, so `It` matches "It Follows" but never "Little Women". The
22+
editor shows a **live preview** of exactly what matches before you save, with
23+
per-title checkboxes to exclude false positives.
24+
- **In-place updates — the critical guarantee.** Updates reuse the existing
25+
Tunarr channel via its id (same channel number, same internal id), so Plex's
26+
Live TV / HDHomeRun DVR mapping is never disturbed. Channels are **never**
27+
deleted and recreated for an update. Verified end-to-end: a live Batman channel
28+
grew from 162 to 254 programs with its channel id byte-for-byte unchanged.
29+
- **Change-detection, not blind re-posting.** Each cycle diffs the freshly
30+
resolved program set against the channel's *current* Tunarr programming and
31+
patches only on a real difference. An unchanged channel is a cheap no-op —
32+
idempotent, with no needless Plex guide churn. There is no state file; Tunarr
33+
is the source of truth, so the scheduler survives container restarts for free.
34+
- **Background scheduler.** A lightweight asyncio loop runs inside the existing
35+
FastAPI app (no extra process). It re-reads config every minute, so enabling,
36+
pausing, or changing the interval takes effect without a restart. Ships **off**.
37+
- **Controls & visibility.**
38+
- *Settings → Live Channels*: master enable switch + check interval (hours).
39+
- *Dashboard → Auto-Updates* card: on/paused state, live count, last-cycle
40+
summary with per-channel changes, a **Pause/Resume** toggle, and a
41+
**"Check now"** button that runs a cycle on demand.
42+
- A rolling diff log is written to `data/logs/recipes.log`.
43+
- **New API endpoints** (`/api/recipes/*`): `preview` (author-time match preview),
44+
`status`, `run` (`apply=false` for a safe dry run), `pause`, and `config`
45+
(merge-writes the enable flag + interval without clobbering connection settings).
46+
47+
### Changed
48+
49+
- **`create.py` refactor.** The Tunarr resolution logic (library indexing, title/
50+
collection/franchise resolution, schedule building, in-place programming
51+
updates) was extracted into a new, dependency-free, importable
52+
`channel_engine.py`. `create.py` is now a thin CLI wrapper around it, and the
53+
scheduler and preview endpoint share the exact same resolver. No behavior change
54+
to existing deploys.
55+
- **Deploy/scheduler safety.** Manual deploys and the scheduler now share a lock
56+
so a deploy and an auto-update can never touch Tunarr at the same time.
57+
58+
### Fixed
59+
60+
- **Channel editor "bounce" on Save.** Saving a channel could re-open the modal
61+
instead of closing it (and fire the "saved" notification twice) because the
62+
list reload re-triggered the deep-link open. The deep-link logic is now guarded
63+
so a reload never re-opens a modal you just closed.
64+
65+
### Misc
66+
67+
- Added a favicon (orange broadcast icon matching the navbar logo).
68+
69+
## [0.2.1] — 2025
70+
71+
### Added
72+
73+
- **Channel protection** — choose which existing Tunarr channels to keep before a
74+
deploy; protected channels (and their custom logos) are preserved while the rest
75+
are rebuilt.
76+
- **Channel offset** — set a starting channel number so new channels don't collide
77+
with ones you keep; auto-calculated from the highest protected channel.
78+
79+
## [0.2.0] — 2025
80+
81+
### Added
82+
83+
- **Library picker** on the Export step — choose which Plex libraries to scan, and
84+
mix multiple libraries of the same type.
85+
- **Run pipeline UI rewrite** — a premium stepper with export stats, probe review,
86+
and selective deploy across the AI / No-AI / Collections paths.
87+
- UI screenshots in the README.
88+
89+
## [0.1.x] — 2025
90+
91+
### Added
92+
93+
- Initial **web app**: FastAPI + React + Mantine, served as a single Docker
94+
container on port 7979, with a first-run onboarding wizard.
95+
- AI / No-AI / Collections pipeline paths with live streamed terminal output.
96+
- TMDB channel-logo fetching, Plex DVR sync, optional HTTP basic auth.
97+
- Dark / light / auto theme switching.
98+
- GitHub Actions CI publishing to GHCR; Watchtower auto-update support
99+
(including the `DOCKER_API_VERSION` fix for newer Docker engines).
100+
101+
[0.2.2]: https://github.com/AlpineArchitecture/programmarr/releases/tag/v0.2.2
102+
[0.2.1]: https://github.com/AlpineArchitecture/programmarr/releases/tag/v0.2.1
103+
[0.2.0]: https://github.com/AlpineArchitecture/programmarr/releases/tag/v0.2.0

README.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
Programmarr is a self-hosted web app that exports your Plex library, lets you feed it to an LLM, and deploys the results as themed virtual TV channels in Tunarr — with a web UI that feels like Sonarr or Radarr.
1717

18+
Channels can be **self-maintaining**: mark one "live" and Programmarr re-checks it against your library on a schedule and patches it in place — new episodes and new franchise films appear on their own, no redeploy.
19+
1820
**Requires:** [Tunarr](https://github.com/chrisbenincasa/tunarr) + Plex
1921

2022
---
@@ -145,14 +147,29 @@ Replace `/mnt/YourPool/AppData/programmarr/data` with a real path on your pool.
145147

146148
All three paths end with a probe (dry run) → deploy to Tunarr. The app streams live output to the browser so you can watch it work.
147149

150+
---
151+
152+
## Live Channels (auto-updating) 🆕
153+
154+
Channels are normally static snapshots — you build them, deploy them, and they go stale as your library grows. **Mark a channel "live"** and Programmarr keeps it fresh for you: on a schedule it re-resolves the channel against your current library and patches it **in place**, only when something actually changed.
155+
156+
Two everyday patterns:
157+
158+
- **TV marathons** — a 24/7 single-show loop. New episodes land in Plex → they're on the channel by the next check.
159+
- **Franchises** — add a *title-contains* rule (e.g. `Bad Boys`) in the channel editor. Every matching film is pulled in, in release order, and a new sequel joins automatically when it appears. A live preview shows exactly what matches before you save, and you can exclude any false positives.
160+
161+
**Why "in place" matters:** updates reuse the existing Tunarr channel — same channel number, same internal id — so Plex's Live TV / DVR mapping is never disturbed. No deleting, no re-adding the channel in Plex. An unchanged channel is a no-op, so there's no needless guide churn.
162+
163+
It ships **off**. Turn it on in **Settings → Live Channels**, flip the **"Auto-update"** switch on any channel you want maintained, and watch it from the **Dashboard → Auto-Updates** card (live count, last run, recent changes, pause, and a "Check now" button). Everything stays a recipe you can edit or revert at any time.
164+
148165
### Also included
149166

150167
- **Channel protection** — before deploying, choose which existing Tunarr channels to keep. Checked = preserved; unchecked = cleared and rebuilt as new stations. The "Channels start at" number auto-adjusts to leave room for whatever you keep.
151168
- **Channel offset** — set a starting channel number so new channels don't collide with ones you want to keep. Auto-calculated from your highest protected channel, rounded to the nearest 10.
152169
- **Library picker** — choose which Plex libraries to scan (Movies, 4K Movies, Kids TV, etc.) before each export; supports mixing multiple libraries of the same type
153170
- **Channel logo fetching** — pulls TMDB clearlogos for single-show/movie channels
154171
- **Plex DVR sync** — maps new channels into the Plex Live TV guide automatically
155-
- **Channel editor** — edit names, numbers, shuffle mode, and content lists in the browser
172+
- **Channel editor** — edit names, numbers, shuffle mode, and content lists in the browser; mark channels live and build franchise auto-match rules
156173
- **Optional basic auth** — set a username/password if you expose the UI outside your LAN
157174

158175
---

frontend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "programmarr",
3-
"version": "0.2.1",
3+
"version": "0.2.2",
44
"private": true,
55
"type": "module",
66
"scripts": {

0 commit comments

Comments
 (0)