☰
LunaTV 直播接入 IPTV:用一条 M3U 订阅搭出分组的网页频道列表
2026/10/2 13:26:44 网站建设 项目流程

LunaTV 直播接入 IPTV:用一条 M3U 订阅搭出分组的网页频道列表

【免费下载链接】LunaTV本项目采用 CC BY-NC-SA 协议,禁止任何商业化行为,任何衍生项目必须保留本项目地址并以相同协议开源项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTV

打开直播页:频道按来源分组排好,下方的节目单滚到"正在播"的位置,点一下频道画面就出来了,右侧还能看到每一路流的带宽和延迟。这套体验不需要自己写播放器——LunaTV 的直播模块负责把 M3U 订阅解析成网页上的 IPTV 频道列表,再配上 XMLTV 节目单和 HLS 播放。

📺 从克隆仓库到点开第一个频道:5 步验收标准

  1. 拿代码并部署。执行git clone https://gitcode.com/GitHub_Trending/lu/LunaTV,然后按 README 走 Docker 部署。注意仓库里不附带任何直播源,订阅得自己准备。✅ 验收:浏览器能打开登录页,并且登录成功。
  2. 在管理页的直播源配置里新增一条订阅。填入 M3U 链接,EPG 地址按需填写,User-Agent 一般保持默认,保存后点"刷新直播源"。✅ 验收:频道数量字段回填出非 0 的数字。
  3. 切到直播页开播。选中刚才这条源,在分组之间切换浏览,点击任意频道。✅ 验收:画面能持续播放,下方节目单条自动定位到今天正在播的节目。

🎛️ 管理页那 4 个字段,各自管什么事

  • M3U 订阅链接:整个频道列表的出处,http/https 都行。填错或源已下线时,刷新后拿到的就是空列表,这一步是其他一切的前提。
  • EPG 地址:指向一份 XMLTV 节目单。如果 M3U 头部的#EXTM3U行里带了x-tvg-url,这一项可以留空,解析逻辑会自动从头部取地址(实现在 src/lib/live.ts)。填错地址的后果是频道照常出现,但节目单整片空白。
  • User-Agent:代替你的播放器向订阅方发请求。部分源对请求头做防盗链检查,默认值通常够用;换了 UA 再刷新无效时,才需要动它。
  • 频道数量:只读,刷新后自动回填。它等于 0 不代表"没有频道",而是这一轮拉取失败了。

🔧 跑通之后,三个机制决定了日常体验

频道列表进内存缓存。某个源第一次被访问时才会真正去请求订阅,之后切换分组、重新加载页面都直接读缓存,不会再拉一遍 M3U;源更新了,回管理页点一次刷新,缓存才会作废重建。

EPG 走逐行流式解析。XMLTV 文件动辄几十 MB,如果整体读进来再解析,内存压力很大。LunaTV 的做法是边流边读,并且只把订阅里实际出现过的 tvg-id 对应的节目记下来,其余直接丢弃,接口代码在 src/app/api/live/epg/route.ts。

换源面板按实测数据选流。播放层是 ArtPlayer 加 HLS.js 的组合,同一频道挂了多路地址时,右侧面板会列出每一路的带宽与延迟,实测更稳的那路点一下就能切过去,常用频道也可以顺手加入收藏。

🩺 出问题时按这个顺序查

现象:刷新后频道数量是 0。→ 原因:订阅链接已失效,或该源要求特定的 User-Agent。→ 处理:换一条能正常打开的 M3U,或调整 UA 后重新刷新。

现象:频道都有,但节目单空白。→ 原因:EPG 地址填错,或者节目单和 M3U 里同一频道的 tvg-id 对不上号。→ 处理:打开两份文件,逐字比对同一频道的 tvg-id 字段。

现象:个别频道点进去没有画面。→ 原因:那一路流地址本身已经失效,与 LunaTV 无关。→ 处理:用换源面板切到其他地址,或把能看的频道加入收藏备用。

这套流程适合手里已经握有 M3U 订阅、想让直播在浏览器里即开即看的人;下一步可以先把每天要看的几个频道加进收藏,之后开播只需要两下点击。

【免费下载链接】LunaTV本项目采用 CC BY-NC-SA 协议,禁止任何商业化行为,任何衍生项目必须保留本项目地址并以相同协议开源项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTV

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询