我正在尝试使用来自:https://code.google.com/p/icecast-now-playing-script/
的Icecast Now Playing PHP脚本修改config.php后,我已将所有文件上传到我的Web服务器。当我在浏览器中加载example.php时,这是返回的信息:
Array (
[info] => Array
(
[status] => OFF AIR
)
)
我不确定问题的原因是什么。我已经验证了Icecast服务器信息是否正确。开场:http://70.35.120.203:8000/zedg_mb.mp3.m3u
确实开始播放流。这是代码:
使用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's 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's 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's 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's 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's 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\'s 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;
}
?>
我对PHP很陌生,并不完全理解这些说明。以下是发布的说明:
如何在您自己的网站上使用该脚本:
从last.fm获取API密钥:http://www.last.fm/api/account获取 脚本,编辑配置文件(config.php)使用可用的变量 为了回应你想要的东西,还有一个可用变量列表 这个维基页面: code.google.com/p/icecast-now-playing-script/wiki/Variables上传 支持PHP的网站空间脚本,将脚本&gt;目录的属性更改为可写(例如“666”)
更新 使用GView的建议并删除file_get_contents前面的'@'并调用var_dump($ str)会返回此错误:
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?
答案 0 :(得分:3)
请注意,我强烈建议不要使用“Icecast Now Playing Script”! tl; dr :它解析HTML,这太可怕了。
该脚本使用正则表达式来解析Icecast status.xsl页面,永远不应该使用正则表达式来解析HTML,如果你想知道原因,请阅读"Parsing Html The Cthulhu Way"。它很可能很容易破裂。
该脚本解析Icecast status.xsl页面。永远不应该这样做,因为这个页面很可能会改变,就像最新的Icecast版本2.4一样。所以请,请 不解析HTML页面!
如果这是您的Icecast服务器,您可以轻松编写自定义xsl,以生成包含所需信息的自定义XML或JSON。 (更多信息here)
这方面的一个例子是xml2json.xslt
。
答案 1 :(得分:1)
我的猜测是你的服务器不允许使用HTTP流包装器。
在icecast.php脚本中调用函数getStreamInf(),在顶部它尝试使用以下命令打开流:
$str = @file_get_contents(SERVER.'/status.xsl?mount='.MOUNT);
要调试此功能,请执行以下操作:首先删除@,它会抑制file_get_contents调用的错误输出。然后添加临时调试输出:
$str = file_get_contents(SERVER.'/status.xsl?mount='.MOUNT);
var_dump($str);
如果您收到与安全相关的错误,而不是数据,那么您需要查看服务器的php.ini文件。
allow_url_fopen = on
需要为file_get_contents设置才能打开网址,因为此脚本会尝试这样做。您必须能够在服务器上更改该设置,如果它已设置为关闭,并且您必须能够重新启动Web服务器才能使这些更改生效。