zikwall/m3u-content-parser

此包最新版本(dev-master)没有可用的许可证信息。

dev-master 2022-04-06 12:35 UTC

This package is auto-updated.

Last update: 2024-09-06 17:46:00 UTC


README

m3u 内容解析器

简洁、功能性强且易于使用的播放列表解析器

示例用法

use zikwall\m3ucontentparser\M3UContentParser;
use zikwall\m3ucontentparser\M3UItem;

$parser = new M3UContentParser('https://iptv-org.github.io/iptv/countries/ru.m3u');
$parser->parse();

foreach ($parser->limit(20)->all() as $item) {
    /**
     * @var $item M3UItem
     */
    echo
        $item->getTvgName(),    PHP_EOL,
        $item->getTvgLogo(),    PHP_EOL,
        $item->getTvgUrl(),     PHP_EOL,
        $item->getGroupTitle(), PHP_EOL,
        $item->getId(),         PHP_EOL;
        $item->getGroupId(),    PHP_EOL,
        $item->getLanguage(),   PHP_EOL,
        $item->getCountry();
}

更多示例

// rewrite current m3u content
foreach ($parser->all() as $item) {
    /**
     * @var $item M3UItem
     */
     $item
             ->replaceTvgName('UNNAMED ITEM')
             ->replaceTvgLogo('NEW LOGO URL')
             ->replaceTvgUrl('CHANE NEW URL');   
}

echo $parser->rewriteM3UFile();

output example:
#EXTM3U url-tvg="http://iptvx.one/epg/epg.xml.gz"
#EXTINF:-1 group-title="Новости",UNNAMED ITEM
CHANE NEW URL
#EXTINF:-1 group-title="Новости",UNNAMED ITEM
CHANE NEW URL

分段解析器

use zikwall\m3ucontentparser\SegmentM3U;
$segmant = new SegmentM3U();
$fragment->attachSource('examples/segments/index.m3u8')->parse();

print_r($segment->getFragments());
print_r($segment->getSegments());
print_r($segment->getTime());
var_dump($segment->getIsEnding());

复杂示例

use zikwall\m3ucontentparser\M3UContentParser;
use zikwall\m3ucontentparser\SegmentM3U;
use zikwall\m3ucontentparser\M3UItem;
use zikwall\m3ucontentparser\FragmentM3UItem;

$parser = new M3UContentParser('https://iptv-org.github.io/iptv/countries/ru.m3u');
$parser->parse();

foreach ($parser->limit(10)->offset(10)->all() as $item) {
    /**
     * @var $item M3UItem
     */
    $segment = new SegmentM3U();
    $segment->attachSource($item->getTvgUrl())->parse();

    if ($segment->getIsFragmentSource() === true) {
        /**
         * @var $fragment FragmentM3UItem
         */
        echo $segment->getCleanSource(), PHP_EOL;
        foreach ($segment->getFragments() as $fragment) {
            $subSegment = new SegmentM3U();
            $subSegment->attachSource($segment->getNewSource($fragment->fragment))->parse();

            echo $segment->getNewSource($fragment->fragment), PHP_EOL;
        }

        continue;
    }

    // ... conventional segment processing
    foreach ($segment->getSegments() as $segmentItem) {
        /**
         * @var $segmentItem SegmentM3UItem
         */
        echo $segment->getNewSource($segmentItem->segment), PHP_EOL;
//        display generated chunk links
//        http://xxxxx/stream8/stream2020_2_23_13_44_7-65006.ts
//        http://xxxxx/stream8/stream2020_2_23_13_44_18-65007.ts
//        http://xxxxx/stream8/stream2020_2_23_13_44_28-65008.ts
//        ...
    }
}

看起来很复杂?其实更简单!

$segment = new SegmentM3U();
$segment->attachSource('http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/variable.m3u8')->parse();

if ($segment->getIsFragmentSource() === true) {
    $segments = [];
    foreach ($segment->getFragments() as $fragment) {
        $subSegment = new SegmentM3U();
        $subSegment->attachSource($segment->getNewSource($fragment->fragment))->parse();

        echo $segment->getNewSource($fragment->fragment), PHP_EOL;

        /**
         * Get total duration
         */
        echo sprintf('Duration is: %0.2f seconds', $subSegment->getDuration()), PHP_EOL;

        foreach ($subSegment->getSegments() as $sgmt) {
            echo $subSegment->getNewSource($sgmt->segment), PHP_EOL;
        }
    }

    /**
     * Original: http://mhd.xxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/variable.m3u8
     * Cleaning: http://mhd.xxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vl2w/
     *
     * Return stream links (FRAGMENTS):
     *  - http://mhd.xxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vl2w/playlist.m3u8 // LOW
     *  - http://mhd.xxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vm2w/playlist.m3u8 // MIDDLE
     *  - http://mhd.xxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/playlist.m3u8 // HIGH
     */

    /**
     * Each all fragments return SegmentM3UItem Object
     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/playlist.m3u8
     *
     * Array
     *  (
     *      [0] => zikwall\m3ucontentparser\SegmentM3UItem Object
     *      (
     *          [duration] => 6
     *          [segment] => segment-1582439833-08914115.ts
     *      )
     *      [1] => zikwall\m3ucontentparser\SegmentM3UItem Object
     *      (
     *          [duration] => 6
     *          [segment] => segment-1582439833-08914116.ts
     *      )
     *      ...
     */

    /**
     * Convert to valid links, example:
     *
     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914207.ts
     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914208.ts
     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914209.ts
     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914210.ts
     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914211.ts
     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914212.ts
     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914213.ts
     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914214.ts
     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914215.ts
     */
}

更简单

$segment = new SegmentM3U();
$segment->attachSource('http://hls.kinoplayer.co/hls/PaSSagir.iz.SanFranCissko.2O17.HDRip/playlist.m3u8')->parse();

foreach ($segment->getSegments() as $sgmt) {
    echo $segment->getNewSource($sgmt->segment), PHP_EOL;
}

echo sprintf('Duration is: %0.2f seconds', $segment->getDuration()), PHP_EOL;

更多分段解析器示例

您可以尝试不同的示例组合

API

  1. 解析器构造函数接受一个链接或文件路径
$parser = new M3UContentParser('https://iptv-org.github.io/iptv/countries/ru.m3u');
  1. 解析通过相同的方法调用
$parser->parse();

m3u 解析器中的方法

  • getCahce()
  • getResfresh()
  • getTvgUrl()
  • limit(int)
  • offset(int)
  • all()
  • getItems()
  • rewriteM3UFile()

m3u 项目对象中的方法

  • getId()
  • getTvgId()
  • getTvgName()
  • getTvgUrl()
  • getTvgLogo()
  • getTvgShift()
  • getGroupId()
  • getGroupTitle()
  • getExtGrp()
  • getCensored()
  • getLanguage()
  • getCountry()
  • getAudioTrack()
  • getAudioTrackNum()
  • getExtraAttributes()

API 分段

  • getFragments() 返回具有属性的轨道数组
  • getSegments() 返回轨道中的分段数组
  • getTime() 返回时间码数组:小时、分钟、秒和字符串格式 HH:MM:SS 及原始值
  • getDuration() 返回秒的浮点值持续时间
  • getIsEnding() 返回布尔值,指示流是否有结束
  • getIsFragmentSource()
  • getNewSource(string $sub_source)
  • getHashHeaders()
  • getDirtyItems()

安装

composer require zikwall/m3u-content-parser

开发模式

{
    "minimum-stability": "dev",
    "repositories": [
        {
            "type": "git",
            "url": "https://github.com/zikwall/m3u-content-parser.git"
        }
    ],
    "require": {
        "zikwall/m3u-content-parser": "dev-master"
    }
}

有问题?

对于所有问题和建议 - 欢迎提交问题