SHOUTcast aktuális zeneszám lekérdezése

Még több szkript megjelenítéséhez, kérem, jelentkezzen be!

jQuery


Ahhoz, hogy a SHOUTcast rádió aktuális zeneszámát, illetve lejátszási előzményeit meg tudjuk jeleníteni szükség van két fájlra, melyet a weboldal fejlécébe kell illeszteni. Az első a jQuery fájl, melynek elérési útvonala itt található: <script src="https://www.nwr.hu/js/jquery-3.1.1.js" type="text/javascript"></script>. A második fájl shoutcast.js, ami az aktuális zeneszám és a lejátszási előzmények datait kérdezi le. Ez a linket illessze a jQuery link alá: <script src="https://www.nwr.hu/scripts/shoutcast.js" type="text/javascript"></script>. Fontos az elérési útvonalak sorrendje, ezért mindig a jQuery fájl legyen felül.

A gyakorlatban ez így néz ki:

        <script src="https://www.nwr.hu/js/jquery-3.1.1.js" type="text/javascript"></script>
        <script src="https://www.nwr.hu/scripts/shoutcast.js" type="text/javascript"></script>
        <script>
            $SHOUTcast({
                host : 'ip cím vagy hosztnév',
                port : portszám -> pl.: 8000,
                interval : 5000,
                stats : function() {
                    $('#songtitle .title').text(this.get('songtitle'));
                }
            }).startStats();
        </script>
    

A port és az interval az eseteg többségében integer típus, ezért nem kell idézőjelek közé rakni, mint ahogy azt a példa is mutatja.

        port : 8000,
        interval : 5000,
    

Előfordulhat viszont, hogy a port mellett szerepel egy mountpath vagy streamid is. Ebben az esetben már szükséges az idézőjel.

        port : '8000/stream',  vagy  port : '8000,1',
        interval : 5000,
    

Az interval értéke alapértelmezett esetben 5000 (azaz 5 másodperc), de ez módosítható.

Normál megjelenítési mód:

        <div id="songtitle">
            <p class="title"></p>
        </div>
    

Alternatív megjelenítési mód:

        <p class="title"></p>
    

Mind a két megjelenítési mód használható, de a normál megjelenítési mód jobban személyre szabható, formázható akár a keret, illetve szöveg.


PHP


Metaadatok megjelenítéséhez a PHP szkript több lehetőséget is kínál az integrálható szkriptek közül. Első lépésként a jQuery - hez hasonlóan a fejlécbe kell illeszteni egy kódot az alábbi módon: <?php require_once 'https://www.nwr.hu/scripts/shoutcast.php'; ?>

A gyakorlatban ez így néz ki:

        <?php
            require_once "https://www.nwr.hu/scripts/shoutcast.php";
            $s = new Shoutcast('ip vagy hosztnév', 'port', 'Stream jelszó. Ha nincs, akkor null', stream ID -> integer (pl.: 1), időtúllépés -> integer (pl.: 10));
           Példa:
            $s = new Shoutcast('192.168.26.34', '8000', 'Password1234', 3, 5);  vagy
            $s = new Shoutcast('192.168.26.34', '8000', null, 3, 5);
            echo $s->get('CURRENT_SONG');
        ?>
    

Fontos: ez a szkript abban az esetben hasznos, ha mi vagyunk a SHOUTcast szerver adminisztrátorai és ismerjük a jelszót. Ezáltal több, általunk üzemeltetett rádió adatait tudjuk lekérni. A jelszó hiányában csak egyetlen állomás adatait tudjuk lekérni, amelyik tapasztalataim szerint az elsőnek felel meg. Ne használja ezt a szkriptet, ha felhasználóként üzemeltet több rádióállomást.

Van egy ennél is egyszerűbb szkript, mely mindössze egyetlen sorból áll, leszámítva a megjelenítési, időszakos frissítési sorokat.

        Készítsünk egy PHP fájlt, mondjuk playing.php néven, majd írjuk be a következő kódot:
        
        <?php
            $songName = file_get_contents('http://ip:port/currentsong?sid=1'); // a "sid" - hez a felhasználó azonosítóját kell írni.
            echo $songName;
            // Ennek a megjelenítési módnak van egy másik formája, amiről nem beszélnek és még csak leírást sem találtam róla sehol, úgyhogy joggal nevezhetném sajátnak...de nem teszem.
            $songName = file_get_contents('http://ip:port/currentsong?mount=/stream'); // a "stream" helyére a csatolási pontot kell írni.
            echo $songName;
        ?>
        
        Aktuális zeneszám megjelenítése 5 másodperces frissítéssel:
        
        <p class="title"><?php require_once './playing.php'; ?></p>
        
        <script src="https://www.nwr.hu/js/jquery-3.1.1.js" type="text/javascript"></script>
        <script>
            $(document).ready(function() {
                setInterval(function() {
                    $(".title").load("playing.php");
                }, 5000);
            });
        </script>
    

Az újabb SHOUTcast verziók már nem ragaszkodnak az azonosítóhoz, engedélyezik a csatolási pont hozzáadását is, az Icecast - hoz hasonlóan. Emiatt a megjelenítési formára is könnyen következtetni lehet. (Nekem kb. harmadikra sikerült is)

A következő szkript nagyon hasznos, mivel a SHOUTcast server 1 és 2 verziójához is használható. Ha azt szeretnénk, hogy az aktuális zeneszám bizonyos időközönként (néhány másodperc) frissüljön, akkor az alábbi módon kell elkészíteni:

        Készítsünk egy PHP fájlt, mondjuk playing.php néven, majd írjuk be a következő kódot:
        
        <?php
            $dnas = '2'; // Szerver verzió 1 vagy 2
            $ip = 'ip vagy hosztnév'; // IP cím vagy webcím
            $port = 'port'; // Portszám (idézőjellel vagy anélkül)
            $sid = 'stream id'; // Adatfolyam azonosító (pl.: 1). Csak a 2 - es verzióhoz szükséges.
            $timeout = '5'; // Időtúllépés (alapértelmezett: 5)
            $fp = @fsockopen($ip, $port, $timeout);
            if ($dnas == '1') {
                fputs($fp, "GET /7.html HTTP/1.0\r\nUser-Agent: Mozilla/5.0\r\n\r\n");
            } else {
                fputs($fp, "GET /7.html?sid=$sid HTTP/1.0\r\nUser-Agent: Mozilla/5.0\r\n\r\n");
            }
            while(!feof($fp)) {
                $info = fgets($fp);
            }
            $info = str_replace('<HTML><meta http-equiv="Pragma" content="no-cache"></head><body>', "", $info);
            $info = str_replace('</body></html>', "", $info);
            $stats = explode(',', $info, 7);
            $peak = $stats[2];
            $bitrate = $stats[3];
            $maxlisteners = $stats[4];
            $listeners = $stats[5];
            $currentsong = $stats[6];
            echo $currentsong;
        ?>
        
        Aktuális zeneszám megjelenítése 5 másodperces frissítéssel:
        
        <p class="title"><?php require_once './playing.php'; ?></p>
        
        <script src="https://www.nwr.hu/js/jquery-3.1.1.js" type="text/javascript"></script>
        <script>
            $(document).ready(function() {
                setInterval(function() {
                    $(".title").load("playing.php");
                }, 5000);
            });
        </script>
    

Talán a legegyszerűbb PHP szkript a következő, mellyel az aktuális zeneszámot le tudjuk kérdezni. Mindössze néhány sorból áll, viszont csak a SHOUTcast 2xxx verzióival kompatibilis.

        Készítsünk egy PHP fájlt, mondjuk playing.php néven, majd írjuk be a következő kódot:
        
        <?php
            $ip = 'ip vagy hosztnév'; // IP cím vagy webcím
            $port = 'port'; // Portszám (idézőjellel vagy anélkül)
            $sid = 'stream id'; // Adatfolyam azonosító (pl.: 1). Csak a 2 - es verzióhoz szükséges.
            $url = "http://$ip:$port/stats?sid=$sid"; // Lehet http:// vagy https://
            $urlencode = urlencode($url);
            $sc_status = simplexml_load_file($urlencode);
            echo $sc_status->SONGTITLE;
        ?>
        
        Aktuális zeneszám megjelenítése 5 másodperces frissítéssel:
        
        <p class="title"><?php require_once './playing.php'; ?></p>
        
        <script src="https://www.nwr.hu/js/jquery-3.1.1.js" type="text/javascript"></script>
        <script>
            $(document).ready(function() {
                setInterval(function() {
                    $(".title").load("playing.php");
                }, 5000);
            });
        </script>
    

Ennek a változatnak az előnye, hogy több szerveradatot is le tudunk kérdezni felhasználóként, nem szükséges adminisztrációs adatok megadása.

Az alábbi metaadatok közül válogathat ha a fenti kódot használja:

        <?php
            echo $sc_status->CURRENTLISTENERS; // Jelenlegi hallgatók száma
            echo $sc_status->PEAKLISTENERS; // Eddigi összes hallgatók száma
            echo $sc_status->MAXLISTENERS; // Egyidejű maximális hallgatók száma
            echo $sc_status->AVERAGETIME; // Az aktív hallgatók átlagos ideje (másodpercben).
            echo $sc_status->SERVERGENRE; // Zenei műfaj, stílus, ami a rádióban hallgatható.
            echo $sc_status->SERVERURL; // Saját weboldal útvonala.
            echo $sc_status->SERVERTITLE; // Rádióállomás neve
            echo $sc_status->SONGTITLE; // Aktuális zeneszám címe
            echo $sc_status->STREAMSOURCE; // Aktuális IP cím (az az útvonal amellyel jelenleg csatlakozik a rádiószerverhez)
            echo $sc_status->STREAMPATH; // Az URL végén szereplő elérési pont. Pl.: http(s)://<serverip>:<port>/<streampath>
            echo $sc_status->BITRATE; // Adatfolyam sebesség. Minél magasabb, annál jobb minűségű az adatfolyam.
            echo $sc_status->CONTENT; // Adatfolyam típusa (Pl.: audio/mpeg).
            echo $sc_status->VERSION; // SHOUTcast szerver verzió.
        ?>
    

A metaadatok többségét a konfigurációs fájlban lehet módosítani, ha azt az adminisztrátor engedélyezi. A weboldalon regisztrált rádióállomások beállításai automatikusak, ezért nem módosíthatók. Az alapértelmezett bitráta sebesség a rádióállomások FM hullámsávját tükrözi, ami egy online rádió sebességének maximálisan megfelel. A későbbiekben előfordulhat, hogy bizonyos adatok módosíthatóak lesznek, vagy az alapértelmezett érték lesz magasabb.


Jelen leírás, illetve szkriptek a SHOUTcast v2xxx verzióihoz készültek. Előfordulhat, hogy néhány leírás más verziókat is megemlít. Ez azért van, mert a szóban forgó szkript azzal a verzióval is kompatibilis. Természetesen néhány apróbb módosítással az összes szkriptet kompatibilissá lehet tenni, de nem szükséges, mivel ez a leírás már az új verziókhoz készült.

A fájlok már korábban is tesztelve voltak, de a dokumentáció készítésekor a biztonság kedvéért még egyszer ellenőriztem az összeset és mindegyik hibátlánul működik. Egyes fájlokat (melyek távolról érhetők el) nem én készítettem, ezért előfordulhat, hogy azokat eredeti formájukban, módosítás nélkül szabad használni.

Amennyiben kérdése merülne fel a leírtakkal kapcsolatban vagy valamelyik kód nem működne, az alábbi email címen felveheti a kapcsolatot velem: info@mcomp.hu. A gyorsabb ügyintézés érdekeben ajánlott a kapcsolati ürlapot igénybe venni.

További kódok bejelentkezés után tekinthetők meg!

Icecast aktuális zeneszám lekérdezése


Icecast szerver esetében az aktuális zeneszám lekérdezése talán egy picit bonyolultabb, mint a népszerűbb SHOUTcast szervernél, viszont ugyanúgy szükségesnek tartom megosztani már csak azért is, mert a weboldalon Icecast szerver regisztráció is található, továbbá több hónap munkája volt, mire találtam olyan működő szkriptet amiket magam is használok. A későbbiekben találkozni fognak olyan résszel, mely egyedileg lett fejlesztve és ajánlott hozzá némi adatbázis (pl.: MySQL) szakértelem.


jQuery


Talán az egyik legegyszerűbb módja az aktuális zeneszám kijelzésének a következő példa, mely nem tartalmaz semmi extrát, bár némi szakértelemmel ez is tovább fejleszthető.

        <script src="https://www.nwr.hu/js/jquery-3.1.1.js" type="text/javascript"></script>
        <script>
            function show_song() {
                $.ajax({
                    url: 'http://ip:port/status.xsl?mount=/mountpoint',
                    cache: false,
                    success: function(data) {
                        $(data).find('tr').each(function() {
                            if ($(this).text().indexOf('Currently playing:') + 1) {
                                $('#nowplaying').html($(this).find('.streamstats').text());
                            }
                        });
                    }
                });
            }
        
        Lejátszási előzmények megjelenítése 5 másodperces frissítéssel:
        
            $(document).ready(function() {
                show_song();
                setInterval('show_song()', 5000);
            });
        </script>
        
        // A megjelenítéshez az alábbi kód szükséges:
        
        <div id="nowplaying"></div>
    

Látható, hogy a kód nem tartalmaz semmi extrát. Működése nagyon egyszerű, mivel az elérési útvonal alapján az eredeti táblázatból szedi ki a szükséges adatokat.


PHP


A következő két példa szinte alig tér el egymástól. Az első abban külömbözik, hogy több rádióállomás üzemeltetése esetén tudni kell az állomás pontos helyét, ami a forrás tömb után helyezkedik el és csak egy szám. Például:

        ["icestats"]["source"][2]["title"]
    

A másik példában már a forrás pontos nevét kell megadni, ezért nincs szükség a pozicíó felderítésére, mivel a forráspontokat nem lehet duplikálmi. Például:

        ["icestats"]["source"]["title"]
    

A gyakorlatban ez a két megjelenítési forma így néz ki:

        Készítsünk egy PHP fájlt, mondjuk nowplaying.php néven, majd írjuk be a következő kódok valamelyikét:
        
        <?php
            $url = "http://ip:port/status-json.xsl";
            $array = json_decode(@file_get_contents($url), TRUE);
            echo $songTitle = str_replace("'", " ", $array["icestats"]["source"][2]["title"]); // Aktuális zeneszám
Vannak olyan speciális karakterek, melyeket a PHP nem tud megjeleníteni, ezért helyette egy hibaüzenet jelenik meg, ami nagyon zavaró lehet. Emiatt van szükség az str_replace behelyettesítő opcióra.
    $url = "http://ip:port/status-json.xsl?mount=/mountpoint";     $array = json_decode(@file_get_contents($url), TRUE);     echo $songTitle = str_replace("'", " ", $array["icestats"]["source"]["title"]); // Aktuális zeneszám
Mivel ennél a megoldásnál megadjuk a parancsba, hogy a fájl melyik részére vagyunk kíváncsiak, nincs szükség pozíció megadására. Sőt...ha most szintén odaírnánk az előző példában szereplő számot egy hibaüzenet jelenne meg.
?> Aktuális zeneszám megjelenítése 5 másodperces frissítéssel: <p class="title"><?php require_once './nowplaying.php'; ?></p> <script src="https://www.nwr.hu/js/jquery-3.1.1.js" type="text/javascript"></script> <script>     $(document).ready(function() {         setInterval(function() {             $(".title").load("nowplaying.php");         }, 5000);     }); </script>

Az IceCast szerverek a SHOUTcast szerverekkel ellentétben nem rendelkeznek közvetlenül elérhető funkcióval a dalok előzményeinek vagy a legutóbb lejátszott műsorszámok megjelenítéséhez. Erre olyan megoldást találtam ki, amihez már szükséges a felhasználóknak ismerniük az adatbázisokat.

A következő szkript úgy működik, hogy létrehoz egy adatbázis-táblát a lejátszási előzményeknek a csatolási pont nevével, (így tesz külömbséget a több rádióállomás között) majd az éppen aktuális zeneszámot hozzáadja. Ha eléri a zeneszámok engedélyezett maximális értékét, akkor az utolsót mindig törli. Ez kiküszöböli azt, hogy egy végeláthatatlan adatbázis-tábla jöjjön létre. Ha csak egy rádiót üzemel elég egy history nevű táblát létrehozni az adatbázisban, ahol a lejátszott zeneszámokat tárolja. (Lásd: lenti kód)

Ahhoz, hogy ezt a módszert alkalmazni lehessen szükségünk van egy aktuális zeneszám megjelenítésére szolgáló szkriptre. Bármelyiket kiálaszthatjuk az eddig bemutatottak közül. Erre a célra tökéletesen megfelel a legegyszerűbb példakód, mivel csak azért van rá szükség, hogy a zeneszámot felvigyük at adatbázisba.

        <?php
            // Csatlakozás az adatbázishoz
            $dbc = mysqli_connect("domain", "username", "password", "database");
            $sql = "set names utf8";
            mysqli_query($dbc, $sql);
        
            // Adatbázis-tábla létrehozása
            $sqlCreate = "CREATE TABLE history (hid INT(11) NOT NULL AUTO_INCREMENT, title VARCHAR(100), addedtime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (hid)) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci";
            mysqli_query($dbc, $sqlCreate);
        ?>
        
        Készítsünk egy PHP fájlt, mondjuk nowplaying.php néven a már megszokott módon, csak most hozzáadunk egy adatbázis bejegyzést is:
        
        <?php
            $url = "http://ip:port/status-json.xsl?mount=/mountpoint";
            $array = json_decode(@file_get_contents($url), TRUE);
            $songTitle = str_replace("'", " ", $array["icestats"]["source"]["title"]); // Aktuális zeneszám
            echo $songTitle; // Aktuális zeneszám megjelenítése
        
            // Zeneszám mentése adatbázisba
            $datetime = date("H:i:s");
            $sqlFind = "select count(*) as db from history where title = '$songTitle'"; // Zeneszám keresése az adatbázisban.
            $tabla = mysqli_query($dbc, $sqlFind);
            list($db) = mysqli_fetch_row($tabla);
            if($db < 1) {
                $sqlAdd = "insert into history (title, addedtime) values ('$songTitle', '$datetime')";
                mysqli_query($dbc, $sqlAdd);
                // Csak akkor adja hozzá az adatbázishoz, ha még nem szerepel benne. Ha már létezik figyelmen kívül hagyja a kérést.
            }
            $sqlDel = "select * from history";
            $result = mysqli_query($dbc, $sqlDel);
            if(mysqli_num_rows($result) > 10) {
                $sql = "DELETE FROM history WHERE hid < (SELECT * FROM (SELECT (MAX(hid)-10) FROM history) AS a)";
                mysqli_query($dbc, $sql);
                // Ez egy fontos rész. A 10 - nél több bejegyzést törli, de úgy, hogy az utolsó 10 - et hagyja meg.
            }
        ?>
        
        Aktuális zeneszám megjelenítése 5 másodperces frissítéssel:
        
        <p class="title"><?php require_once './nowplaying.php'; ?></p>
        
        <script src="https://www.nwr.hu/js/jquery-3.1.1.js" type="text/javascript"></script>
        <script>
            $(document).ready(function() {
                setInterval(function() {
                    $(".title").load("nowplaying.php");
                }, 5000);
            });
        </script>
    

Hozzáértők láthatják, hogy nem egy bonyolult szkript. Ami fontos, hogy az adatbázist ne azon a PHP - n keresztül hozzuk létre, amelyiket időközönként frissítünk, mert hibába futhatunk. Csak azért raktam bele a kódba, hogy átláthatóbb legyen. Továbbá ügyeljünk arra is, hogy a zeneszám hozzáadása abban a fájlban szerepeljen amelyik frissül, hogy az új zeneszámo(ka)t is hozzáadja az adatbázishoz.

Most, hogy ez a kód elkészült, egyidejűleg el kell indítani egy lekérdezést, amihez egy másik fájlt kell létrehozni, hasonlóan az előzőhöz egy 5 másodperces frissítési ciklussal.

        Készítsünk egy PHP fájlt, mondjuk history.php néven a lejátszási előzmények lekérdezéséhez:
        
        <?php
            // Lejátszási előzmények lekérdezése
            $sql = "select title, addedtime from history order by hid desc limit 1, 10";
            // Ha a kezdőszám 1, akkor az aktuális zeneszámot a lejátszási előzményekben nem lehet látni. Állítsuk át nullára, ha meg szeretnénk jeleníteni.
            $result = mysqli_query($dbc, $sql);
            while(list($title, $addedtime) = mysqli_fetch_row($result)) {
                echo "<span style='color: #FDAA19;'><strong>" . $addedtime . "</strong>" . " | " . $title .  "</span><br>";
            }
        ?>
        
        Aktuális zeneszám megjelenítése 5 másodperces frissítéssel:
        
        <p class="history"><?php require_once './history.php'; ?></p>
        
        <script src="https://www.nwr.hu/js/jquery-3.1.1.js" type="text/javascript"></script>
        <script>
            $(document).ready(function() {
                setInterval(function() {
                    $(".history").load("history.php");
                }, 5000);
            });
        </script>
    

Látható, hogy a lekérdezés már egyszerűbb, néhány sorral megoldható. Amire ügyelni kell, hogy ugyanúgy frissíteni kell a szkriptet bizonyos időközönként, mint az aktuális zeneszámot, hogy a lejátszási előzmények meghelenítése is frissüljön.


Bizom benne, hogy hasznos dokumentációt adok ki a kezem közül, még ha picit hosszúra is iskerült. A kódok egytől-egyig ki lettek próbálva a dokumentáció készítésekor és jelenleg is használatban vannak. Amennyiben mégis hibába ütközne, vagy nem működne valamelyik kód, írjon bátran az info@mcomp.hu email címre vagy a kapcsolati űrlapon keresztül.