├── README.md
├── getm3upls-simple.js
├── getm3upls.js
├── m3u-parser-simple.php
├── m3u-parser.php
└── ressources
└── demofile.m3u
/README.md:
--------------------------------------------------------------------------------
1 | # m3u8 / m3u PHP Parser
2 |
3 | m3u PHP Parser.m3u8 parser to json
4 |
5 | ## How to use it? (With or without callback)
6 |
7 | `/m3u-parser.php?callback=jQuery112403360297908445591&url=https://bit.ly/IPTVLIVE`
8 |
9 | `/m3u-parser.php?url=https://raw.githubusercontent.com/onigetoc/m3u8-PHP-Parser/master/ressources/demofile.m3u`
10 |
11 | Markdown created with [Editconvert](http://codesniff.com/editconvert/)
12 |
13 | ## Result for m3u-parser.php
14 |
15 | ```json
16 | {
17 | "list": {
18 | "service": "iptv",
19 | "title": "iptv",
20 | "item": [
21 | {
22 | "service": "iptv",
23 | "title": "Rrokum",
24 | "playlistURL": "https://raw.githubusercontent.com/onigetoc/m3u8-PHP-Parser/master/ressources/demofile.m3u",
25 | "media_url": "http://82.114.65.202:1935/live/rrokumtv/playlist.m3u8",
26 | "url": "http://82.114.65.202:1935/live/rrokumtv/playlist.m3u8",
27 | "id": "RrokumTV.al",
28 | "aspect-ratio": "16:9",
29 | "author": "RrokumTV.al",
30 | "language": "Albanian/Kosovo",
31 | "country": "KS",
32 | "thumb_square": "https://2.bp.blogspot.com/-adXhlGiHqxw/WSGCBl9Y8LI/AAAAAAAAD5Q/-t48sLv989Uxb5hgB0b38QlfTdoAE576ACLcB/s1600/tvrrokum.png",
33 | "group": "TVSHQIP"
34 | },
35 | {
36 | "service": "iptv",
37 | "title": "JTV",
38 | "playlistURL": "https://raw.githubusercontent.com/onigetoc/m3u8-PHP-Parser/master/ressources/demofile.m3u",
39 | "media_url": "http://84.20.77.50:554/live/rtmp.stream/playlist.m3u8",
40 | "url": "http://84.20.77.50:554/live/rtmp.stream/playlist.m3u8",
41 | "id": "TVJUG.AL",
42 | "author": "TVJUG.AL",
43 | "language": "Albanian/Kosovo",
44 | "country": "AL",
45 | "thumb_square": "https://4.bp.blogspot.com/-LXFMStwz6tI/WSGLzk0QgVI/AAAAAAAAD6I/T-rFp4KD_c4zbCRN9hGrjy_jS2nmXgPJwCLcB/s1600/tvjug.png",
46 | "group": "TVSHQIP"
47 | }
48 | ]
49 | }
50 | }
51 | ```
52 |
53 | ## Result for m3u-parser-simple.php
54 |
55 | ```json
56 | [
57 | {
58 | "id": 1,
59 | "tvtitle": "Newsmax TV",
60 | "tvmedia": "http://nmxlive.akamaized.net/hls/live/529965/Live_1/index.m3u8",
61 | "tvname": "Newsmax TV",
62 | "tvlanguage": "English",
63 | "tvcountry": "US",
64 | "tvid": "Newsmax-TV",
65 | "tvlogo": "http://i.imgur.com/Twkovic.gif",
66 | "tvgroup": "Entertainment"
67 | },
68 | {
69 | "id": 2,
70 | "tvtitle": "Infowars Live",
71 | "tvmedia": "http://infowarslive-lh.akamaihd.net/i/infowarslivestream_1@353459/index_800_av-p.m3u8",
72 | "tvlogo": "http://i.imgur.com/ODIWC6n.jpg",
73 | "tvname": "Infowars",
74 | "tvid": "Infowars",
75 | "tvgroup": "News"
76 | },
77 | ]
78 | ```
79 |
80 | #### I used M3U8 PHP Parser on my website to load and play multiple IPTV Playlists (With ajax) and with my Videojs [videojs-unmute](https://github.com/onigetoc/videojs-unmute) plugin to mute & unmute autoplayed video.
81 | Live Demo: [hlsiptv.com](https://hlsiptv.com/)
82 |
--------------------------------------------------------------------------------
/getm3upls-simple.js:
--------------------------------------------------------------------------------
1 | $(document).ready(function() {
2 | getPlaylists("https://pastebin.com/raw/t1mBJ2Yi");
3 | $('#m3uForm').on('submit', function(e) {
4 | e.preventDefault();
5 | var playlists = $('#playlists').val();
6 | getPlaylists(playlists);
7 | });
8 | });
9 | function getPlaylists(playlists) {
10 | $('#result').html('');
11 | $.ajax({
12 | url: '//yourwebsite.com/m3u8-PHP-Parser/m3u-parser-simple.php',
13 | method: 'GET',
14 | dataType: 'jsonP',
15 | data: {
16 | url: playlists,
17 | }
18 | }).done(function(data) {
19 | $('#result').text('Total: ' + data.length + ' Channels found');
20 | $.each(data, function(i, item) {
21 | var tvglogo = '';
22 | if (typeof item.tvlogo != 'undefined') tvglogo = '
';
23 | $('#result').append('
' + tvglogo + ' â–º ' + item.tvtitle + '
' + item.tvmedia + '');
24 | });
25 | });
26 | }
27 | /* TEST TO LOAD VIDEO WITH VIDEOJS */
28 | /*
29 | $(document).on('click', '#result a', function(e) {
30 | e.preventDefault();
31 | var $this = $(this);
32 | var vidTitle = $this.text().replace("â–º ", "");
33 | $('#vidTitle').text(vidTitle);
34 | $('#result a').removeClass('bold');
35 | $this.addClass('bold');
36 | var mediaUrl = $this.attr('href');
37 | loadStream(mediaUrl)
38 | });
39 | */
40 |
--------------------------------------------------------------------------------
/getm3upls.js:
--------------------------------------------------------------------------------
1 | $(document).ready(function () {
2 |
3 | //load playlist on ready
4 | getPlaylists("https://pastebin.com/raw/t1mBJ2Yi");
5 |
6 | $('#m3uForm').on('submit', function (e) {
7 | e.preventDefault();
8 |
9 | //var $this = $(this);
10 | var playlists = $('#playlists').val();
11 |
12 | getPlaylists(playlists);
13 |
14 | });
15 | });
16 |
17 | function getPlaylists(playlists) {
18 |
19 | $('#result').html(''); // empty list
20 |
21 | $.ajax({
22 | url: 'http://yourwebsite.com/GC-m3u-parser.php',
23 | method: 'GET',
24 | dataType: 'jsonP',
25 | data: {
26 | url: playlists
27 | }
28 | }).done(function (data) {
29 | //if(data.status != 'ok'){ throw data.message; }
30 |
31 | $('#result').text('Total: '+data.length+' Channels found'); // TOTAL COUNT
32 |
33 | $.each(data, function (i, item) {
34 |
35 | var tvglogo = '';
36 |
37 | if (typeof item["tvg-logo"] != 'undefined')
38 | tvglogo = '
';
39 |
40 | $('#result').append('' + tvglogo + ' ► ' + item.title + '
' + item.url + '');
41 |
42 | });
43 |
44 | });
45 |
46 | }
47 |
48 | /* TEST TO LOAD VIDEO WITH VIDEOJS */
49 | /*
50 | $(document).on('click', '#result a', function (e) {
51 | e.preventDefault();
52 |
53 | $('#result a').removeClass('bold');
54 | $(this).addClass('bold');
55 |
56 | var mediaUrl = $(this).attr('href');
57 | //alert(mediaUrl);
58 | loadStream(mediaUrl)
59 | });
60 | */
61 |
--------------------------------------------------------------------------------
/m3u-parser-simple.php:
--------------------------------------------------------------------------------
1 | ";
33 |
34 | preg_match($re, $list, $matchList);
35 |
36 | //$mediaURL = str_replace("\r\n","",$matchList[4]);
37 | //$mediaURL = str_replace("\n","",$matchList[4]);
38 | //$mediaURL = str_replace("\n","",$mediaURL);
39 | $mediaURL = preg_replace("/[\n\r]/","",$matchList[3]);
40 | $mediaURL = preg_replace('/\s+/', '', $mediaURL);
41 | //$mediaURL = preg_replace( "/\r|\n/", "", $matches[4] );
42 |
43 |
44 | $newdata = array (
45 | //'ATTRIBUTE' => $matchList[2],
46 | 'id' => $i++,
47 | 'tvtitle' => $matchList[2],
48 | 'tvmedia' => $mediaURL
49 | );
50 |
51 | preg_match_all($attributes, $list, $matches, PREG_SET_ORDER);
52 |
53 | foreach ($matches as $match) {
54 | $newdata[$match[1]] = $match[2];
55 | }
56 |
57 | //array_push($newdata,$attribute);
58 | //$newdata[] = $attribute;
59 |
60 | $items[] = $newdata;
61 | //$items[] = $matchList[2];
62 |
63 | }
64 |
65 | //print_r($items);
66 |
67 | $callback= $_GET['callback'];
68 |
69 | if($callback)
70 | echo $callback. '(' . json_encode($items) . ')'; // jsonP callback
71 | else
72 | echo json_encode($items);
73 |
74 | ?>
75 |
--------------------------------------------------------------------------------
/m3u-parser.php:
--------------------------------------------------------------------------------
1 | ";
49 |
50 | preg_match($re, $list, $matchList);
51 |
52 | //$mediaURL = str_replace("\r\n","",$matchList[4]);
53 | //$mediaURL = str_replace("\n","",$matchList[4]);
54 | //$mediaURL = str_replace("\n","",$mediaURL);
55 | $mediaURL = preg_replace("/[\n\r]/","",$matchList[3]);
56 | $mediaURL = preg_replace('/\s+/', '', $mediaURL);
57 | //$mediaURL = preg_replace( "/\r|\n/", "", $matches[4] );
58 |
59 |
60 | $newdata = array (
61 | //'ATTRIBUTE' => $matchList[2],
62 | 'service' => "iptv",
63 | 'title' => $matchList[2],
64 | //'playlistURL' => (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]",
65 | //'playlistURL' => str_replace("url=","",$_SERVER['QUERY_STRING']),
66 | 'playlistURL' => $url,
67 | 'media_url' => $mediaURL,
68 | 'url' => $mediaURL
69 | );
70 |
71 | preg_match_all($attributes, $list, $matches, PREG_SET_ORDER);
72 |
73 | foreach ($matches as $match) {
74 | $newdata[$match[1]] = $match[2];
75 | }
76 |
77 | //array_push($newdata,$attribute);
78 | //$newdata[] = $attribute;
79 |
80 | $items[] = $newdata;
81 | //$items[] = $matchList[2];
82 |
83 | }
84 |
85 | // $globalitem = array (
86 | // //'ATTRIBUTE' => $matchList[2],
87 | // 'item' => $items
88 | // );
89 |
90 | //$globalitem[$items] ;
91 | //$globalitems['item'] = $items;
92 |
93 | //$globalist['list'] = $globalitems;
94 |
95 | $globalitems = array (
96 | //'ATTRIBUTE' => $matchList[2],
97 | 'service' => "iptv",
98 | 'title' => "iptv",
99 | 'item' => $items,
100 | );
101 |
102 | $globalist['list'] = $globalitems;
103 |
104 | //print_r($items);
105 |
106 | $callback= $_GET['callback'];
107 |
108 | if($callback)
109 | echo $callback. '(' . json_encode($globalist) . ')'; // jsonP callback
110 | else
111 | echo json_encode($globalist);
112 |
113 | ?>
114 |
--------------------------------------------------------------------------------
/ressources/demofile.m3u:
--------------------------------------------------------------------------------
1 | #EXTM3U
2 | #EXTINF:0 tvg-id="RrokumTV.al" aspect-ratio="16:9" tvg-name="RrokumTV.al" tvg-language="Albanian/Kosovo" tvg-country="KS" tvg-logo="https://2.bp.blogspot.com/-adXhlGiHqxw/WSGCBl9Y8LI/AAAAAAAAD5Q/-t48sLv989Uxb5hgB0b38QlfTdoAE576ACLcB/s1600/tvrrokum.png" group-title="TVSHQIP",Rrokum
3 | http://82.114.65.202:1935/live/rrokumtv/playlist.m3u8
4 |
5 | #EXTINF:0 tvg-id="TVJUG.AL" tvg-name="TVJUG.AL" tvg-language="Albanian/Kosovo" tvg-country="AL" tvg-logo="https://4.bp.blogspot.com/-LXFMStwz6tI/WSGLzk0QgVI/AAAAAAAAD6I/T-rFp4KD_c4zbCRN9hGrjy_jS2nmXgPJwCLcB/s1600/tvjug.png" group-title="TVSHQIP",JTV
6 | http://84.20.77.50:554/live/rtmp.stream/playlist.m3u8
7 |
8 | #EXTINF:0 tvg-name="ALBUKTV.AL" tvg-language="Albanian/Kosovo" tvg-country="UK" tvg-id="ALBUKTV.AL" tvg-logo="https://2.bp.blogspot.com/-JtTZ7LDR_Ts/WSGB0Eh_DLI/AAAAAAAAD4I/ctrBMd8kIR4fQsyHZFlt8p7r3cYG_OeIQCLcB/s1600/tvalbuk1.png" group-title="TVSHQIP",AlbUK 1
9 | http://188.138.17.8:1935/albuk/albuk.stream/playlist.m3u8
10 |
11 | #EXTINF:0 tvg-name="ALBMOVIE.AL" tvg-language="Albanian/Kosovo" tvg-country="UK" tvg-id="ALBMOVIE.AL" tvg-logo="https://2.bp.blogspot.com/-0wmMRiRLsY4/WSGBzZ1dKXI/AAAAAAAAD4E/4CjH274jLKs2OQkKnkW_zDlhlSX8p7_fgCLcB/s1600/tvalbmovie.png" group-title="TVSHQIP",AlbMovie
12 | http://188.138.17.8:1935/albuk/albukplus.stream/playlist.m3u8
13 |
14 | #EXTINF:0 tvg-name="ALBMUSIC.AL" tvg-language="Albanian/Kosovo" tvg-country="UK" tvg-id="ALBMUSIC.AL" tvg-logo="https://4.bp.blogspot.com/-Ily2-rd6c90/WSGB2tBwfpI/AAAAAAAAD4Q/Psqk00WfpjsehfB1trf8l_zdAMySUxQvACLcB/s1600/tvalbusic.png" group-title="TVSHQIP",AlbMusic
15 | http://albukhd.dyndns.tv:1935/albuk/albmus.stream/playlist.m3u8
16 |
17 | #EXTINF:0 tvg-name="OraNews.al" tvg-language="Albanian/Kosovo" tvg-country="AL" tvg-id="OraNews.al" tvg-logo="https://2.bp.blogspot.com/-nG9yxIrl5pk/WSGL2GT-ojI/AAAAAAAAD6U/OuCPNsfZzoYTCi92L3JMNa_w1uCDFZdOgCLcB/s1600/tvora.png" group-title="TVSHQIP",OraNews
18 | http://109.236.81.91/hls/oranews/index.m3u8
19 |
20 | #EXTINF:0 tvg-name="KlanKosova.al" tvg-language="Albanian/Kosovo" tvg-country="KS" tvg-id="KlanKosova.al" tvg-logo="https://2.bp.blogspot.com/-y8QY6YXR8MM/WSGBxlph8oI/AAAAAAAAD30/5Z4gbuAK9LwctoK_x4-PegqxpyGIguK8ACLcB/s1600/tklankosova.png" group-title="TVSHQIP",Klan
21 | http://stream2.itprishtina.com:90/klanks/index.m3u8
22 |
23 | #EXTINF:0 tvg-name="Tetova.mk" tvg-language="Albanian/Kosovo" tvg-country="KS" tvg-id="Tetova.mk" tvg-logo="https://2.bp.blogspot.com/-RqDrazlvsPY/WSGL3G2ppSI/AAAAAAAAD6c/K3ZFZRqJanwHdW-S6wcLLoZS06EzwODbQCLcB/s1600/tvtetova.png" group-title="TVSHQIP",Tetova
24 | rtmp://ip.tvtetova.net:5119/live/tvtetova
25 |
--------------------------------------------------------------------------------