{"id":19273590,"url":"https://github.com/zikwall/m3u-content-parser","last_synced_at":"2025-07-07T19:16:40.156Z","repository":{"id":42431155,"uuid":"236912282","full_name":"zikwall/m3u-content-parser","owner":"zikwall","description":"PHP parser m3u content","archived":false,"fork":false,"pushed_at":"2022-04-06T12:35:47.000Z","size":27,"stargazers_count":12,"open_issues_count":0,"forks_count":7,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-06-18T21:20:03.971Z","etag":null,"topics":["content","m3u","m3u-parser","m3u-playlist","m3u8","parser","php","playlist"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zikwall.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-01-29T05:43:22.000Z","updated_at":"2024-09-03T22:16:18.000Z","dependencies_parsed_at":"2022-09-11T03:10:35.895Z","dependency_job_id":null,"html_url":"https://github.com/zikwall/m3u-content-parser","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/zikwall/m3u-content-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zikwall%2Fm3u-content-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zikwall%2Fm3u-content-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zikwall%2Fm3u-content-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zikwall%2Fm3u-content-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zikwall","download_url":"https://codeload.github.com/zikwall/m3u-content-parser/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zikwall%2Fm3u-content-parser/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262341625,"owners_count":23296070,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["content","m3u","m3u-parser","m3u-playlist","m3u8","parser","php","playlist"],"created_at":"2024-11-09T20:43:33.513Z","updated_at":"2025-06-27T22:07:30.368Z","avatar_url":"https://github.com/zikwall.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003ch1\u003em3u Content Parser\u003c/h1\u003e\n    \u003ch5\u003eMinimalistic, functional and easy to use playlist parser\u003c/h5\u003e\n\u003c/div\u003e\n\n### Example usage\n\n```php\n\nuse zikwall\\m3ucontentparser\\M3UContentParser;\nuse zikwall\\m3ucontentparser\\M3UItem;\n\n$parser = new M3UContentParser('https://iptv-org.github.io/iptv/countries/ru.m3u');\n$parser-\u003eparse();\n\nforeach ($parser-\u003elimit(20)-\u003eall() as $item) {\n    /**\n     * @var $item M3UItem\n     */\n    echo\n        $item-\u003egetTvgName(),    PHP_EOL,\n        $item-\u003egetTvgLogo(),    PHP_EOL,\n        $item-\u003egetTvgUrl(),     PHP_EOL,\n        $item-\u003egetGroupTitle(), PHP_EOL,\n        $item-\u003egetId(),         PHP_EOL;\n        $item-\u003egetGroupId(),    PHP_EOL,\n        $item-\u003egetLanguage(),   PHP_EOL,\n        $item-\u003egetCountry();\n}\n\n```\n\n### More example\n\n```php\n\n// rewrite current m3u content\nforeach ($parser-\u003eall() as $item) {\n    /**\n     * @var $item M3UItem\n     */\n     $item\n             -\u003ereplaceTvgName('UNNAMED ITEM')\n             -\u003ereplaceTvgLogo('NEW LOGO URL')\n             -\u003ereplaceTvgUrl('CHANE NEW URL');   \n}\n\necho $parser-\u003erewriteM3UFile();\n\noutput example:\n#EXTM3U url-tvg=\"http://iptvx.one/epg/epg.xml.gz\"\n#EXTINF:-1 group-title=\"Новости\",UNNAMED ITEM\nCHANE NEW URL\n#EXTINF:-1 group-title=\"Новости\",UNNAMED ITEM\nCHANE NEW URL\n```\n\n### Segment Parser\n\n```php\n\nuse zikwall\\m3ucontentparser\\SegmentM3U;\n$segmant = new SegmentM3U();\n$fragment-\u003eattachSource('examples/segments/index.m3u8')-\u003eparse();\n\nprint_r($segment-\u003egetFragments());\nprint_r($segment-\u003egetSegments());\nprint_r($segment-\u003egetTime());\nvar_dump($segment-\u003egetIsEnding());\n\n```\n\n### Complex sample\n\n```php\n\nuse zikwall\\m3ucontentparser\\M3UContentParser;\nuse zikwall\\m3ucontentparser\\SegmentM3U;\nuse zikwall\\m3ucontentparser\\M3UItem;\nuse zikwall\\m3ucontentparser\\FragmentM3UItem;\n\n$parser = new M3UContentParser('https://iptv-org.github.io/iptv/countries/ru.m3u');\n$parser-\u003eparse();\n\nforeach ($parser-\u003elimit(10)-\u003eoffset(10)-\u003eall() as $item) {\n    /**\n     * @var $item M3UItem\n     */\n    $segment = new SegmentM3U();\n    $segment-\u003eattachSource($item-\u003egetTvgUrl())-\u003eparse();\n\n    if ($segment-\u003egetIsFragmentSource() === true) {\n        /**\n         * @var $fragment FragmentM3UItem\n         */\n        echo $segment-\u003egetCleanSource(), PHP_EOL;\n        foreach ($segment-\u003egetFragments() as $fragment) {\n            $subSegment = new SegmentM3U();\n            $subSegment-\u003eattachSource($segment-\u003egetNewSource($fragment-\u003efragment))-\u003eparse();\n\n            echo $segment-\u003egetNewSource($fragment-\u003efragment), PHP_EOL;\n        }\n\n        continue;\n    }\n\n    // ... conventional segment processing\n    foreach ($segment-\u003egetSegments() as $segmentItem) {\n        /**\n         * @var $segmentItem SegmentM3UItem\n         */\n        echo $segment-\u003egetNewSource($segmentItem-\u003esegment), PHP_EOL;\n//        display generated chunk links\n//        http://xxxxx/stream8/stream2020_2_23_13_44_7-65006.ts\n//        http://xxxxx/stream8/stream2020_2_23_13_44_18-65007.ts\n//        http://xxxxx/stream8/stream2020_2_23_13_44_28-65008.ts\n//        ...\n    }\n}\n\n```\n\n### Seemed complicated? It is even easier!\n\n```php\n$segment = new SegmentM3U();\n$segment-\u003eattachSource('http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/variable.m3u8')-\u003eparse();\n\nif ($segment-\u003egetIsFragmentSource() === true) {\n    $segments = [];\n    foreach ($segment-\u003egetFragments() as $fragment) {\n        $subSegment = new SegmentM3U();\n        $subSegment-\u003eattachSource($segment-\u003egetNewSource($fragment-\u003efragment))-\u003eparse();\n\n        echo $segment-\u003egetNewSource($fragment-\u003efragment), PHP_EOL;\n\n        /**\n         * Get total duration\n         */\n        echo sprintf('Duration is: %0.2f seconds', $subSegment-\u003egetDuration()), PHP_EOL;\n\n        foreach ($subSegment-\u003egetSegments() as $sgmt) {\n            echo $subSegment-\u003egetNewSource($sgmt-\u003esegment), PHP_EOL;\n        }\n    }\n\n    /**\n     * Original: http://mhd.xxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/variable.m3u8\n     * Cleaning: http://mhd.xxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vl2w/\n     *\n     * Return stream links (FRAGMENTS):\n     *  - http://mhd.xxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vl2w/playlist.m3u8 // LOW\n     *  - http://mhd.xxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vm2w/playlist.m3u8 // MIDDLE\n     *  - http://mhd.xxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/playlist.m3u8 // HIGH\n     */\n\n    /**\n     * Each all fragments return SegmentM3UItem Object\n     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/playlist.m3u8\n     *\n     * Array\n     *  (\n     *      [0] =\u003e zikwall\\m3ucontentparser\\SegmentM3UItem Object\n     *      (\n     *          [duration] =\u003e 6\n     *          [segment] =\u003e segment-1582439833-08914115.ts\n     *      )\n     *      [1] =\u003e zikwall\\m3ucontentparser\\SegmentM3UItem Object\n     *      (\n     *          [duration] =\u003e 6\n     *          [segment] =\u003e segment-1582439833-08914116.ts\n     *      )\n     *      ...\n     */\n\n    /**\n     * Convert to valid links, example:\n     *\n     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914207.ts\n     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914208.ts\n     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914209.ts\n     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914210.ts\n     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914211.ts\n     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914212.ts\n     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914213.ts\n     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914214.ts\n     * http://mhd.xxxxxxx.tv/p/k5OqlMqeQONvANUJOq9GFQ,1582553567/streaming/ntvnn/324/vh1w/segment-1582439833-08914215.ts\n     */\n}\n```\n\n### Even easier\n\n```php\n\n$segment = new SegmentM3U();\n$segment-\u003eattachSource('http://hls.kinoplayer.co/hls/PaSSagir.iz.SanFranCissko.2O17.HDRip/playlist.m3u8')-\u003eparse();\n\nforeach ($segment-\u003egetSegments() as $sgmt) {\n    echo $segment-\u003egetNewSource($sgmt-\u003esegment), PHP_EOL;\n}\n\necho sprintf('Duration is: %0.2f seconds', $segment-\u003egetDuration()), PHP_EOL;\n\n```\n\n### More examples Segment parser\n\nYou can try different combinations of examples yourself\n\n### API\n\n1. The parser constructor accepts a link or file path:\n```php\n$parser = new M3UContentParser('https://iptv-org.github.io/iptv/countries/ru.m3u');\n```\n\n2. Parsing is called by the same method:\n```php\n$parser-\u003eparse();\n```\n\n### Methods in m3u parser\n\n- [x] `getCahce()`\n- [x] `getResfresh()`\n- [x] `getTvgUrl()`\n- [x] `limit(int)`\n- [x] `offset(int)`\n- [x] `all()`\n- [x] `getItems()`\n- [x] `rewriteM3UFile()`\n\n### Methods in m3u item object\n\n- [x] `getId()`\n- [x] `getTvgId()`\n- [x] `getTvgName()`\n- [x] `getTvgUrl()`\n- [x] `getTvgLogo()`\n- [x] `getTvgShift()`\n- [x] `getGroupId()`\n- [x] `getGroupTitle()`\n- [x] `getExtGrp()`\n- [x] `getCensored()`\n- [x] `getLanguage()`\n- [x] `getCountry()`\n- [x] `getAudioTrack()`\n- [x] `getAudioTrackNum()`\n- [x] `getExtraAttributes()`\n\n### API Segment\n\n- [x] `getFragments()` return array of tracks with props\n- [x] `getSegments()` return array of segments in track\n- [x] `getTime()` return array of timecodes: hours, minutes, seconds and string format HH:MM:SS \u0026 original value\n- [x] `getDuration()` return float value duration of seconds\n- [x] `getIsEnding()` return bool value, indicates whether the stream has an ending or not \n- [x] `getIsFragmentSource()`\n- [x] `getNewSource(string $sub_source)`\n- [x] `getHashHeaders()`\n- [x] `getDirtyItems()`\n\n### Installation\n\n`composer require zikwall/m3u-content-parser`\n\n### Develop Mode\n\n```json\n{\n    \"minimum-stability\": \"dev\",\n    \"repositories\": [\n        {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/zikwall/m3u-content-parser.git\"\n        }\n    ],\n    \"require\": {\n        \"zikwall/m3u-content-parser\": \"dev-master\"\n    }\n}\n```\n\n#### Questions?\n\nFor all questions and suggestions - welcome to Issues\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzikwall%2Fm3u-content-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzikwall%2Fm3u-content-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzikwall%2Fm3u-content-parser/lists"}