|
| 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 |
0 commit comments