当前位置:首页>php>【PHP】XML EPG 转 JSON:DIYP老播放器的“续命神器”

【PHP】XML EPG 转 JSON:DIYP老播放器的“续命神器”

  • 2026-09-10 14:27:10
【PHP】XML EPG 转 JSON:DIYP老播放器的“续命神器”
📺前言
前几天112114 EPG接口似乎彻底挂掉了。
👉 一些老牌播放器(比如 DIYP、部分魔改壳子)只支持 JSON 格式 EPG,根本不认 XMLTV

结果就是:
直播能看,但节目单全没了,看啥节目、几点播,完全靠猜 😅

这时候,“XML → JSON 转换”就成了刚需。

今天逛论坛看到有XML转EPG脚本源码(Go语言),于是想着搞个PHP版,增加了一些功能:
多源 XML EPG 自动获取 + 本地缓存 + 模糊匹配 + 输出 JSON API,
基本可以当成你自己的 私有 EPG 服务 来用。

当然了,我们之前也分享过几个EPG聚合项目,也是支持json格式输出的,例如:
EPG Sync|一站式电子节目单聚合管理系统(宝塔面板部署教程)
【Docker】不用写代码!一键搭建 IPTV + EPG 管理系统,网页端轻松管理频道
这个脚本由Deepseek所写。
在功能上是比较简陋的,但是部署使用也是最简单的,有需要的可以前往Github仓库获取。
🧩 一、为什么要把 XML 转成 JSON?

    先说结论一句话:

    不是 XML 不好,是很多播放器太老,只会吃 JSON。

    1️⃣ 主流 EPG 实际上是 XMLTV

    现在网上绝大多数 EPG 数据源都是这种格式:

    • epg.51zmt.top

    • epg.pw

    • 各种 GitHub / Gitee XMLTV 项目

    本质都是:

    <tv>  <channelid="cctv1">  <programmestart="20240201080000"channel="cctv1"></tv>

    这种标准叫:XMLTV


    2️⃣ 老播放器只认 JSON

    比如这些:

    • 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?👉 对不起,人家根本不解析。


    3️⃣ 112114 接口不稳定是导火索

    以前很多人偷懒直接用:epg.112114.xyz

    最近的情况大家都懂:

    • 时好时坏

    • 大面积空数据

    • 有时候直接 502

    于是现实问题来了:

    EPG 必须自己掌控,不能再依赖单一公共接口。

    💡 二、这套脚本干了什么?

        一句话总结:

        把多个 XML EPG 源,统一转换成 JSON API 给播放器用。

        核心能力:

        功能
        说明
        多数据源
        51zmt / gitee / epg.pw
        自动优先级
        主源挂了自动切备
        gzip 解压
        支持 .xml.gz
        本地缓存
        默认 5 分钟
        模糊匹配
        CCTV1 ≈ 央视一套 ≈ 中央一台
        JSON 输出
        老播放器完美兼容

        📊 三、工作原理图

          流程其实很简单:

          播放器请求
             ↓
          diyp.php?ch=CCTV1&date=2026-02-04
             ↓
          本地缓存是否存在?
             ↓
          不存在 → 去远程 XMLTV 拉取
             ↓
          解压 gzip
             ↓
          SimpleXML 解析
             ↓
          匹配频道
             ↓
          过滤指定日期节目
             ↓
          输出 JSON

          播放器永远只看到 JSON,
          XML 那套脏活累活全在你服务器内部解决。

          🎯四、如何部署(超简单)

            只需要 3 步,小白也能搞定 👇

            1️⃣ 环境要求

            • 任意支持 PHP 的环境:

              • 宝塔

              • Nginx / Apache

              • 群晖 / 威联通 / OpenWrt

            • PHP 版本:5.6+ 即可


            2️⃣ 上传文件

            比如:

            /www/wwwroot/epg/diyp.php

            脚本会自动创建:

            /www/wwwroot/epg/epg_cache/

            用来存 XML 缓存。


            3️⃣ 测试接口

            浏览器访问:

            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

            完全不用改频道列表。


            这脚本最爽的两个细节

            1️⃣ 多源自动容灾

            配置了三个源:

            51zmt → gitee → epg_pw

            只要有一个能用,就不会空数据。

            比 112114 靠谱太多。

            (可自行修改、增加)


            2️⃣ 模糊匹配非常实用

            这些都能命中同一频道:

            • CCTV1

            • 央视一套

            • 中央一台

            • cctv-1-hd

            脚本内部会统一标准化:

            央视一套 → cctv1

            再匹配,命中率极高。

            (模糊匹配规则可自行完善、补充)


            📌 六、进阶玩法

            查看当前数据源状态

            /diyp.php?action=sources

            可以看到:

            • 哪个源在用

            • 上次更新时间

            • 缓存是否有效


            手动强制更新

            /diyp.php?action=update&source=source1

            适合:

            • 远程源异常后手动刷新

            • 定时任务触发更新

            📌 总结

            XML 是数据源标准,
            JSON 是播放器现实,
            这个脚本就是中间那座桥 🌉

            不过似乎php效率不太高,测试使用时,请求量大容易奔溃?

            还是建议使用文章开头介绍的EPG聚合项目

            后台回复“20260204”获取此脚本Github地址

            最新文章

            随机文章