
结果就是:
直播能看,但节目单全没了,看啥节目、几点播,完全靠猜 😅
这时候,“XML → JSON 转换”就成了刚需。
今天逛论坛看到有XML转EPG脚本源码(Go语言),于是想着搞个PHP版,增加了一些功能:
多源 XML EPG 自动获取 + 本地缓存 + 模糊匹配 + 输出 JSON API,
基本可以当成你自己的 私有 EPG 服务 来用。


先说结论一句话:
不是 XML 不好,是很多播放器太老,只会吃 JSON。
现在网上绝大多数 EPG 数据源都是这种格式:
epg.51zmt.top
epg.pw
各种 GitHub / Gitee XMLTV 项目
本质都是:
<tv><channelid="cctv1"><programmestart="20240201080000"channel="cctv1"></tv>这种标准叫:XMLTV
比如这些:
DIYP
早期 TVBox / CatVod 内核
一些 IPTV 魔改壳子
它们的 EPG 接口长这样:
http://xxx/epg/?ch=CCTV1&date=2026-02-01
返回必须是:
{"channel_name": "CCTV1","epg_data": [{"start":"08:00","end":"09:00","title":"新闻联播"}]}你直接喂 XML?👉 对不起,人家根本不解析。
以前很多人偷懒直接用:epg.112114.xyz
最近的情况大家都懂:
时好时坏
大面积空数据
有时候直接 502
于是现实问题来了:
EPG 必须自己掌控,不能再依赖单一公共接口。


一句话总结:
把多个 XML EPG 源,统一转换成 JSON API 给播放器用。
核心能力:
.xml.gz | |


流程其实很简单:
播放器请求
↓
diyp.php?ch=CCTV1&date=2026-02-04
↓
本地缓存是否存在?
↓
不存在 → 去远程 XMLTV 拉取
↓
解压 gzip
↓
SimpleXML 解析
↓
匹配频道
↓
过滤指定日期节目
↓
输出 JSON
播放器永远只看到 JSON,
XML 那套脏活累活全在你服务器内部解决。


只需要 3 步,小白也能搞定 👇
任意支持 PHP 的环境:
宝塔
Nginx / Apache
群晖 / 威联通 / OpenWrt
PHP 版本:5.6+ 即可
比如:
/www/wwwroot/epg/diyp.php
脚本会自动创建:
/www/wwwroot/epg/epg_cache/
用来存 XML 缓存。

浏览器访问:
http://你的域名/epg/diyp.php?ch=CCTV1&date=2026-02-04
返回类似:
{"channel_name": "CCTV-1 综合","epg_data": [{"start": "08:00","end": "09:00","title": "新闻联播"}]}说明成功 🎉



EPG 接口:
http://你的域名/epg/diyp.php?ch={name}&date={date}
其中:
{name} → 播放器频道名
{date} → 自动传当天
DIYP等播放器里只需填写:
http://你的域名/epg/diyp.php完全不用改频道列表。
配置了三个源:
51zmt → gitee → epg_pw
只要有一个能用,就不会空数据。
比 112114 靠谱太多。
(可自行修改、增加)
这些都能命中同一频道:
CCTV1
央视一套
中央一台
cctv-1-hd
脚本内部会统一标准化:
央视一套 → cctv1
再匹配,命中率极高。
(模糊匹配规则可自行完善、补充)


/diyp.php?action=sources
可以看到:
哪个源在用
上次更新时间
缓存是否有效
/diyp.php?action=update&source=source1
适合:
远程源异常后手动刷新
定时任务触发更新


XML 是数据源标准,
JSON 是播放器现实,
这个脚本就是中间那座桥 🌉
不过似乎php效率不太高,测试使用时,请求量大容易奔溃?
还是建议使用文章开头介绍的EPG聚合项目

