Mnozí z nás rádi poslouchají ráno rádio. A pak jsem si jednoho krásného rána uvědomil, že nechci poslouchat místní rozhlasové stanice FM. Nemám zájem. Ukázalo se však, že tento zvyk je škodlivý. A rozhodl jsem se vyměnit FM přijímač za internetový přijímač. Rychle jsem nakoupil díly na Aliexpress a sestavil internetový přijímač.
O internetovém přijímači. Srdcem přijímače je mikrokontrolér ESP32. Firmware z KA-radia. Díly mě stály 12 dolarů. Snadná montáž mi umožnila sestavit ho za pár dní. Funguje dobře a stabilně. Za 10 měsíců práce to zamrzlo jen párkrát, a to jen kvůli mým pokusům. Pohodlné a promyšlené rozhraní umožňuje ovládání ze smartphonu a počítače. Jedním slovem je to úžasný internetový přijímač.
Všechno je v pořádku. Jednoho brzkého rána jsem ale došel k závěru, že přestože jsem měl přístup k desítkám tisíc rozhlasových stanic, nebyly tam žádné zajímavé stanice. Vadila mi reklama a stupidní vtipy moderátorek. Neustále přeskakování z jedné stanice na druhou. Líbí se mi Spotify a Yandex.Music. Ale smutné je, že v mé zemi nefungují. A chtěl bych je poslouchat přes internetový přijímač.
Vzpomněl jsem si na dětství. Měl jsem magnetofon a dvě desítky kazet. Vyměnil jsem si kazety s přáteli. A bylo to úžasné. Rozhodl jsem se, že potřebuji streamovat své audio archivy pouze do internetového přijímače. Samozřejmostí je možnost připojit k reproduktorům audio přehrávač nebo iPod a nestarat se. Ale tohle není naše cesta! Nesnáším spojování konektorů)
Začal jsem hledat hotová řešení. Na trhu je nabídka na vytvoření vlastního internetového rádia od Radio-Tochka.com. Testoval jsem to 5 dní. S mým internetovým přijímačem vše fungovalo dobře. Cena pro mě ale nebyla lákavá. Tuto možnost jsem odmítl.
Mám zaplacený hosting 10 GB. Rozhodl jsem se napsat skript k něčemu, co by streamovalo audio stream mých mp3 souborů. Rozhodl jsem se to napsat v PHP. Rychle jsem to napsal a spustil. Všechno fungovalo. Bylo to cool! Ale o pár dní později jsem dostal dopis od administrace hostingu. Bylo tam uvedeno překročení limitu minut procesoru a nutnost přechodu na vyšší tarif. Skript musel být smazán a tato možnost opuštěna.
Jak se to stalo? Nemůžu žít bez rádia. Pokud vám neumožňují spouštět skript na hostingu někoho jiného, potřebujete svůj vlastní server. Kde budu dělat to, po čem moje duše touží.
Mám prastarý netbook bez baterie (CPU - 900 MHz, RAM - 512 Mb). Staříkovi je již 11 let. Vhodné pro server. Instaluji Ubuntu 12.04. Poté nainstaluji Apache2 a php 5.3, samba. Můj server je připraven.
Rozhodl jsem se vyzkoušet Icecast. Přečetl jsem na něm hodně many. Ale přišlo mi to těžké. A rozhodl jsem se vrátit k možnosti s PHP skriptem. Laděním tohoto skriptu jsme strávili několik dní. A vše fungovalo skvěle. Pak jsem také napsal scénář k přehrávání podcastů. A zalíbilo se mi to natolik, že jsem se rozhodl udělat malý projekt. Nazval to IWScast.
Vše je velmi jednoduché. Zkopíruji soubory mp3 a soubor index.php do kořenové složky Apache /var/www/ a přehrávají se náhodně. Cca 300 skladeb vystačí přibližně na celý den.
Soubor index.php je samotný skript. Skript přečte všechny názvy souborů MP3 v adresáři do pole. Vytvoří zvukový proud a nahradí názvy souborů MP3. Jsou chvíle, kdy posloucháte písničku a líbí se vám. Kdo si myslíš, že zpívá? Pro takový případ existuje záznam názvů poslouchaných stop v log log.txt
Dokončete kód skriptu
<?php
set_time_limit(0);
header('Content-type: audio/mpeg');
header("Content-Transfer-Encoding: binary");
header("Pragma: no-cache");
header("icy-br: 128 ");
header("icy-name: your name");
header("icy-description: your description");
$files = glob("*.mp3");
shuffle($files); //Random on
for ($x=0; $x < count($files);) {
$filePath = $files[$x++];
$bitrate = 128;
$strContext=stream_context_create(
array(
'http'=>array(
'method' =>'GET',
'header' => 'Icy-MetaData: 1',
'header' =>"Accept-language: enrn"
)
)
);
//Save to log
$fl = $filePath;
$log = date('Y-m-d H:i:s') . ' Song - ' . $fl;
file_put_contents('log.txt', $log . PHP_EOL, FILE_APPEND);
$fpOrigin=fopen($filePath, 'rb', false, $strContext);
while(!feof($fpOrigin)){
$buffer=fread($fpOrigin, 4096);
echo $buffer;
flush();
}
fclose($fpOrigin);
}
?>
Pokud potřebujete, aby se skladby přehrávaly v pořadí, pak musíte zakomentovat řádek v index.php
shuffle($files); //Random on
Pro podcasty používám /var/www/podcast/ Existuje další skript index.php. Má zapamatování skladeb podcastů. Při příštím zapnutí internetového přijímače se přehraje další skladba podcastu. Nechybí ani log přehraných skladeb.
V souboru counter.dat můžete zadat číslo stopy a od něj začne přehrávání podcastu.
Napsal analyzátory pro automatické stahování podcastů. Vezme nejnovější 4 skladby z RSS a stáhne je. To vše funguje skvěle na smartphonu, IPTV set-top boxu nebo v prohlížeči.
Jednou ráno mě napadlo, že by bylo skvělé zapamatovat si pozici přehrávání na stopě. Ale zatím nevím, jak to udělat v PHP.
Skript lze stáhnout
Zdroj: www.habr.com