Многие из нас по утрам любят слушать радио. И вот в одно прекрасное утро я осознал, что не хочу слушать местные ФМ радиостанции. Не интересно. Но привычка оказалась вредной. И я решил заменить ФМ-приемник интернет приемником. Быстренько купил детали на Алиэкспресс и собрал интернет приемник.
О интернет приемнике. Сердце приемника — микроконтроллер ESP32. Прошивка от KA-radio. Стоимость деталей мне обошлась в 12 долларов. Простота сборки мне позволила собрать его за пару дней. Хорошо и стабильно работает. За 10 месяцев работы зависло только пару раз и то только из-за моих экспериментов. Удобный и продуманный интерфейс позволяет управлять с смартфона и компьютера. Одним словом это замечательный интернет приемник.
Все классно. Но одним ранним утром пришел к выводу, что при наличии доступа к десяткам тысяч радиостанций нет интересных станций. Меня раздражала реклама, тупые шутки ведущих. Постоянно прыгал с одной станции на другую. Мне нравится Spotify и Яндекс.Музыка. Но печаль в том, что не работают они в моей стране. И хотел бы их слушать через интернет приемник.
Я вспомнил своё детство. У меня был магнитофон и два десятка кассет. Кассетами менялся с друзьями. И было чудесно. Я решил, что надо сделать стриминг своих аудиоархивов только на интернет приемник. Конечно, есть вариант подключить аудиоплеер или ipod к колонкам и не париться. Но это не наш путь! Ненавижу подключать разъемы)
Начал искать готовые решения. На рынке есть предложение создать своё интернет-радио от Radio-Tochka.com. Я потестировал 5 дней. С моим интернет приемником все работало прекрасно. Но цена оказалась для меня не привлекательной. Отказался от этого варианта.
У меня есть оплаченный хостинг 10 GB. Решил написать скрипт на чем-нибудь, что бы был стриминг аудио потока моих mp3 файлов. Решил написать на PHP. Быстренько написал и запустил. Все заработало. Было классно! Но через пару дней пришло письмо от администрации хостинга. В нем говорилось о превышении лимита процессорных минут и необходимости перейти на тариф повыше. Скрипт пришлось удалить и отказаться от этого варианта.
Ну как так? Не могу жить без радио. Если не дают запускать скрипт на чужом хостинге, значит надо свой сервак. Где я буду делать то, что моя душа пожелает.
У меня нетбук древний лежит без аккумулятора (CPU — 900 MHz, RAM — 512 Mb). Старичку 11 лет уже. Для сервака подойдет вполне. Ставлю Ubuntu 12.04. Затем устанавливаю Apache2 и php 5.3, samba. Мой сервак готов.
Решил попробовать Icecast. Много читал маны по нему. Но мне он показался сложным. И я решил возвратиться к варианту со скриптом на PHP. Пару дней было потрачено на отладку этого скрипта. И всё прекрасно заработало. Затем я еще написал скрипт для воспроизведения подкастов. И мне это так понравилось, что решил сделать небольшой проект. Назвал его IWScast.
Все очень просто. Файлы mp3 и файл index.php копирую в корневую папку апача /var/www/ и они рандомно воспроизводятся. Около 300 песен хватает на весь день приблизительно.
Файл index.php — это и есть сам скрипт. Скрипт считывает все имена мр3 файлов директории в массив. Создает аудио поток и подставляет имена мр3 файлов. Бывают моменты, когда слушаешь песню и тебе она нравится. Ты думаешь, кто это поёт? Для такого случая есть запись названий прослушанных треков в лог log.txt
Код скрипта полностью
<?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);
}
?>
Если нужно, что бы треки воспроизводились по порядку, то необходимо в index.php закомментировать строку
shuffle($files); //Random on
Для подкастов использую /var/www/podcast/ Там другой скрипт index.php. В нем есть запоминание треков подкастов. При следующем включении интернет приемника воспроизводится следующий трек подкаста. Так же есть лог воспроизводимых треков.
В файле counter.dat можно указать номер трека и с него начнется воспроизведения подкастов.
Писал парсеры для автоматического скачивания подкастов. Он берет из RSS 4 последних трека и скачивает их. Все это замечательно работает на смартфоне, IPTV приставке, в браузере.
Недавно утром мне пришла мысль, что было замечательно сделать запоминание позиции воспроизведения на треке. Но не знаю пока, как сделать это на PHP.
Скрипт можно скачать
Источник: habr.com