Read the announcement: https://tunarr.com/blog/2026.11.2/
2026.11.2 (2026-11-09)
⚠ BREAKING CHANGES
- api: GET /api/media-libraries/:libraryId/programs returns a
paged{ total, result, size, offset }object instead of an array.
Passoffsetandlimit(1-1000, default 100) to walk the library.
Features
- add ability to bulk edit filler/channel assignments (#1842) (28ab7e5)
- integrate new stream selector with the ffmpeg pipeline (#1874) (b2fda38)
- let users remove a channel's slot schedule (#937) (#2458) (3e0c369)
- stream selection profiles with a resolution cascade, legacy migration, and assignment UI (#1876) (4c44d21), references #1960
- stream-selection: rule preview and Basic-mode program fields (#2181) (738878d)
- upload and loop the channel fallback soundtrack (#2467) (404f8d5), closes #523
- web: add bulk actions, keyboard navigation and a status filter to /channels (#2421) (5b2a46e)
- web: port six tables to DataTable (MRT replacement Phase 1) (#2411) (edf7b53)
- web: rebuild /channels on a new CollectionView pattern (#2414) (40aac0a)
- web: show a snackbar linking to the logs when a query fails (#2473) (2b2beab)
Bug Fixes
- api: make POST /media-sources/:id/scan queue a scan (#2501) (c12eee5), references #2271
- api: page GET /media-libraries/:libraryId/programs (#2423) (0b72882), closes #2420
- channels: preserve on-demand playback state on channel save (#2496) (80a6b2a)
- ffmpeg: isolate output defaults between streams (#2468) (fa7ca66)
- ffmpeg: normalize SDR color output for VAAPI (#2379) (a5b1162)
- hls: lower the default session staleness to 60s (#2422) (d7d12c5), references #1942 #1911
- nvidia: crop bottom rows only for overlays on unpatched ffmpeg (#2404) (c762000), closes #2393
- plex: treat a library list with no Directory key as empty (#2442) (a134656)
- scanner: gate movie short-name artwork on a movie folder (#2320) (170d592), references #2171
- scanner: keep sidecar subtitles, channel counts, and default flags for local media (#2435) (d8db37e), references #2433 #2434
- scanner: keep tvshow.nfo uniqueid tags as show external IDs (#2479) (2332318)
- scanner: match type 'artist' on a single-artist music rescan (#2495) (2bb474f), references #2455
- scanner: restore trashed remote programs that a scan finds unchanged (#2474) (b054faf)
- scanner: trash remote seasons and albums left with no live items (#2450) (b0333a2), references #2401
- scripts: recognize makeKyselyMigrationFromSqlFile in resolve-migrations (#2478) (83ce1c6), references #2147
- search: remove index documents whose program row is gone (#2398) (e7657f9), references #2206
- server: guard image cache downloads against blocked destinations (#2498) (f9a83f2)
- server: preserve stream selection profiles on metadata refresh (#2360) (fd6d521)
- server: relabel Jellyfin/Emby grouping external IDs stored as plex (#2112) (34440fc), closes #2084, references pre-#1106 #910 #1106
- skills: page the library programs request in stream-repro (#2470) (d309f4b), references #2423
- stream: send whole milliseconds to ErsatzTV next (#2418) (07b68bd), closes #2416, references #2416
- stream: serve generated WebVTT subtitle windows (#2444) (b335d41)
- stream: stop HLS audio overlapping at program boundaries (#2368) (cfcd518), references #2364
- web: drop null year and season from program search labels (#2502) (dc23420)
- web: omit an empty artwork fallback list on channel cards (#2499) (c049483)
- web: separate watermark fade and time limit settings (#2464) (7cbdc65)
- xmltv: keep a custom XMLTV output path across restarts (#2400) (86cf43e)