info=array(); $this->info["User-Agent"]="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7"; $this->info["Accept"]="*/*"; $this->info["Accept-Encoding"]="*"; $this->info["Accept-Language"]="*"; $this->info["Accept-Charset"]="ISO-8859-1,utf-8;q=0.7,*;q=0.7"; $this->info["Keep-Alive"]=30; $this->info["Connection"]="close"; $this->requestType="GET"; $this->newLine="\r\n"; $this->timeout=15; $this->socketTimeout=15; $this->debug=0; $this->connected=0; } //setter function for the header info function changeHeaderInfo($name,$info){ $this->info[$name]=$info; return true; } // requesttype (POST,GET,OPTIONS etc function setRequest($type){ $this->requestType=$type; } //return the header function getOutgoingHeader($host,$path){ $this->debug("Create Header for ".$host." and path ".$path); $header=$this->requestType." ".$path." HTTP/1.1".$this->newLine; $header.="Host: ".$host.$this->newLine; foreach ($this->info as $name => $value) { $header.=$name.": ".$value.$this->newLine; } $header.=$this->newLine; return $header; } // reads the icomming header function getHeader($fp){ if(!$this->fp){ $this->debug("Cannot read header. No connection."); return false; } $header = ''; do { $line = chop(fgets($fp)); $header .= $line."\n"; } while (!empty($line) and !@feof($fp)); return $header; } //parsing function parseHeader($str){ $result=array(); preg_match('~^HTTP/1\.\d (?P\d+)~', $str, $matches); $result["status"]=$matches['status']; $str=explode("\n",$str); $x=0; for($i=0;$idebug){ echo "
\n";
			print_r($str);
			echo "
\n"; } } // Redirect if needed function redirect(){ $this->debug("Redirect to ".$this->incommingHeader["Location"]); return $this->connect($this->incommingHeader["Location"]); } //connect to an url and send/receive headers. follow redirects as far as possible function connect($url){ if($this->timeout)set_time_limit($this->timeout); $this->url=$url; $this->debug(" Got url: ".$url); $parsedurl = parse_url($url);+ $this->debug($parsedurl); $host = $parsedurl['host']; $path = empty($parsedurl['path']) ? '/' : $path = $parsedurl['path']; if (!empty($parsedurl['query'])){ $path .= '?'.$parsedurl['query']; } $port = empty($parsedurl['port']) ? 80 : $port = $parsedurl['port']; $outgoingHeader= $this->getOutgoingHeader($host,$path); $this->debug("Connect to: ".$host.":".$port." Timeout: ".$this->socketTimeout); $fp = fsockopen ($host, $port, $errno, $errstr, $this->socketTimeout); $this->fp=$fp; if (!$fp) { $this->debug($errstr." (".$errno.")"); return false; $this->connected=0; } $this->debug($outgoingHeader); fputs ($fp, $outgoingHeader); $incommingHeader=$this->getHeader($fp); $this->debug($incommingHeader); $incommingHeader=$this->parseHeader($incommingHeader); $this->incommingHeader=$incommingHeader; if($this->incommingHeader["Location"]){ return $this->redirect(); } $this->connected=1; return $incommingHeader; } // reads data. function getData($bytes=-1){ if(!$this->connected || !$this->fp){ $this->debug("Cannot read data. no Connection"); return false; } $result = ''; if($bytes>0){ $this->debug("Read data: ".$bytes." Bytes"); while(strlen($result)<$bytes){ $result .= fread($this->fp,$bytes-strlen($result)); } }else{ $this->debug("Read data: complete"); while (!@feof($this->fp)) { $result .= fread($this->fp,1024); } } $this->data=$result; return $this->data; } function closeConnection(){ fclose($this->fp); } } ?> \n"; // print_r($str); //echo "\n"; } //after 15 seconds without an keepaive request the script stops $keepalive=15; if($_GET["action"]=="keepalive"|| !$_GET["id"]){ // read the metainfo file and pass contents to flash if($_GET["id"]){ $id=$_GET["id"]; }else{ $id=uniqid(''); } @mkdir("./idfiles"); @unlink("./idfiles/.".$id); $fp=fopen("./idfiles/.".$id,"w+"); fputs($fp,time()); fclose($fp); echo "&result=".$id."&"; readfile("metaData".$id.".txt"); }elseif($_GET["action"]=="stream"){ // SimBrowse is a class to send headerinfo etc easiely $sp=new SimBrowse(); // Tell the shoutcast server that its winamp that is connecting $sp->changeHeaderInfo("User-Agent","Winamp"); //request metainfos $sp->changeHeaderInfo("Icy-MetaData","1"); $sp->debug=0; $sp->timeout=0; //get the stream header (SimBrowse follows redirect Headers by itself. radio stations use redirect to share the traffic under multiple servers $incommingHeader=$sp->connect($_GET["stream"]); //make flash think its an mp3 file $nl="\r\n"; $header="HTTP/1.1 200 OK".$nl; $header.="Notice:This is a php-stream".$nl; $header.="Content-Type: audio/mpeg".$nl; //content length for some browsers $header.="Content-Length: 99999999999".$nl; while(1){ //Clearcache that fileatime works fine clearstatcache(); //break the script if flash does not send the keep alive request if((time()-fileatime("./idfiles/.".$_GET["id"]))>$keepalive){ debug("Flash Verbindung abgebrochen : ".(time()-filectime("./idfiles/.".$_GET["id"]))); @unlink("./metaData".$_GET["id"].".txt"); @unlink("./idfiles/.".$_GET["id"]); break; } //set Timelimit. the script must nt abort set_time_limit(10); //read the mp3 block $mp3Block=$sp->getData($incommingHeader["icy-metaint"]); //read the metasize block. this bytes indicates how big the following metatag is. $metaSizeByte=ord($sp->getData(1)); if($metaSizeByte){ //metasize found. read it $metadata=explode(";",$sp->getData($metaSizeByte*16)); //parse the metatag and save it together with some incomming headerinfos in the metatag file. $fp=fopen("metaData".$_GET["id"].".txt","w+"); for($i=0;$i