├── 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 = '' + item.tvtitle + ''; 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 = '' + item.title + ''; 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 | --------------------------------------------------------------------------------