找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
楼主: aming.ou

[网络视频应用推荐 使用 疑问] 自建DIYP影音和TVBOX的接口PHP服务

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

使用道具 举报

发表于 2024-1-2 15:08 | 显示全部楼层
自己捣鼓了写了一下,可以一键更新list表里的直播源,配合和楼主的xml2db.php用计划任务可以实现每天定时自动更新直播源和节目信息

每次更新时会删除之前会清空一次list表,把获取到的CCTV频道像CCTV-1到CCTV-17自动转成CCTV1 CCTV2,只适用于内容是以下格式
央视频道,#genre#
CCTV-1 综合,http://[2409:8087:1e03:21::2]:6060/cms001/ch00000090990000001022/index.m3u8
CCTV-2 财*,http://[2409:8087:1e03:21::2]:6060/cms001/ch00000090990000001220/index.m3u8
卫视频道,#genre#
凤凰中文,http://[2409:8087:2001:20:2800:0:df6e:eb24]:80/ott.mobaibox.com/PLTV/3/224/3221228527/index.m3u8
凤凰资讯,http://[2409:8087:2001:20:2800:0:df6e:eb27]:80/ott.mobaibox.com/PLTV/3/224/3221228524/index.m3u8
上海频道,#genre#
上海都市,http://[2409:8087:1e03:21::2]:6060/cms001/ch00000090990000001015/index.m3u8
上海新闻,http://[2409:8087:1e03:21::2]:6060/cms001/ch00000090990000001014/index.m3u8



  1. <?php

  2. // 数据库文件路径
  3. $dbPath = 'channel_epg.db';

  4. // 打开或创建SQLite数据库
  5. $db = new SQLite3($dbPath);

  6. // 准备创建表的SQL语句
  7. $createTableSQL = <<<SQL
  8. CREATE TABLE IF NOT EXISTS list (
  9.     item TEXT,
  10.     title TEXT,
  11.     epg TEXT DEFAULT '',  -- epg字段默认为空字符串
  12.     url TEXT,
  13.     isdel INTEGER
  14. );
  15. SQL;
  16. $db->exec($createTableSQL);

  17. // 清空list表
  18. $emptyTableSQL = "DELETE FROM list";
  19. $db->exec($emptyTableSQL);

  20. // 准备查询现有记录的SQL语句
  21. $selectSQL = "SELECT url FROM list WHERE item = :item AND title = :title";
  22. $selectStmt = $db->prepare($selectSQL);

  23. // 准备更新现有记录的SQL语句
  24. $updateSQL = "UPDATE list SET url = :new_url WHERE item = :item AND title = :title";
  25. $updateStmt = $db->prepare($updateSQL);

  26. // 准备插入新记录的SQL语句
  27. $insertSQL = "INSERT INTO list (item, title, epg, url, isdel) VALUES (:item, :title, :epg, :url, :isdel)";
  28. $insertStmt = $db->prepare($insertSQL);

  29. // 网站数据源数组
  30. $dataSources = [
  31.     '网址1',
  32.     '网址2'
  33. ];

  34. // 初始化isdel计数器
  35. $isdelCounter = 1;

  36. foreach ($dataSources as $dataSource) {
  37.     // 获取数据
  38.     $data = file_get_contents($dataSource);

  39.     // 将数据分割成行
  40.     $lines = explode("\n", $data);

  41.     // 当前分类项目
  42.     $currentItem = '';

  43.     foreach ($lines as $line) {
  44.         $line = trim($line);
  45.         if (empty($line)) continue; // 跳过空行

  46.         if (strpos($line, '#genre#') !== false) {
  47.             // 新的分类项目
  48.             $currentItem = str_replace('#genre#', '', $line);
  49.         } else {
  50.             // 分割标题和URL
  51.             $parts = explode(',', $line, 2);
  52.             if (count($parts) == 2) {
  53.                 list($title, $url) = $parts;
  54.                 $title = trim($title);
  55.                 $url = trim($url);

  56.                 // 替换标题中的指定字符串
  57.                 $title = preg_replace('/CCTV\-(\d+)\s+.*/', 'CCTV$1', $title);
  58.                 $title = str_replace('CCTV-5+ 体育赛事', 'CCTV5+', $title); // 特殊处理CCTV-5+
  59.                 $title = str_replace('CCTV-4K 超高清', 'CCTV4K', $title); // 替换CCTV-4K
  60.                 $title = str_replace('CCTV-8K 超高清', 'CCTV8K', $title); // 替换CCTV-8K

  61.                 // 绑定参数并查询现有记录
  62.                 $selectStmt->bindValue(':item', $currentItem);
  63.                 $selectStmt->bindValue(':title', $title);
  64.                 $result = $selectStmt->execute();
  65.                 $existingRecord = $result->fetchArray(SQLITE3_ASSOC);

  66.                 if ($existingRecord) {
  67.                     // 如果存在记录,则合并URLs
  68.                     $existingUrls = explode('#', $existingRecord['url']);
  69.                     if (!in_array($url, $existingUrls)) {
  70.                         // 只有当URL不在现有URLs中时才合并
  71.                         $newUrl = $existingRecord['url'] . '#' . $url;
  72.                         $updateStmt->bindValue(':new_url', $newUrl);
  73.                         $updateStmt->bindValue(':item', $currentItem);
  74.                         $updateStmt->bindValue(':title', $title);
  75.                         $updateStmt->execute();
  76.                     }
  77.                 } else {
  78.                     // 如果不存在记录,则插入新记录
  79.                     $insertStmt->bindValue(':item', $currentItem);
  80.                     $insertStmt->bindValue(':title', $title);
  81.                     $insertStmt->bindValue(':epg', ''); // epg字段为空
  82.                     $insertStmt->bindValue(':url', $url);
  83.                     $insertStmt->bindValue(':isdel', $isdelCounter);
  84.                     $insertStmt->execute();
  85.                 }
  86.                
  87.                 // 递增isdel计数器
  88.                 $isdelCounter++;
  89.             }
  90.         }
  91.     }
  92. }

  93. // 关闭数据库连接
  94. $db->close();

  95. echo "Data processed successfully.";

  96. ?>
复制代码



点评

请问, '网址1', '网址2'指的是什么?  发表于 2024-1-24 17:14
可以这个m3u格式的直播源数据自动入库吗?最好自动识别是txt格式和m3u格式,自动读取本地文件夹中的直播源配置文件。  详情 回复 发表于 2024-1-7 15:05
做成php放在目录下,访问后数据库表清空了?  详情 回复 发表于 2024-1-7 10:03
能导入直播源,但出现Fatal error: Maximum execution time of 30 seconds exceeded in /www/diyp/TestTv.php on line 105  详情 回复 发表于 2024-1-5 14:44
建议先自动获取直播源写入临时表 tmp_list, 当确认获取成功后,再清空list表旧数据,用truncate table list; 会比delete更优化,然后 insert or ignore into list select * from tmp_list;  详情 回复 发表于 2024-1-2 17:12
功能越来越强大了, 给力, 支持!  发表于 2024-1-2 17:07
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2024-1-2 17:12 | 显示全部楼层
axiu0823 发表于 2024-1-2 15:08
自己捣鼓了写了一下,可以一键更新list表里的直播源,配合和楼主的xml2db.php用计划任务可以实现每天定时自 ...

建议先自动获取直播源写入临时表 tmp_list, 当确认获取成功后,再清空list表旧数据,用truncate table list; 会比delete更优化,然后 insert or ignore into list select * from tmp_list;

点评

主打一个听劝,然后我又有优化了一下对title进行格式化的函数,用起来没问题 我现在遇到的问题就是,我也不知道那个memcache缓存功能有没有开到,反正epg.php里的我是$iscache = true也没报错,应该就是开到了吧,在  详情 回复 发表于 2024-1-2 19:49
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2024-1-2 19:49 | 显示全部楼层
本帖最后由 axiu0823 于 2024-1-2 20:03 编辑
aming.ou 发表于 2024-1-2 17:12
建议先自动获取直播源写入临时表 tmp_list, 当确认获取成功后,再清空list表旧数据,用truncate table li ...

主打一个听劝,然后我又有优化了一下对title进行格式化的函数,用起来没问题
我现在遇到的问题就是,我也不知道那个memcache缓存功能有没有开到,反正epg.php里的我是$iscache = true也没报错,应该就是开到了吧,在浏览器打开/www/diyp/epg.php没报错
还有一个问题就是,我不能直接在数据库里创建tmp_list表,会报错,我只能在xml2db.php里的初始化数据库那段加上tmp_list表的初始化代码,然后用xml2db.php初始化数据库才能把tmp_list表弄出来

  1. <div class="quote"><blockquote><div class="quote"><blockquote><div class="quote"><blockquote><?php

  2. // 数据库文件路径
  3. $dbPath = 'channel_epg.db';

  4. // 打开或创建SQLite数据库
  5. $db = new SQLite3($dbPath);

  6. // 准备查询现有记录的SQL语句
  7. $selectSql = "SELECT url FROM tmp_list WHERE title = :title";
  8. $selectStmt = $db->prepare($selectSql);

  9. // 准备更新记录的SQL语句
  10. $updateSql = "UPDATE tmp_list SET url = :new_url WHERE title = :title";
  11. $updateStmt = $db->prepare($updateSql);

  12. // 准备插入新记录的SQL语句
  13. $insertTmpSql = "INSERT INTO tmp_list (item, title, epg, url, isdel) VALUES (:item, :title, :epg, :url, :isdel)";
  14. $insertTmpStmt = $db->prepare($insertTmpSql);

  15. // 网站数据源URL数组
  16. $dataSources = [
  17.     'https://fanmingming.com/txt?url=https://live.fanmingming.com/tv/m3u/ipv6.m3u',
  18.     'https://iptv.b2og.com/txt/ycl_iptv.txt'
  19. ];

  20. // 对title进行格式化的函数
  21. function formatTitle($title) {
  22.     // 替换CCTV-数字及可能跟随的非数字字符,如字母或加号
  23.     return preg_replace('/CCTV-(\d+[A-Za-z+]*)\s*\S*/', 'CCTV$1', $title);
  24. }

  25. // 初始化isdel计数器
  26. $isdelCounter = 1;

  27. // 开始处理数据源
  28. foreach ($dataSources as $dataSource) {
  29.     // 获取数据
  30.     $data = file_get_contents($dataSource);
  31.     if ($data === false) {
  32.         echo "Error: Unable to fetch data from $dataSource.\n";
  33.         continue;
  34.     }

  35.     // 将数据分割成行
  36.     $lines = explode("\n", $data);

  37.     // 当前分类项目
  38.     $currentItem = '';

  39.     foreach ($lines as $line) {
  40.         $line = trim($line);
  41.         if (empty($line)) continue;

  42.         if (strpos($line, '#genre#') !== false) {
  43.             // 提取item
  44.             list($currentItem, ) = explode(',', $line);
  45.             $currentItem = trim(str_replace('#genre#', '', $currentItem));
  46.         } else {
  47.             // 分割标题和URL
  48.             list($title, $url) = explode(',', $line, 2);
  49.             $title = trim($title);
  50.             $url = trim($url);

  51.             // 格式化title
  52.             $title = formatTitle($title);

  53.             // 检查数据库中是否存在相同的title
  54.             $selectStmt->bindValue(':title', $title);
  55.             $result = $selectStmt->execute();
  56.             $existingRecord = $result->fetchArray(SQLITE3_ASSOC);

  57.             if ($existingRecord) {
  58.                 // 如果存在相同的title,则合并URL
  59.                 $newUrl = $existingRecord['url'] . '#' . $url;
  60.                 $updateStmt->bindValue(':new_url', $newUrl);
  61.                 $updateStmt->bindValue(':title', $title);
  62.                 $updateStmt->execute();
  63.             } else {
  64.                 // 如果不存在相同的title,则插入新记录
  65.                 $insertTmpStmt->bindValue(':item', $currentItem);
  66.                 $insertTmpStmt->bindValue(':title', $title);
  67.                 $insertTmpStmt->bindValue(':epg', ''); // EPG默认为空
  68.                 $insertTmpStmt->bindValue(':url', $url);
  69.                 $insertTmpStmt->bindValue(':isdel', $isdelCounter);
  70.                 $insertTmpStmt->execute();

  71.                 // 递增isdel计数器
  72.                 $isdelCounter++;
  73.             }
  74.         }
  75.     }
  76. }

  77. // 数据处理完成,开始转移数据到list表
  78. // 开始一个事务,确保数据的一致性
  79. $db->exec('BEGIN TRANSACTION;');

  80. try {
  81.     // 清空list表
  82.     $db->exec("DELETE FROM list");

  83.     // 将tmp_list表的内容插入到list表中,忽略重复的记录
  84.     $db->exec("INSERT OR IGNORE INTO list SELECT * FROM tmp_list");

  85.     // 清空tmp_list表
  86.     $db->exec("DELETE FROM tmp_list");

  87.     // 提交事务
  88.     $db->exec('COMMIT;');
  89.     echo "Data has been successfully transferred from tmp_list to list and tmp_list is cleared.\n";
  90. } catch (Exception $e) {
  91.     // 如果有任何错误,回滚事务
  92.     $db->exec('ROLLBACK;');
  93.     echo "An error occurred: " . $e->getMessage() . "\n";
  94. }

  95. // 关闭数据库连接
  96. $db->close();
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

点评

参考你的代码,我也改改改了一个php M3U/TXT直播源数据处理PHPt源码 https://www.right.com.cn/forum/thread-8332119-1-1.html  详情 回复 发表于 2024-1-8 21:08
能不能说明一下,直接在数据库里创建tmp_list表的位置啊?或者给个修改好的xml2db.php;还有具体说明一下执行完成的整个流程。谢谢  详情 回复 发表于 2024-1-4 17:24
用phpstufy切换了几个php版本环境进行channel.php中创建tmp_list表,都可以成功创建。 CREATE TABLE 'tmp_list' (item text, title text, epg text, url text, isdel integer null default 120,constraint name_pk p  详情 回复 发表于 2024-1-2 20:24
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2024-1-2 20:24 | 显示全部楼层
本帖最后由 aming.ou 于 2024-1-3 09:47 编辑
axiu0823 发表于 2024-1-2 19:49
主打一个听劝,然后我又有优化了一下对title进行格式化的函数,用起来没问题
我现在遇到的问题就是,我也 ...

用phpstudy切换了几个php版本环境进行channel.php中创建tmp_list表,都可以成功创建。
CREATE TABLE 'tmp_list' (item text, title text, epg text, url text, isdel integer null default 120)

另外, memcache缓存,需要安装memcached服务,然后php.ini中也要加载extension=memcache; 这样$iscache = true;才会真正起作用。
至于epg.php中就算设置了$iscache = true;也不报错,是因为代码中做了容错判断。
其实epg.php中增加了一个参数$isw = false; 就算没有缓存服务,由于没有写epg请求日志,所以也可以非常快,每秒钟可以接受20次左右的请求。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

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

GMT+8, 2024-10-15 16:19

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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

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