簡體   English   中英

無法從某些IP和端口獲取必需的標頭以使用ShoutCast協議解析歌曲標題

[英]Cannot get required headers from some IPs and ports to parse song title using ShoutCast protocol

我正在嘗試使用SC協議從實時mp3流中提取歌曲標題。 php腳本可以在某些IP和端口上正常運行,但是對於某些IP和端口,我無法從響應中獲取所需的標頭來確定元塊頻率,因此無法在流中找到歌曲標題的位置。 這是我的代碼:

<?php
while(true)
{

    //close warning messages (re-open for debugging)
    error_reporting(E_ERROR | E_PARSE);

    //create and connect socket with the parameters entered by the user
    $sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);

    echo "Establishing connection to the given adress...\n";

    $fp = fsockopen($argv[1], $argv[2], $errno, $errstr, 10);

    if($fp)
    {
        echo "Connection established.\n";

        $result = socket_connect($sock, $argv[1], $argv[2]);

        //prepare request
        $request = "GET / HTTP/1.1\r\n";
        $request .= "Icy-MetaData: 1\r\n\r\n";

        //send request
        socket_write($sock,$request,strlen($request));

        //set sentinel boolean value's initial value
        $headers = true;

        //put the segment to be parsed into a string variable
        $l = socket_read($sock,2048);

        $meta = "";
        $streamurl = "";
        $checkContentType = false;

        //Parsing metadata frequency and streamurl from response's headers.
        foreach(preg_split("/((\r?\n)|(\r\n?))/", $l) as $line)
        {
            if(!(strpos($line, "metaint:") === false))
            {
                $meta = $line;
            }
            if(!(strpos($line, "icy-url:") === false))
            {
                $streamurl = $line;
            }
            if(!strpos($line, "audio/mpeg") === false)
            {
                $checkContentType = true;
            }
        }
        echo $l;
        //Checking if the content of the stream is mpeg or not
        if($checkContentType)
        {
            $pos = strpos($meta, ":");

            $interval = intval(substr($meta,$pos+1));
            $pos = strpos($streamurl, ":");
            $streamurl = substr($streamurl, $pos+1);
            $flag = false;

            //initialize bytecount to 0
            $bytecount = 0;

            //Extracting song title using SC protocol
            while($headers)
            {

                $l = socket_read($sock,PHP_NORMAL_READ);
                $bytecount++;
                if($bytecount == $interval )
                {
                    $headers = false;
                    $flag = true;
                }
                if($flag)
                {
                    $len = ord($l);
                }
            }

            //Determining length variable
            $len = $len * 16;

            $string = socket_read($sock,$len);

            $pos2 = strpos($string, "'") + 1;
            $pos3 = strpos($string, ";",$pos2) -1;

            $songtitle = substr($string, $pos2, ($pos3-$pos2));

            //Formatting the log entry

            $finalstr = "[".date("c")."]"."[".$streamurl."]".$songtitle."\n";

            echo "logged".$finalstr;
            //finalize connection
            socket_close($sock);
            //Writing the requested info to a log file
            file_put_contents("log.txt", $finalstr,FILE_APPEND | LOCK_EX);
            //waiting 5 minutes
            echo "Logging next entry in five minutes. \n";
            sleep(300);
        }
        else
        {
            echo "Content of the stream is not suitable.\n";
            exit;
        }
    }
    else
    {
        echo "Unable to connect to the given ip and port.\n Exiting...\n";
        socket_close($sock);

        exit;
    }
}

?>

我從未嘗試以編程方式訪問shoutcast,但過去我一直在運行流音頻服務器。 實際上,shoutcast服務器有兩種不同的風格,我想您的程序正在嘗試與其中一種通信,而這些損壞的服務器是另一種。

從帖子中閱讀流的SHOUTCAST元數據

原來,SHOUTcast和Icecast(流廣播的兩個最流行的服務器應用程序)應該兼容,但是每個服務器的響應消息都略有不同。

有關廣播協議的完整詳細信息:廣播元數據協議

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM