默认监听 8000 端口,需映射并访问 http://localhost:8000;需挂载 ./tunarr-data:/config/tunarr 持久化配置;硬件转码需按官方文档另行配置。

tunarr
chrisbenincasaZlib活跃维护把 Plex、Jellyfin、Emby 里的自建影音库包装成 IPTV 频道,用传统电视换台的方式观看,还能生成 NFO 元数据。
Create a classic TV experience using your own media - IPTV backed by Plex/Jellyfin/Emby/NFO
docker compose up -dREADME 未说明具体显存或 CPU 要求;硬件转码支持 Nvidia NVENC、VAAPI、Intel QuickSync、macOS VideoToolbox,并提供 linux/arm64 镜像用于树莓派等 ARM 设备。
把 Plex/Jellyfin/Emby 或本地媒体变成自建直播电视频道,输出 IPTV 流
把 Plex、Jellyfin、Emby 里的自建影音库包装成 IPTV 频道,用传统电视换台的方式观看,还能生成 NFO 元数据。
核心能力
- 连接 Plex、Jellyfin、Emby 或本地文件库并跨库搜索筛选
- 拖拽编排频道节目单,支持广告、MV、片头等填充内容
- 伪装成 HDHomeRun 调谐器接入 Plex/Jellyfin/Emby
- 输出 M3U/IPTV 供 Tivimate、Threadfin、xTeVe 等客户端
- 支持 NVENC、VAAPI、QuickSync、VideoToolbox 硬件转码
容易踩的坑
- v2026.11.2最新正式版2026-11-09 · 2026-11-09 13:19 UTC
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 co
- api: GET /api/media-libraries/:libraryId/programs returns a
paged
- v2026.11.12026-11-02 · 2026-11-02 03:43 UTC
- v2026.11.02026-11-01 · 2026-11-01 20:35 UTC
查看更新说明
2026.11.0 (2026-11-01)
Features
- Allow users to use ersatztv-next as their streaming pipeline (#2121) (243bbc3), closes #323, references ErsatzTV/next#246 #249 #309 #310 #300 #312 #331 #322 #320 #321 #322 ErsatzTV/next#332
- web: DataTable on TanStack Table v9, parity spec, Filler Lists port (MRT replacement Phase 0) (#2350) (35642b8)
- web: move bulk flex tools into a Flex menu (#1479) (#2384) (337e52e)
- web: replace the welcome stepper with a skippable setup checklist (#2337) (0ea21eb)
- web: show the ErsatzTV Next version in the help menu (#2406) (7f15b9f)
Bug Fixes
- dev: fetch the ersatztv-channel binary when starting the dev server (#2402) (f1a6af7)
- ffmpeg: keep the server environment in the vainfo probe (#2381) (965cc0d), closes #2380
- hls: serve the live edge so one slow client cannot freeze the playlist (#2082) (ff582b0), closes #2045
- plex: accept video streams without dimensions and skip them (#2383) (7d28d4a), closes #2192
- scanner: trash local seasons, shows, albums and artists with their last item (#2396) (05982b9)
- scheduling: align slot padding to the local clock, not UTC (#2291) (9e5bba3), references #2235
- stream: fall back to the album's art when a track's own art is unreachable ([#2362](https://github.com/chri
- v2026.10.42026-10-25 · 2026-10-25 19:26 UTC
查看更新说明
2026.10.4 (2026-10-25)
⚠ BREAKING CHANGES
- scheduling: the API rejects
movieslots in time and random slot schedules. Schedule movies with a custom-show slot instead.
Features
- scheduling: migrate movie slots to custom-show slots (#2235) (5d6b11d)
- web: add design tokens, new theme and app-wide density setting (42b8c5d)
- web: add Segmented, KeyHint and EmptyState primitives (#2359) (697a0f1)
- web: add Storybook and the first component-layer primitives (d5fd146)
- web: replace the drawer and top bar with AppShell (#2356) (ed4af53)
- web: switch fonts to IBM Plex Sans and IBM Plex Mono (f894f4d)
Bug Fixes
- api: store uploaded images under server-generated names (#2357) (57dfd2d)
- artwork: ignore a cachePath whose file is missing (#2294) (9f10114)
- channels: keep startTime unless the user changes it on save (#2308) (bdc085f), references #2306
- db: register the program_grouping external key index migration (5936dd9), references #2232
- docker: copy .pnpmfile.cjs into the image build (#2371) (af95944)
- ffmpeg: escape subtitle filter paths (#2324) (d8cb90e)
- ffmpeg: pass tonemap peak in reference-white units (b09a7e0), closes #2063
- ffmpeg: select libdav1d for AV1 by checking ffmpeg's decoder list (#2370) (355c06c)
- ffmpeg: use mpeg2_vaapi for VAAPI MPEG-2 output (#2322) (21ee1d9)
- nfo: support multiple studios for other_video.episodedetails (8667ca0)
- server: replace pool workers that miss a task deadline (#2090) (c0ca3e0)
- server: sort bac
- scheduling: the API rejects
- v2026.10.32026-10-16 · 2026-10-16 12:49 UTC
查看更新说明
2026.10.3 (2026-10-16)
Features
Bug Fixes
- api: build external links for Emby programs (#2263) (d74110c)
- db: keep schema test files out of drizzle-kit's schema glob (#2307) (f2f4ade)
- ffmpeg: derive anamorphic SAR from N:M display aspect ratios (#2299) (379fdfc), closes #2256
- ffmpeg: return VAAPI frames from tonemap_opencl when a download follows (#2327) (f4e5138)
- ffmpeg: stop gcd from looping forever on zero (#2319) (ee1f3cf)
- hls: mark exactly one audio rendition as default (#2300) (e632b98)
- scanner: parse movie.uniqueid tag as array in OtherVideo nfo parser (#2304) (4fa4b7a)
- scanner: prefer movie-specific artwork over folder short names (#2315) (fb12059), references #2170
- scheduling: use the seeded random for ordered shuffle and random slot picks (#2301) (5601688)
- server: normalize stored language codes to ISO 639-2/T (#2044) (#2074) (79b1cd9)
- server: shut down the worker pool when the env var is unset (#2305) (2523e6b)
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
What is Tunarr?
Tunarr lets you build custom live TV channels out of your existing media libraries — movies, TV episodes, music videos, or local files — and stream them as if they were real broadcast channels.
Tune in by adding Tunarr's spoofed HDHomeRun tuner to Plex, Jellyfin, or Emby, or grab the M3U URL for any IPTV player like Tivimate or UHF.
Features
Media Sources
- Connect Plex, Jellyfin, Emby, or local file libraries
- Advanced search, filter, and sort across all connected libraries
Channel Management
- Drag-and-drop lineup editor
- Filler content between programs (commercials, music videos, prerolls, branding)
- Per-channel logos and automatic configuration backups
Scheduling
- Time-slot and random-slot scheduling tools
- Web-based TV guide for viewing channel lineups
Playback & Integration
- Spoofed HDHR tuner for Plex, Jellyfin, and Emby
- M3U/IPTV output for Dispatcharr, Threadfin, xTeVe, or any IPTV client
- Stream channels directly in the browser
- Per-channel audio language and subtitle preferences
Transcoding
- Hardware-accelerated transcoding: Nvidia NVENC, VAAPI, Intel QuickSync, macOS VideoToolbox
- Multiple transcode profiles, configurable per channel
Screenshots
Quick Start
The easiest way to run Tunarr is with Docker Compose. Create a docker-compose.yml:
services:
tunarr:
image: chrisbenincasa/tunarr:latest
container_name: tunarr
ports:
- 8000:8000
environment:
- TZ=America/New_York
volumes:
- ./tunarr-data:/config/tunarr
restart: unless-stopped
Then run:
docker compose up -d
Tunarr will be available at http://localhost:8000.
Other installation options:
| Platform | Method |
|---|---|
| Linux / macOS / Windows | Standalone binaries |
| Unraid | Community App Store |
| Proxmox | LXC helper script |
| ARM (Raspberry Pi, etc.) | Docker image (linux/arm64) |
For hardware-accelerated transcoding setup, see the transcoding docs.
Documentation
Development
pnpm i
pnpm turbo dev # backend at :8000, frontend at :5173/web
See CONTRIBUTING.md for a full development guide.
Community
- Discord — chat, help, and announcements
- GitHub Issues — bug reports and feature requests
- GitHub Discussions — questions and general conversation
License
Tunarr is released under the Zlib License.