PHP: Icecast Now Playing Script not working

I am trying to use Icecast Now while playing in a PHP script with: https://code.google.com/p/icecast-now-playing-script/

I uploaded all the files to my web server after changing config.php. When I load example.php into the browser, this is the returned information:

Array ( [info] => Array ( [status] => OFF AIR ) ) 

I am not sure what the cause of the problem is. I have verified that the Icecast server information is correct. Opening: http://70.35.120.203:8000/zedg_mb.mp3.m3u starts playback of the stream. Here is the code:

example.php

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head profile="http://gmpg.org/xfn/11"> <title>Icecast Now Playing Script</title> </head> <body> <p> Code by Jude (<a href="mailto:surftheair@gmail.com">surftheair@gmail.com</a>) </p> <pre> <?php include('icecast.php'); print_r($stream); ?> </pre> </body> </html> 

config.php

 <?php //error_reporting(0); define(SERVER, 'http://70.35.120.203:8000');//your icecast server address, without the ending "/" define(MOUNT, '/zedg_mb.mp3.m3u'); //your radio mount point, with the leading "/" define(LAST_FM_API, 'xxxxxxxxxxxxxxxxxxxxxxx'); //your last.fm API key, get from http://www.last.fm/api/account define(DEFAULT_ALBUM_ART, 'http://www.channelztheedge.com/_images/others/othersZEDG-150sqd.png');//the default album art image, will be used if failed to get from last.fm API define(GET_TRACK_INFO, true); //get information of the current song from last.fm define(GET_ALBUM_INFO, true); //get extra information of the album from last.fm, if enabled, may increase script execute time define(GET_ARTIST_INFO, true); //get extra information of the artist from last.fm, if enabled, may increase script execute time define(GET_TRACK_BUY_LINK, false); //get buy links on Amazon, iTune and 7digital define(GET_LYRICS, true); //get lyrics of the current song using chartlyrics.com API define(CACHE_ALBUM_ART, true);//cache album art images to local server define(RECORD_HISTORY, true);//record play history of your radio ?> 

icecast.php

 <?php /* by Jude <surftheair@gmail.com> http://jude.im/ works with Icecast 2.3.2 */ require('config.php'); $stream = getStreamInfo(); if($stream['info']['status'] == 'OFF AIR'){ cacheVar($stream); } else{ $last_song = @file_get_contents('last.txt'); if($last_song != base64_encode($stream['info']['song'])){ $stream = init($stream); $stream = getInfo($stream); file_put_contents('last.txt', base64_encode($stream['info']['song'])); cacheVar($stream); if(RECORD_HISTORY == true){ cacheHistory($stream); } } else{ $stream = array_decode(json_decode(@file_get_contents('var/info.json'), TRUE)); } } //print_r($stream); function obj_to_array($obj){ $array = (is_object) ? (array)$obj : $obj; foreach($array as $k=>$v){ if(is_object($v) OR is_array($v)) $array[$k] = obj_to_array($v); } return $array; } function getStreamInfo(){ $str = @file_get_contents(SERVER.'/status.xsl?mount='.MOUNT); if(preg_match_all('/<td\s[^>]*class=\"streamdata\">(.*)<\/td>/isU', $str, $match)){ $stream['info']['status'] = 'ON AIR'; $stream['info']['title'] = $match[1][0]; $stream['info']['description'] = $match[1][1]; $stream['info']['type'] = $match[1][2]; $stream['info']['start'] = $match[1][3]; $stream['info']['bitrate'] = $match[1][4]; $stream['info']['listeners'] = $match[1][5]; $stream['info']['msx_listeners'] = $match[1][6]; $stream['info']['genre'] = $match[1][7]; $stream['info']['stream_url'] = $match[1][8]; $stream['info']['artist_song'] = $match[1][9]; $x = explode(" - ",$match[1][9]); $stream['info']['artist'] = $x[0]; $stream['info']['song'] = $x[1]; } else{ $stream['info']['status'] = 'OFF AIR'; } return $stream; } //get information of the current song use last.fm API function getTrackInfo($stream){ $url = str_replace('#','','http://ws.audioscrobbler.com/2.0/?method=track.getinfo&artist='.urlencode($stream['info']['artist']).'&track='.urlencode($stream['info']['song']).'&api_key='.LAST_FM_API); $xml = simplexml_load_file($url,'SimpleXMLElement', LIBXML_NOCDATA); $xml = obj_to_array($xml); // print_r($xml); if($xml['track']['album']['image']){ $stream['album']['image_s'] = $xml['track']['album']['image'][0]; $stream['album']['image_m'] = $xml['track']['album']['image'][1]; $stream['album']['image_l'] = $xml['track']['album']['image'][2]; $stream['album']['image_xl'] = $xml['track']['album']['image'][3]; } if($xml['track']['wiki']['summary']){ $stream['track']['summary'] = $xml['track']['wiki']['summary']; $stream['track']['info'] = $xml['track']['wiki']['content']; } if($xml['track']['album']['title']){ $stream['album']['title'] = $xml['track']['album']['title']; $stream['album']['lastfm_url'] = $xml['track']['album']['url']; } $stream['track']['lastfm_url'] = $xml['track']['url']; if($xml['track']['artist']['url']){ $stream['artist']['lastfm_url'] = $xml['track']['artist']['url']; } return $stream; } //get extra information of the album function getAlbumInfo($stream){ $url = str_replace('#','', 'http://ws.audioscrobbler.com/2.0/?method=album.getinfo&artist='.urlencode($stream['info']['artist']).'&album='.($stream['album']['title']).'&api_key='.LAST_FM_API); $xml = simplexml_load_file($url,'SimpleXMLElement', LIBXML_NOCDATA); $xml = obj_to_array($xml); if ($xml['album']['releasedate'] && strlen($xml['album']['releasedate']) > 10){ $stream['album']['releasedate'] = reset(explode(",",$xml['album']['releasedate'])); } if($xml['album']['tracks']['track']){ foreach($xml['album']['tracks']['track'] as $track){ $stream['album']['track_list'][] = array('title' => $track['name'],'url' => $track['url']); } } if($xml['album']['wiki']['summary']){ $stream['album']['summary'] = $xml['album']['wiki']['summary']; $stream['album']['info'] = $xml['album']['wiki']['content']; } return $stream; } //get extra information of the artist function getArtistInfo($stream){ $url = 'http://ws.audioscrobbler.com/2.0/?method=artist.gettopalbums&artist='.urlencode($stream['info']['artist']).'&api_key='.LAST_FM_API.'&autocorrect=1'; $xml = simplexml_load_file($url,'SimpleXMLElement', LIBXML_NOCDATA); $xml = obj_to_array($xml); // print_r($xml); if($xml['topalbums']['album']){ foreach($xml['topalbums']['album'] as $album){ $stream['artist']['top_albums'][] = array('title'=>$album['name'], 'url'=>$album['url'], 'image'=>$album['image']); } } $url = 'http://ws.audioscrobbler.com/2.0/?method=artist.getInfo&artist='.urlencode($stream['info']['artist']).'&api_key='.LAST_FM_API.'&autocorrect=1'; $xml = simplexml_load_file($url,'SimpleXMLElement', LIBXML_NOCDATA); $xml = obj_to_array($xml); // print_r($xml); if($xml['artist']['bio']['summary']){ $stream['artist']['summary'] = $xml['artist']['bio']['summary']; $stream['artist']['info'] = $xml['artist']['bio']['content']; } return $stream; } //get buylink function getTrackBuyLink($stream){ $url = 'http://ws.audioscrobbler.com/2.0/?method=track.getbuylinks&artist='.urlencode($stream['info']['artist']).'&track='.urlencode($stream['info']['song']).'&api_key='.LAST_FM_API.'&country='.urlencode('united states').'&autocorrect=1'; $xml = simplexml_load_file($url,'SimpleXMLElement', LIBXML_NOCDATA); $xml = obj_to_array($xml); // print_r($xml); if($xml['affiliations']['physicals']['affiliation']){ foreach($xml['affiliations']['physicals']['affiliation'] as $buy){ $supplier = str_replace('iTuens', 'iTunes', $buy['supplierName']); if($buy['isSearch'] == 0){ $new = array('link' => $buy['buyLink'], 'price'=>$buy['price']['amount'], 'currency'=>$buy['price']['currency'], 'icon'=>$buy['supplierIcon']); } else{ $new = array('link' => $buy['buyLink'],'icon'=>$buy['supplierIcon']); } $stream['track']['buylink']['physical'][$supplier] = $new; } } if($xml['affiliations']['downloads']['affiliation']){ foreach($xml['affiliations']['downloads']['affiliation'] as $buy){ $supplier = str_replace('Amazon MP3', 'Amazon', $buy['supplierName']); if($buy['isSearch'] == 0){ $new = array('link' => $buy['buyLink'], 'price'=>$buy['price']['amount'], 'currency'=>$buy['price']['currency'], 'icon'=>$buy['supplierIcon']); } else{ $new = array('link' => $buy['buyLink'],'icon'=>$buy['supplierIcon']); } $stream['track']['buylink']['download'][$supplier] = $new; } } return $stream; } //cache album art images to local server, change the image size if you want function cacheAlbumArt($image_url){ $filename = end(explode('/', $image_url)); $local_image = 'cache/'.$filename; if (!is_file($stream['album']['local_image'])){ copy($image_url, $local_image); } return $local_image; } //get lyrics from chartlyrics.com API function getLyric($artist, $song){ $url = str_replace('\'','','http://api.chartlyrics.com/apiv1.asmx/SearchLyricDirect?artist='.urlencode($artist).'&song='.urlencode($song)); $xml = simplexml_load_file($url,'SimpleXMLElement', LIBXML_NOCDATA); $xml = obj_to_array($xml); // print_r($xml); if($xml['LyricId'] && ($xml['Lyric'] != array())){ return $xml['Lyric']; } else{ return 'Sorry, there\ no lyric found for this song'; } } function getInfo($stream){ if(!$stream['info']['song']){ $stream['info']['song'] == 'Not found'; return $stream; } if(GET_TRACK_INFO == TRUE){ $stream = getTrackInfo($stream); } if(GET_ALBUM_INFO && isset($stream['album']['title'])){ $stream = getAlbumInfo($stream); } if(GET_ARTIST_INFO == TRUE){ $stream = getArtistInfo($stream); } if(GET_TRACK_BUY_LINK == TRUE){ $stream = getTrackBuyLink($stream); } if(CACHE_ALBUM_ART == TRUE){ $stream['album']['local_image'] = cacheAlbumArt($stream['album']['image_l']); } if(GET_LYRICS == TRUE){ $stream['track']['lyric'] = getLyric($stream['info']['artist'], $stream['info']['song']); } $stream['fetch_time'] = time(); return $stream; } function array_encode($array){ foreach($array as $key=>$value){ if(is_array($value)){ $array[$key] = array_encode($value); } else{ $array[$key] = base64_encode($value); } } return $array; } function array_decode($array){ foreach($array as $key=>$value){ if(is_array($value)){ $array[$key] = array_decode($value); } else{ $array[$key] = base64_decode($value); } } return $array; } function cacheVar($stream){ $stream = array_encode($stream); file_put_contents('var/info.json', json_encode($stream)); } function cacheHistory($stream){ if($stream['song'] == 'Not found'){ return; } $year = date('Y'); $month = date('m'); $day = date('d'); if(!is_dir('history')){ mkdir('history', 0777); } if(!is_dir('history/'.$year)){ mkdir('history/'.$year); } if(!is_dir('history/'.$year.'/'.$month)){ mkdir('history/'.$year.'/'.$month); } $file = 'history/'.$year.'/'.$month.'/'.$day.'.json'; $history['time'] = gmdate('c'); $history['artist'] = $stream['info']['artist']; $history['song'] = $stream['info']['song']; $history['image'] = $stream['album']['image_s']; $history['itunes'] = $stream['track']['buylink']['download']['iTunes']['link']; $history['Amazon'] = $stream['track']['buylink']['download']['Amazon']['link']; $history = array_encode($history); file_put_contents($file, json_encode($history)); createHistory(); } function createHistory(){ $history = json_decode(@file_get_contents('var/history.json'), TRUE); $year = date('Y'); $month = date('m'); $day = date('d'); $history[$year][$month][$day] = $year.$month.$day; $file = 'history/'.$year.'/'.$month.'/'.$day.'.json'; file_put_contents('var/history.json', json_encode($history)); } function init($stream){ $stream['album']['image_s'] = $stream['album']['image_m'] = $stream['album']['image_l'] = $stream['album']['image_xl'] = DEFAULT_ALBUM_ART; $stream['track']['summary'] = $stream['track']['info'] = "No information found for this track, try searching for <a target='_blank' href='http://www.google.com/search?q=".urlencode($stream['info']['artist']." - ".$stream['info']['song'])."'>".$stream['info']['artist']." - ".$stream['info']['song']."</a> on Google"; $stream['album']['title'] = 'Not found'; $stream['album']['lastfm_url'] = 'http://www.google.com/search?q='.urlencode($stream['info']['artist']." - ".$stream['info']['song']); $stream['track']['download_cn'] = 'http://www.google.cn/music/search?q='.urlencode($stream['info']['artist']." - ".$stream['info']['song']); $stream['album']['summary'] = $stream['album']['info'] = 'No information found for this album, try searching for <a target="_blank" href="http://www.google.com/search?q='.urlencode($stream['info']['artist']." - ".$stream['info']['song']).'">'.$stream['info']['artist']." - ".$stream['info']['song'].'</a> on Google'; $stream['album']['releasedate'] = 'Unknown'; $stream['artist']['summary'] = $stream['artist']['info'] = 'No information found for this artist, try searching for <a target="_blank" href="http://www.google.com/search?q='.urlencode($stream['info']['artist']).'">'.$stream['info']['artist'].'</a> on Google'; return $stream; } ?> 

I am completely new to PHP and do not fully understand the instructions. The following are the instructions published:

How to use a script on your own website:

Get the API key from last.fm: http://www.last.fm/api/account Get the script, edit the configuration file (config.php). Use the available variables to echo what you want, there is also a list of available variables on this wiki page: code.google.com/p/icecast-now-playing-script/wiki/Variables Upload scripts to your web space that support PHP , Change the script> directory attribute for the record (for example, "666")

UPDATE Using the GView tip and removing the '@' in front of the file_component and calling var_dump ($ str), this error is returned:

  Warning: file_get_contents(http://70.35.120.203:8000/status.xsl?mount=/zedg_mb.mp3.m3u) [function.file-get-contents]: failed to open stream: Connection refused in /home/content/14/7785714/html/NowPlaying/icecast.php on line 40 bool(false) Array ( [info] => Array ( [status] => OFF AIR ) ) Please! Does anyone have any suggestions? 
+1
php icecast
source share
2 answers

I assume that your server does not allow HTTP stream wrappers.

In the icecast.php script, the getStreamInf () function is called and at the top tries to open the stream with:

 $str = @file_get_contents(SERVER.'/status.xsl?mount='.MOUNT); 

To debug this, do 2 things. First remove @, which suppresses the error output by calling file_get_contents. Then add temporary debug output:

 $str = file_get_contents(SERVER.'/status.xsl?mount='.MOUNT); var_dump($str); 

If you get a security-related error and not data back, you need to look at the php.ini file for the server.

 allow_url_fopen = on 

It is required to set for file_get_contents in order to be able to open the URL as the script does. You must be able to change this setting on your server if it is disabled, and you must be able to restart the web server for these changes to take effect.

+1
source share

Please note that I would strongly advise against using "Icecast Now Playing Script"! tl; dr : it parses HTML, it's terrible.

  • the script uses regex to parse the Icecast status.xsl page, regex should never be used to parse HTML, if you want to know why read the Parsing Html The Cthulhu Way . It is very likely that it will break easily.

  • The script parses the Icecast status.xsl page. This should never be done, as this page is likely to change, as in the latest version of Icecast version 2.4. So please, please do not parse the HTML page !

What to do instead?

If this is your Icecast Server, you can easily write your own xsl to create custom XML or JSON that contains the information you need. (more info here )

An example of this is xml2json.xslt .

+3
source share

All Articles