直播源聚合、自愈、录播过滤,支持 amd64/arm64
1.8K
将虎牙、斗鱼当前开播房间和经过检测的 IPTV 电视源聚合为一个 M3U。镜像支持 linux/amd64、linux/arm64,包含 Go 续流服务、Python 兼容代理、iptv-api、FFmpeg 和 nginx,宿主机不需要安装 Go、Python 或 FFmpeg。
镜像发布必须先通过同一提交的 Huya/Douyu 实播冒烟与双架构构建验证。播放接口使用 302 临时跳转并禁止缓存;旧白名单不会隐藏新目录中的房间。换台时取消旧 CDN 连接,续流地址过期后重新解析。短时测试通过不等于所有频道都能长期无卡顿。
直播目录不是永久快照:容器启动后默认每 15 分钟同步虎牙/斗鱼开播状态,播放签名默认 30 秒短缓存。播放器若只在启动时加载一次 M3U,仍需开启列表自动刷新或手动重新加载,才能看到新开播/下播频道。
http://服务器IP或域名:8081/allinone.m3u
注意:M3U 里的斗鱼和虎牙频道还会连接 19090。只映射 8081 会导致“列表能下载但平台频道无法播放”。19091 仅供旧版虎牙链接兼容。
创建 compose.yml:
services:
livetv:
image: minshurui/livetv-allinone:latest
container_name: livetv
restart: unless-stopped
init: true
ports:
- "8081:8081" # 最终 M3U
- "19090:19090" # 虎牙/斗鱼 Go 续流代理
- "19091:19091" # 可选:旧版虎牙兼容端口
- "8080:8080" # 可选:IPTV 管理页
environment:
TZ: Asia/Shanghai
PUBLIC_HOST: ""
HUYA_CDN: AL
HUYA_CODEC: "264"
HUYA_MAX_RATIO: "2000"
HUYA_GROUP_MODE: compact
DOUYU_GROUP_MODE: compact
IPTV_CHANNEL_SCOPE: all
IPTV_VERIFY_STREAMS: "1"
IPTV_VERIFY_FALLBACK: "1"
IPTV_REJECT_VOD: "1"
IPTV_MIN_CHANNELS: "20"
volumes:
- ./data:/data
security_opt:
- no-new-privileges:true
stop_grace_period: 20s
logging:
options:
max-size: "10m"
max-file: "3"
启动并检查:
docker compose pull
docker compose up -d
docker compose ps
docker logs --tail=100 -f livetv
本机验证:
curl -fsS http://127.0.0.1:8081/healthz && echo
curl -fsS http://127.0.0.1:8081/allinone.m3u | sed -n '1,8p'
docker inspect --format '{{.State.Health.Status}}' livetv
正确结果是 /healthz 输出 ok、M3U 第一行是 #EXTM3U、容器最终为 healthy。
镜像默认完整补抓虎牙“一起看”分类,并把虎牙和斗鱼整理为 8 个大组;频道图标使用主播头像。加载 M3U 时还会后台预解析每组前几个虎牙/斗鱼频道,降低冷启动换台延迟。
在 Container Manager 中新建“项目”,项目目录可选:
/volume1/docker/livetv
把上方 Compose 粘贴到项目中。./data:/data 会把持久化数据保存到 /volume1/docker/livetv/data。启动后使用:
http://群晖IP:8081/allinone.m3u
群晖防火墙至少允许播放器所在局域网访问 TCP 8081、19090。使用旧版虎牙链接时才需要 19091;8080 仅建议管理设备在内网访问。
如果 8081 被占用:
ports:
- "8201:8081"
environment:
PUBLIC_LIVETV_PORT: "8201"
播放地址改为 http://服务器:8201/allinone.m3u。
若流端口也修改,必须同时告诉程序写入新公开端口:
ports:
- "29090:19090"
environment:
PUBLIC_PROXY_PORT: "29090"
Cloudflare Tunnel 对外只通 80/443,无法直连多个流端口。镜像提供 STREAM_ENTRY 统一入口:设置后,M3U 里的虎牙/斗鱼频道地址统一写成 https://域名/stream/{平台}/{房间号},全部走 nginx(8081) 入口,由它在容器内部转发到对应流代理,隧道只需放行一个 HTTP 端口。
Compose 只把 8081 绑到本机供 cloudflared 访问:
services:
livetv:
image: minshurui/livetv-allinone:latest
container_name: livetv
restart: unless-stopped
init: true
ports:
- "127.0.0.1:8081:8081" # 只供本机 cloudflared 访问
environment:
TZ: Asia/Shanghai
STREAM_ENTRY: "https://tv.example.com"
IPTV_REJECT_VOD: "1"
IPTV_MIN_CHANNELS: "20"
volumes:
- ./data:/data
cloudflared 配置(~/.cloudflared/config.yml):
tunnel: <隧道ID>
credentials-file: /root/.cloudflared/<隧道ID>.json
ingress:
- hostname: tv.example.com
service: http://localhost:8081
- service: http_status:404
最终播放地址:
https://tv.example.com/allinone.m3u
无需在防火墙/路由器上开放其他端口;STREAM_ENTRY 需带 https:// 前缀,且不要以 / 结尾。
启动顺序:
iptv-api 启动;虎牙/斗鱼通常先出现;IPTV 首次生成可能需要几分钟到几十分钟。不要不断重启容器打断测速。
查看进度:
docker exec livetv tail -f /data/lnmp/logs/sync-channels.log
docker exec livetv tail -f /data/lnmp/logs/iptv-api-update.log
docker exec livetv tail -f /data/lnmp/logs/bridge.log
挂载 ./data:/data 后,升级和重建容器不会丢失:
data/
├── iptv-api/config/ # 订阅、测速和 EPG 配置
├── iptv-api/output/result.m3u # IPTV 原始结果
└── lnmp/
├── allinone/channels.json # 当前开播房间
├── applecms/.iptv-result.m3u # 过滤后的 IPTV 快照
├── applecms/iptv-blocklist.txt # 用户黑名单
└── logs/ # 日志
最终列表默认保留频道模板中的央视、卫视和地方频道。每个候选地址会由
FFmpeg 实际解码首帧,每频道最多发布 2 条通过验证的线路。若容器里的探测器对
全部候选均失败,默认会降级使用 iptv-api 最新测速结果,避免旧失效快照永久锁死;
下个更新周期仍会重试严格验证。绝对严格模式可设 IPTV_VERIFY_FALLBACK=0。
只需要央视和省级卫视时设置 IPTV_CHANNEL_SCOPE=cctv_satellite。
镜像会过滤正时长 EXTINF、MP4/MKV 等明显 VOD 文件、部分结束型 HLS 和用户黑名单。发现已经人工确认的循环录播后:
nano data/lnmp/applecms/iptv-blocklist.txt
docker exec livetv /opt/livetv/scripts/bridge_iptv.sh
黑名单每行一个 URL 域名或路径关键字。持续产生新分片的循环录像在协议层可能与真直播相同,无法保证只靠网络检测百分之百识别。
升级:
docker compose pull
docker compose up -d --remove-orphans
稳定环境可使用完整 Git 提交 SHA 标签代替 latest:
image: minshurui/livetv-allinone:完整Git提交SHA
改回旧 SHA 后执行 docker compose pull && docker compose up -d --force-recreate 即可回滚。操作前建议备份 data/。
项目没有内置登录认证。不要把 8080 管理页暴露到不可信公网;公网使用建议放在 VPN 或带认证的反向代理后。不要在 Compose、Issue 或日志中公开订阅、密码、Token、SSH 私钥、个人 IP 和私人路径。
Content type
Image
Digest
sha256:c3b6501cd…
Size
103.3 MB
Last updated
about 1 month ago
docker pull minshurui/livetv-allinone