找回密码
 立即注册
img_loading
智能检测中

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 20547|回复: 987

[iptv信源 资源分享或寻求] 【支持DIYP类播放器】通过无服务环境搭建属于自己的EPG服务

 火... [复制链接]
发表于 2024-6-1 12:25 | 显示全部楼层 |阅读模式
前言


本文介绍通过Cloudflare的Worker服务来搭建属于自己的EPG服务。

无套路,无推广,非广告,回复可获取代码。


优点

  • 免维护自动更新
  • 支持IPv6/IPv4双栈访问
  • 无需自己的服务器无任何费用
  • 支持xml格式和DIYP类播放器格式
  • DIPY接口支持历史多天EPG内容查询


部署步骤

1、访问https://www.cloudflare.com 并登录
2、选择页面左侧的[Workers 和 Pages]
3、右上角选择[创建应用程序]——[创建Worker]——[部署]
4、点击部署后,会提示已部署,再点击[编辑代码]。
5、将下方代码全部复制粘贴至窗口左侧的worker.js完成替换:


  1. const Config = {
  2.     repository: 'live.fanmingming.com'
  3. };

  4. async function jq_fetch(request) {
  5.     let response = await fetch(request);
  6.     for (let i = 0; i < 5 && (response.status === 301 || response.status === 302 || response.redirected); i++) {
  7.         const location = response.headers.get('location') || response.url;
  8.         response = await fetch(new Request(location, { headers: { cookie: response.headers.get('set-cookie') } }));
  9.     }
  10.     return response;
  11. }

  12. function makeRes(body, status = 200, headers = { 'access-control-allow-origin': '*' }) {
  13.     return new Response(body, { status, headers });
  14. }

  15. function formatDateTime(time = '') {
  16.     const now = new Date();
  17.     const year = now.getFullYear();
  18.     const month = String(now.getMonth() + 1).padStart(2, '0');
  19.     const day = String(now.getDate()).padStart(2, '0');
  20.     const defaultDate = `${year}-${month}-${day}`;

  21.     if (time.length < 8) return { date: defaultDate, time: '' };

  22.     const [inputYear, inputMonth, inputDay] = [time.substring(0, 4), time.substring(4, 6), time.substring(6, 8)];
  23.     const formattedDate = `${inputYear}-${inputMonth}-${inputDay}`;
  24.     const formattedTime = time.length >= 12 ? `${time.substring(8, 10)}:${time.substring(10, 12)}` : '';

  25.     return { date: formattedDate, time: formattedTime };
  26. }

  27. async function diypHandle(channel, date, request) {
  28.     const tag = date.replace(/-/g, '.');
  29.     const res = await jq_fetch(new Request(`https://github.com/celetor/epg/releases/download/${tag}/112114.json`, request));
  30.     const data = await res.json();

  31.     const program_info = {
  32.         date,
  33.         channel_name: channel,
  34.         url: `https://${Config.repository}`,
  35.         epg_data: data.filter(element => element['@channel'] === channel && element['@start'].startsWith(date.replace(/-/g, '')))
  36.                       .map(element => ({
  37.                           start: formatDateTime(element['@start']).time,
  38.                           end: formatDateTime(element['@stop']).time,
  39.                           title: element['title']['#text'] || '未知节目',
  40.                           desc: element['desc']?.['#text'] || ''
  41.                       }))
  42.     };

  43.     if (program_info.epg_data.length === 0) {
  44.         program_info.epg_data.push({ start: "00:00", end: "23:59", title: "未知节目", desc: "" });
  45.     }

  46.     return makeRes(JSON.stringify(program_info), 200, { 'content-type': 'application/json' });
  47. }

  48. async function fetchHandler(event) {
  49.     const request = event.request;
  50.     const url = new URL(request.url);

  51.     if (url.pathname === '/' && !url.searchParams.has('ch')) {
  52.         return Response.redirect(`https://${Config.repository}/e.xml`, 302);
  53.     }

  54.     const channel = (url.searchParams.get("ch") || '').toUpperCase().replace(/-/g, '');
  55.     const dateParam = url.searchParams.get("date");
  56.     const date = formatDateTime(dateParam ? dateParam.replace(/\D+/g, '') : '').date;

  57.     if (parseInt(date.replace(/-/g, '')) >= 20240531) {
  58.         return diypHandle(channel, date, request);
  59.     } else {
  60.         return makeRes(JSON.stringify({
  61.             date,
  62.             channel_name: channel,
  63.             url: `https://${Config.repository}`,
  64.             epg_data: [{ start: "00:00", end: "23:59", title: "未知节目", desc: "" }]
  65.         }), 200, { 'content-type': 'application/json' });
  66.     }
  67. }

  68. addEventListener('fetch', event => {
  69.     event.respondWith(fetchHandler(event).catch(err => makeRes(`error:\n${err.stack}`, 502)));
  70. });
复制代码


6、替换完成后点击右上角的[部署]——[保存并部署]。
7、选择左上角返回,找到[设置]——[触发器],右侧选择[添加自定义域],将自己的域名与之绑定访问即可。



使用说明与演示示例

部署完成后,EPG接口地址统一为您的自定义域名。
APTV及TiviMate或DIYP软件可直接将您的自定义域名设置为EPG地址。

DIYP类软件指定日期调用示例(以CCTV1为例):
epg.0472.org/?ch=CCTV1&date=20240601



搭建建议
上方链接仅作为演示,可能会随时关闭,建议自行搭建来使用。
以上服务目前为测试阶段,Worker.js代码的bug问题与更新您可前往GitHub自取。

评分

参与人数 5恩山币 +5 收起 理由
onlyangli + 1 感谢你的分享,无论怎样,你都是最无私的人 ...
lhy31512 + 1 感谢大佬
ycstudio8 + 1 是不是需要使用一个域名啊?
lovebaobao_720 + 1 这个很有意义,谢谢!~有时间测试一下。.
zeng544578714 + 1 感谢你的分享,无论怎样,你都是最无私的人.

查看全部评分

只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
发表于 2024-6-1 12:27 | 显示全部楼层
这个可以有!               
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 0 反对 3

使用道具 举报

发表于 2024-6-1 12:28 | 显示全部楼层
看看怎么弄           
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 1 反对 0

使用道具 举报

发表于 2024-6-1 12:29 | 显示全部楼层
噜啦啦啦啦啦啦
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-6-1 12:36 | 显示全部楼层
感谢分享         
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-6-1 12:38 来自手机 | 显示全部楼层
谢谢分享谢谢分享
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-6-1 12:39 | 显示全部楼层
看看,怎么玩,学习一下
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-6-1 12:41 来自手机 | 显示全部楼层
这个可以有!  
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-6-1 12:46 | 显示全部楼层
看看是什么代码。
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-6-1 12:51 | 显示全部楼层
这个可以有这个可以有
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 0 反对 2

使用道具 举报

发表于 2024-6-1 12:55 来自手机 | 显示全部楼层
谢谢分享谢谢分享谢谢分享
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2024-6-1 13:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-6-1 13:07 | 显示全部楼层
无套路,无推广,非广告,回复可获取代码。
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-6-1 13:09 | 显示全部楼层
看看,,看看,,
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-6-1 13:11 | 显示全部楼层
谢谢分享啊......
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛

只谈技术、莫论政事!切勿转播谣言!为了你也为了他人。
只谈技术、莫论政事!(点击见详情) 切记不要随意传播谣言,把自己的日子过安稳了就行,为了自己好也为了大家好。 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。

查看 »

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2025-6-12 20:42

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表