View difference between Paste ID: V7dUz80E and 9QZ6MC1a
SHOW: | | - or go back to the newest paste.
1
<?php
2
3
/**
4
 * --------------- ShoutCast Radio Stations Search API ---------------
5-
 * 
5+
 *
6
 * @author Pedro P. L. Papadópolis (a.k.a Mandrakke).
7
 * @copyright There is no copyright, you can use it as you want, you can also show it to you mother to her see how much you are smart.
8-
 * 
8+
 *
9
 * If you speak Portuguese, try out our server;
10
 * http://brazucas-server.com
11-
 * 
11+
 *
12
 * If you dont, try out our translated-to-english tool (SA-MP Online Objects Viewer);
13
 * http://brazucas-server.com/$objetos
14-
 * 
14+
 *
15-
 * 
15+
 *
16
 * This script is also hosted on http://api.brazucas-dev.com/ShoutCastAPI.php but it can be turned offline at any time if the number of requests increase too much.
17-
 * 
17+
 *
18
 * More information about how to integrate this script with a SA-MP server can be find at the oficial topic on SA-MP forums;
19
 * http://forum.sa-mp.com/showthread.php?t=347016
20-
 * 
20+
 *
21-
 * 
21+
 *
22-
 * 
22+
 *
23-
 * Version: R1-1 Beta (released in 02/06/2012)
23+
 * Version: R2 (released in 04/08/2014)
24-
 * 
24+
 *
25
 * -------------------------------------------------------------------
26
 */
27-
 
27+
28
if(!function_exists("curl_init")) die("cURL library is required.");
29
30
//Disable error messages, if you have issues with this script, comment this line below to see which error occurs.
31-
error_reporting("E_ALL"); 
31+
error_reporting("E_ALL");
32
33
final class ShoutCastAPI {
34
    private $forbidden = array('-','!','"','#','$','%','&','\'','(',')','*','+',',','.','/',':',';','<','=','>','?','@','[','\\',']','_','`','{','|','}','~');
35-
    
35+
    private $shoutcastUrlPrefix = 'http://www.shoutcast.com/';
36-
    function __construct() {        
36+
37
    function __construct() {
38-
            "ajax"      => true,
38+
39-
            "count"     => 10,
39+
            "genre"     => ($_GET['genre'])?(int)$_GET['genre']:null,
40-
            "order"     => "desc",
40+
            "station"   => ($_GET['station'])?(int)$_GET['station']:null,
41-
            "strIndex"  => 0
41+
            "type"      => ($_GET['type'])?(int)$_GET['type']:null,
42
            "artist"    => ($_GET['artist'])?(int)$_GET['artist']:null,
43-
        
43+
            "song"      => ($_GET['song'])?(int)$_GET['song']:null
44-
        if(!isset($_GET["search"]) || strlen($_GET["search"]) == 0) {
44+
45-
            $url = "http://www.shoutcast.com/ajax_dir";
45+
46-
            
46+
        $validParams = false;
47-
            if(!isset($_GET["field"]))
47+
        foreach($_GET as $ind => $val)
48-
                $RequestValues["criteria"] = "listenershead";
48+
            foreach($RequestValues as $searchInd => $searchVal)
49-
            else
49+
                if($searchInd == $ind) {
50-
                $RequestValues["criteria"] = $_GET["field"]."head";
50+
                    $validParams = true;
51
                    break;
52-
            $url = "http://www.shoutcast.com/search-ajax/". urlencode($_GET["search"]);
52+
                }
53-
            
53+
54-
            if(!isset($_GET["field"]))
54+
        if(isset($_GET['getStreamUrl'])) {
55-
                $RequestValues["mode"] = "listenershead2";
55+
            $url = $this->shoutcastUrlPrefix. 'Player/GetStreamUrl';
56-
            else
56+
        } else if(count($_GET) > 0 && $validParams) {
57-
                $RequestValues["mode"] = $_GET["field"]."head2";
57+
            $url = $this->shoutcastUrlPrefix. 'Search/UpdateAdvancedSearch';
58
        } else {
59-
        
59+
            $url = $this->shoutcastUrlPrefix. 'Home/Top';
60
        }
61
62
        $count  = ($_GET['count'])?(int)$_GET['count']:10;
63
        $start  = ($_GET['start'])?(int)$_GET['start']:0;
64-
                    
64+
        $show   = ($_GET['show'])?explode('|', $_GET['show']):false;
65
66
        $params = null;
67-
        
67+
68
            if($_GET[$ind] !== null)
69-
        
69+
70-
        $req = $this->Request($url, 1, null, $params, "http://www.shoutcast.com/");
70+
71
            $params .= $ind. "=". $RequestValues[$ind]. "&";
72-
        $filter = new DOMDocument;
72+
73-
        @$filter->loadHTML($req["data"][1]);
73+
74-
        
74+
75-
        $divs = $filter->getElementsByTagName("div");
75+
76
        $req = $this->Request($url, 1, null, $params, $this->shoutcastUrlPrefix);
77-
        foreach($divs as $div) {
77+
78-
            if($div->getAttribute("class") == "dirlist") {
78+
        if(isset($_GET['getStreamUrl'])) die($req['data'][1]);
79-
                $a = $div->getElementsByTagName("a")->item(0);
79+
80-
                
80+
81-
                $stations["stations"]["s".$i]["stationid"]  = $a->getAttribute("id");
81+
82-
                
82+
        $response = json_decode($req['data'][1]);
83-
                $tmp = $a->getAttribute("name");
83+
84-
                for($y = 0; $y < strlen($tmp); ++$y)
84+
        foreach($response as $station) {
85-
                    if(!in_array($tmp[$y], $this->forbidden))
85+
            if(isset($_GET['streamUrl'])) {
86-
                        $stations["stations"]["s".$i]["name"] .= $tmp[$y];
86+
                $stationUrlRequest = $this->Request($this->shoutcastUrlPrefix. 'Player/GetStreamUrl', 1, null, array('station' => $station->ID), $this->shoutcastUrlPrefix);
87-
                        
87+
                preg_match('/"(.*?)"/', $stationUrlRequest['data'][2], $stationUrl);
88-
                $stations["stations"]["s".$i]["id"]        = preg_replace("/^.*?id./i", "", $a->getAttribute("href"));
88+
89-
                
89+
                $stations['stations']['s'. $i]['streamUrl'] = $stationUrl[1];
90-
                $childDivs = $div->getElementsByTagName("div");
90+
91-
                foreach($childDivs as $childDiv)
91+
92-
                    switch($childDiv->getAttribute("class")) {
92+
            foreach($station as $ind => $val)
93-
                        case "playingtext":
93+
                if($i >= $start && (in_array($ind, $show) || !$show))
94-
                            $tmp = $childDiv->getAttribute("title");
94+
                    $stations['stations']['s'. $i][$ind] = $val;
95-
                            
95+
96-
                            if($tmp == null && $childDiv->getElementsByTagName("span")->item(0) !== null)
96+
            if($i > $count) break;
97-
                                $tmp = $childDiv->getElementsByTagName("span")->item(0)->getAttribute("title");
97+
            ++$i;
98-
                            
98+
99-
                            for($a = 0; $a < strlen($tmp); ++$a)
99+
100-
                                if(!in_array($tmp[$a], $this->forbidden))
100+
101-
                                    $stations["stations"]["s".$i]["nowplaying"] .= $tmp[$a];
101+
102-
                            
102+
103-
                            if(strlen($stations["stations"]["s".$i]["nowplaying"]) > 13)
103+
104-
                                $stations["stations"]["s".$i]["nowplaying"] = substr($stations["stations"]["s".$i]["nowplaying"], 0, 13). "...";
104+
105-
                        break;
105+
106-
                        case "dirgenre":    $stations["stations"]["s".$i]["genre"]      = $childDiv->nodeValue;                                         break;
106+
107-
                        case "dirlistners": $stations["stations"]["s".$i]["listeners"]  = $childDiv->nodeValue;                                         break;
107+
108-
                        case "dirbitrate":  $stations["stations"]["s".$i]["bitrate"]    = $childDiv->nodeValue;                                         break;
108+
109-
                        case "dirtype":     $stations["stations"]["s".$i]["type"]       = $childDiv->nodeValue;                                         break;
109+
110-
                    }
110+
111-
                
111+
112-
                ++$i;
112+
113
                $output = json_encode($stations);
114
                break;
115-
        
115+
116
            default:
117-
        
117+
118
                foreach($stations["stations"] as $stationId => $stationData)
119
                    if(is_array($stationData))
120-
            
120+
121
                            $output .= $stationId. $ind. "=". $val. "\r\n";
122
                    else
123
                        $output .= $stationId. "=". $stationData. "\r\n";
124
        }
125
126-
        
126+
127
    }
128
129-
                $output .= json_encode($stations);
129+
130-
            break;
130+
131
132
        $exec = curl_setopt_array($ch, array(
133
                CURLOPT_URL => $a,
134
                CURLOPT_RETURNTRANSFER => $b,
135
                CURLOPT_HEADER => 1,
136
                CURLOPT_NOBODY => 0,
137
                CURLOPT_COOKIE => $c,
138
                CURLOPT_CUSTOMREQUEST => ($d)?"POST":"GET",
139-
                        $output .= $stationId. "=". $stationData. "\r\n"; 
139+
140
                CURLOPT_FOLLOWLOCATION => 1,
141-
        
141+
142
                CURLOPT_REFERER => $e
143
            )
144-
    
144+
145
146
        return array(
147-
        
147+
            "data"      => explode("\r\n\r\n", curl_exec($ch), 3),
148
            "httpcode"  => (int)curl_getinfo($ch, CURLINFO_HTTP_CODE)
149
        );
150
    }
151
} new ShoutCastAPI();
152
?>