M3U播放列表与EPG管理工具Stationarr

简介

什么是 Stationarr ?

Stationarr 是一个开源的 IPTV 播放列表与 EPG(电子节目指南)管理工具,专为 *arr 自托管生态设计。它支持 M3U 播放列表导入、可视化频道编辑、XMLTV 多源 EPG 匹配,并可将整理后的播放列表和节目单输出给 TiviMateKodiVLCIPTV 播放器。

需要特别说明的是,Stationarr 本身不提供、不托管、不分发任何 IPTV 直播流,它只是一个对合法获取的 M3U 播放列表和 EPG 节目单进行整理、编辑、再分发的工具。

主要特点

  • 多方式导入播放列表:支持通过 Xtream Codes 授权登录、URL 远程拉取或本地文件上传导入 M3U,支持定时自动刷新
  • 可视化频道编辑器:拖拽重排序、批量启用/禁用/删除、Ctrl/Shift 多选、服务端分页(轻松应对超大播放列表)
  • 多源 EPG 匹配:支持多个 XMLTV 节目源拖拽排序优先级,按 TVG ID 自动匹配频道,可设置主备 EPG 与时区偏移
  • 海量 EPG 源库:内置 30 多个国家的免费节目源(EPG.pwi.mjh.nzxmltv.net 等),一键添加
  • iptv-org/epg 抓取器集成(可选):通过 Docker sidecar100+ 网站抓取节目数据,浏览器内可管理抓取任务
  • TV 节目指南SQLite 后端索引的电视指南,支持 12h/24h 时间窗、滚动加载、按组/搜索过滤
  • 频道台标管理:自动从 EPG 源匹配台标,可浏览 tv-logo/tv-logos 仓库的 10000+ 频道图标
  • 多种输出格式:提供托管的 M3U URLgzip 压缩的 EPG XMLTV URL、兼容 Xtream Codes API 的播放地址
  • 多用户与权限JWT 认证、首个注册账号自动为管理员、可关闭注册、备份与恢复(JSON 格式)
  • 开源免费:基于 AGPL-3.0-or-later 协议开源,同时提供商业授权

应用场景

  • 合法 IPTV 订阅管理:对从正规 IPTV 服务商购买的订阅进行频道整理、分组、过滤,输出更清爽的播放列表
  • 家庭影音中心:在 Plex/Jellyfin/Emby 之外,给客厅电视盒子(TiviMate/Kodi)一个可控的频道源
  • 免费流媒体聚合:将 PlutoTVPlex Live TVSamsung TV+ 等免费 IPTV 频道统一到一个播放列表里
  • 跨设备统一播放:编辑后的播放列表和 EPG 可在任何支持 M3U/Xtream 的播放器上使用,告别每个设备单独配置
  • 频道编辑协作:通过多用户功能,让家庭成员只看到自己关心的频道分组

Stationarr*arr 自托管生态里专门补齐 IPTV 这块拼图的工具,让你的播放列表、节目单和台标都在自己掌控之下。

安装

在群晖上以 Docker 方式安装。

在注册表中搜索 stationarr,选择第一个 rroy676/stationarr,版本选择 latest

本文写作时,latest 版本对应为 v1.1.1

docker-compose 安装

采用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: '3.8'

services:
stationarr:
image: rroy676/stationarr:latest
container_name: stationarr
restart: unless-stopped
ports:
- "3754:3000"
volumes:
- ./data:/app/data # 持久化 SQLite 数据库、EPG 缓存等
environment:
- JWT_SECRET=change-me-to-a-long-random-string # 用于签名 JWT 令牌,必须设置
- JWT_EXPIRES_IN=7d # 令牌有效期
- DATA_DIR=/app/data # 数据目录
- BASE_URL=http://你的群晖IP:3754 # 公网/局域网访问地址
- REGISTRATION_OPEN=true # 是否允许新用户注册
- SCRAPER_URL=http://epg:3000 # EPG 抓取 sidecar 地址
- SCRAPER_CHANNELS_PATH=/app/data/scraper/channels.xml # 与抓取器共享的 channels.xml 路径

可选:启用 iptv-org/epg 抓取 sidecar

如果需要从 100+ 网站抓取节目数据,可以把 docker-compose.yml 改成下面这样(取消注释 epg 服务):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
version: '3.8'

services:
stationarr:
image: rroy676/stationarr:latest
container_name: stationarr
restart: unless-stopped
ports:
- "3754:3000"
volumes:
- ./data:/app/data
- ./scraper:/app/data/scraper # 与 epg sidecar 共享
- /var/run/docker.sock:/var/run/docker.sock # 可选:让 Stationarr 直接触发 sidecar
environment:
- PORT=3000
- JWT_SECRET=${JWT_SECRET:-changeme-set-in-env-file}
- JWT_EXPIRES_IN=${JWT_EXPIRES_IN:-7d}
- DATA_DIR=/app/data
- BASE_URL=${BASE_URL:-http://192.168.0.197:3754} # 192.168.0.197 是老苏群晖主机的 IP
- REGISTRATION_OPEN=${REGISTRATION_OPEN:-true}
- SCRAPER_URL=http://epg:3000
# Must stay under /app/data for Stationarr; do not point to /epg/public
- SCRAPER_CHANNELS_PATH=/app/data/scraper/channels.xml
- DOCKER_API_VERSION=1.41
depends_on:
- epg

epg:
image: ghcr.io/iptv-org/epg:master
container_name: stationarr-epg
restart: unless-stopped
volumes:
- ./scraper:/epg/public # 与 Stationarr 共享目录
environment:
- CRON_SCHEDULE=0 */6 * * * # 每 6 小时跑一次
- DAYS=3 # 抓取未来 3 天的节目
- MAX_CONNECTIONS=5
- RUN_AT_STARTUP=true

提示

  1. epg sidecar 镜像托管在 ghcr.io,群晖 Docker 套件无法直接搜索,需要通过命令行拉取
  2. 挂载 /var/run/docker.sock 会给 Stationarr 容器对宿主机 Docker 的广泛控制权,仅在可信的自托管环境启用
  3. 首次启动时如果 guide.xml 不存在,访问 EPG 会返回 404,需等待 sidecarcron 任务或手动触发(docker exec stationarr-epg npm run grab -- --channels=/epg/public/channels.xml --output=/epg/public/guide.xml

然后通过 SSH 登录到您的群晖,执行下面的命令:

1
2
3
4
5
6
7
8
9
10
# 新建文件夹 stationarr 和 子目录
mkdir -p /volume1/docker/stationarr/{data,scraper}

# 进入 stationarr 目录
cd /volume1/docker/stationarr

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

运行

在浏览器中访问 http://<群晖IP>:3754 即可进入登录界面

第一次要注册用户

登录后的主界面

注意:完成初始化后建议把 REGISTRATION_OPEN 设置为 false,关闭公开注册,避免被恶意注册。

导入 M3U

新建一个列表

Import M3U 导入播放列表

选择 M3U URL 类型

导入成功之后

导入 EPG

EPG sources 导入

可以从 iptv-org 导入,也可以加自己的

可以直接拉取节目表进行缓存

播放

Playlist URLs

可以看到对外的播放列表

除此之外,在首界面也能获得 url

直接在 potplayer 中播放

如果源没问题,就可以直接播放

信息

进入 Admin

可以看到 Dashboard 中的所有信息

注意事项

  1. 合法使用:Stationarr 不提供任何 IPTV 直播流,所有播放列表、EPG 节目源、抓取的频道均需用户自行从合法渠道获取,使用者应自行确保符合当地法律法规和提供商条款
  2. JWT_SECRET 必须设置:默认示例值仅用于本地测试,生产环境务必改成一个长随机串(可用 openssl rand -hex 32 生成)
  3. BASE_URL 必须正确:必须填写局域网或公网中播放器能访问到的地址,否则生成的托管链接打不开;填 http://localhost:3000 只能本机访问
  4. 托管链接是 BearerM3U / EPG / Xtream 链接理论上任何拿到 URL 的人都能访问,不要外发,泄露后可在界面重新生成
  5. 频道和节目分别匹配:即使 EPG 源被缓存了,如果播放列表里的频道没有在 Channel Editor 中匹配 EPG IDTV Guide 里也不会有节目
  6. v1.0.9 之前的数据:如果你的抓取频道是 v1.0.92026-05-19)之前创建的,可能包含旧的/无效的映射,建议在 Settings → EPG Scraper 里删除后重新添加
  7. 首次抓取慢iptv-org/epg sidecar 第一次运行时需要从 100+ 网站抓数据,可能耗时数小时,期间 TV Guide 不会有内容
  8. Docker socket 风险:启用 /var/run/docker.sock 挂载会给 Stationarr 容器控制宿主 Docker 的能力,仅在可信自托管环境启用,并关注 SECURITY.md 的安全建议
  9. 数据备份:所有数据都在 /app/data 目录中(SQLite 数据库 + EPG 缓存),定期备份 data 文件夹即可

参考文档

rroy676/Stationarr: The missing piece of your self-hosted media stack. Stationarr lets you import, edit, and serve M3U playlists with multi-source EPG matching built for Docker, designed for the *arr ecosystem.
地址:https://github.com/rroy676/Stationarr

rroy676/stationarr - Docker Image | Docker Hub
地址:https://hub.docker.com/r/rroy676/stationarr

iptv-org/epg: Community-driven EPG (Electronic Program Guide) repository and scraper for IPTV
地址:https://github.com/iptv-org/epg

tv-logo/tv-logos: Collection of TV channel logos
地址:https://github.com/tv-logo/tv-logos