我想知道是否有任何方法可以使用Linux shell或PHP将M3U8个播放列表转换为XML个?例如

M3U8播放列表文件

#EXTM3U
#EXTINF:-1 tvg-name="Canal 26" tvg-logo="https://demo.com/xDjOUuz.png" group-title="Argentina",
https://demolivevideo1.com/playlist.m3u8
#EXTINF:-1 tvg-name="LN"  tvg-logo="https://demo2.com/vJYzGt1.png" group-title="Argentina",
https://demolivevideo2.com/playlist.m3u8
#EXTINF:-1 tvg-name="ABC" tvg-logo="https://demo3.com/5CVl5EF.png" group-title="Australia",
https://demolivevideo3.com/playlist.m3u8

转换后的XML文件 struct .

<?xml version="1.0" encoding="utf-8"?>
<data>
  <channels>
    <name>Canal 26</name>
    <banner>https://demo.com/xDjOUuz.png</banner>
    <url>https://demolivevideo1.com/playlist.m3u8</url>
    <country>Australia</country>
  </channels>
  <channels>
    <name>LN</name>
    <banner>https://demo.com/xDjOUuz.png</banner>
    <url>https://demolivevideo2.com/playlist.m3u8</url>
    <country>Australia</country>
  </channels>
  <channels>
    <name>ABC</name>
    <banner>https://demo.com/xDjOUuz.png</banner>
    <url>https://demolivevideo3.com/playlist.m3u8</url>
    <country>Australia</country>
  </channels>
</data>

推荐答案

这是一个有点(实际上是很多)的黑客(一些字符串替换和拆分),但它应该能让你达到目的,或者足够接近(在PHP中):

$m3u = '[your playlist above]
';            

$newFile = '<?xml version="1.0" encoding="utf-8"?>
<data></data>
';   

$doc = new DOMDocument();
$doc->loadXML($newFile);
$xpath = new DOMXpath($doc);
$destination = $xpath->query('/data');

#some of the steps next can be combined, but I left them separate for readability
$step1 = explode('#EXTINF:-1 ',str_replace('#EXTM3U','',$m3u));
$step2 = array_slice($step1,1);

foreach ($step2 as $item) {
    $step3 = str_replace('" ','" xxx',explode(',', $item));
    $step4 = explode('xxx',$step3[0]);
    $link = explode(',',$item)[1];
    $params = [];
    foreach ($step4 as $step)
       {
       $param = explode('=',$step)[1];
       array_push($params,$param);
       }

    #create you <channels> template
    $chan = "
    <channels>
    <name>{$params[0]}</name>
    <banner>{$params[1]}</banner>
    <url>{$link}</url>
    <country>{$params[2]}</country>  
    </channels>";

    $template = $doc->createDocumentFragment();
    $template->appendXML($chan);
    $destination[0]->appendChild($template);
       
};

echo $doc->saveXml();

这应该是你的预期输出.

Php相关问答推荐

如何在Livewire中验证多个 Select 字段

如何发送woocommerce订单跟踪码与短信

一列必须指定多个变量的Laravel查询

WooCommerce管理订单列表自定义列不显示值

使用正则表达式搜索两个子字符串(没有重叠/共享字符)

PHP-带POST验证的for循环

在PHP中读取JSON

PHP文件上载问题-";Move_Uploaded_Files";未按预期工作

在Laravel中创建辅助函数时的约定

Select 本地提货时隐藏WooCommerce显示的发货成本

在WooCommerce存档页面中显示可变产品的库存变化属性

如何在codeigniter中将order_by RAND与下面的代码一起使用

Woocommerce 临时购物车税未根据第一个请求正确计算

在php中计算两个没有假期的日期之间的小时差

注册命名空间后如何获取xml node 值?

计算数组中连续值的数量

从图像URL中获取文件扩展名?

WooCommerce单个产品页面上启用额外选项卡的产品元框字段

从 CSV 文件 seeder 数据库时的额外行

如何在 php/laravel 中获取元素在数组中的位置