Многие из нас по утрам любят слушать радио. И вот в одно прекрасное утро я осознал, что не хочу слушать местные ФМ радиостанции. Не интересно. Но привычка оказалась вредной. И я решил заменить ФМ-приемник интернет приемником. Быстренько купил детали на Алиэкспресс и собрал интернет приемник.

О интернет приемнике. Сердце приемника — микроконтроллер 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. Выложил на github.

image

Все очень просто. Файлы 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: en\r\n"
       )
     )
   );
//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.

Скрипт можно скачать github.com/iwsys/IWScast

Комментарии (29)


  1. alexander222
    17.10.2019 18:46

    Тут скорее подошел бы аналог raspberry pi, в простой конфигурации примерно те же деньги, но решил бы обе задачи, и прослушивание интернет радио, и воспроизведние локальных файлов.


    1. kasigor Автор
      17.10.2019 19:47

      Согласен на 100%. Raspberry pi — замечательная вещь! Но нет его. Что было под рукой, то и использовал.


  1. dikiykot
    17.10.2019 21:16

    Можно подробнее, что нужно купить на али и как это собрать? Слушаю Di.fm но со смартфона по Bluetooth, хочется убрать смартфон, а лучше и вообще wifi


    1. vladkorotnev
      18.10.2019 04:37

      Увы, DI FM (если речь про Digitally Imported, который "Eliminate the ads, boost the quality!") отпилили все свои потоковые сервера и превратили сервис в банальный браузерный плеер с рандомайзером.
      До того их можно было просто стримить любым интернет-радио, чуть позже — через прокси с добавлением заголовка реферера.
      Теперь в лучшем случае поставить raspberry pi с браузером под это дело, если потянет.


      1. lord_of_demons
        18.10.2019 09:18

        Позвольте поправить. Описанное Вами касается только бесплатной модели использования. Платная подписка спасёт «отца русской демократии».

        Premium allows you to stream channels using popular hardware players including Sonos, Squeezebox, Denon, Phillips, Pioneer, Roku, or and that support vTuner or TuneIn. You can also use audio players like iTunes, Winamp, VLC, and others.


    1. kasigor Автор
      18.10.2019 09:02

      Очень подробная инструкция на ютубе
      Собирал по этой инструкции. Там все описано. Что и где купить, как прошить и собрать.


    1. nibbbler
      18.10.2019 09:03

      Элементарно: google->«KA-radio»


    1. Backuper
      18.10.2019 09:04

      присоединяюсь к вопросу и еще спрошу — как настроить собранный приемник на интернет радиостанции и на локальное воспроизведение?


      1. kasigor Автор
        18.10.2019 09:26

        Как настроить собранный приемник на интернет радиостанции?
        Смотрите здесь

        Как настроить собранный приемник на локальное воспроизведение?
        Где вводите адреса интернет радиостанций нужно ввести
        192.168.3.10/index.php

        192.168.3.10 — это ip адрес вашего компьютера, где установлен сервер Apache


    1. Salavat
      18.10.2019 09:07
      +1

      Могу запилить пост в песочницу, с комплектующими, схемой, прошивкой. Если нужно обществу. Хотя в интернете полно информации, только собирать надо кратко в кучу.


      Моя шарманка на кухне


  1. kuza2000
    17.10.2019 23:53
    +1

    Плюсанул. Но, на мой взгляд, статья была бы лучше, если было бы больше технических подробностей. Не хватает того, как устроен скрипт. Какие были проблемы при написании/отладке, как были решены, и т.д.


    1. vin2809
      18.10.2019 07:48

      Замысел отличный! Но, мне кажется, что в существующем виде статья больше похожа на отчет по практике на первом курсе.


      Добавьте технических подробностей (хотя бы ссылки на тексты скриптов) и статья оживет.


      1. kasigor Автор
        18.10.2019 09:38

        Согласен с Вами. Это моя первая статья.
        Ссылка есть в статье. github.com/iwsys/IWScast


    1. kasigor Автор
      18.10.2019 10:34

      Переписал. Добавил технических подробностей. Ошибки были в основном из-за неправильных прав на доступ к файлам. При этом создавались многомегабайтные логи ошибок в apache, из-за этого сервер подвисал.


      1. kuza2000
        19.10.2019 17:16

        Интересно. Не думал, что это можно сделать таким простым скриптом, возьму на заметку.
        Еще можно маленькую веб-мордочку прикрутить, на которой исполнитель, трек, и список последних десятка треков. Просто отображать в ней хвост log.txt.


  1. ibrin
    18.10.2019 00:16

    а можно ссылку на поток?


    1. kasigor Автор
      18.10.2019 09:29

      192.168.3.10/index.php, она работает только в локальной сети


      1. ibrin
        19.10.2019 11:09

        Жаль, ну это тогда интранет радио, а совсем не «глобальный широковещательный». Было бы занятно послушать оцифровки со старых кассет.


        1. kasigor Автор
          19.10.2019 11:59

          Покупаете внешний ip-адрес у провайдера и у вас глобальное широковещательное радио. Никаких проблем не вижу.


          1. ibrin
            19.10.2019 17:11

            Проблема в контенте. Кассеты у Вас!


      1. kuza2000
        19.10.2019 17:08

        Остается заказать провайдеру услугу внешнего IP и прокинуть порт через роутер, если есть. И слушать откуда угодно :)
        О, уже ответили…


  1. UrbanRider
    18.10.2019 10:46

    Интересно, но ice cast как по мне все таки лучше.
    А еще можно музыку сложить на удаленном диске, прицепить его по webdav и вообще будет счастье.
    Я в свое время описывал набор своих костылей для радио.

    Нужен iceCast + liquidsoap и будет красота.


    1. kasigor Автор
      18.10.2019 10:59

      Согласен. Icecast можно сказать это профессиональное решение.
      Много известных радио-компаний используют его.
      Мне он показался сложным. Мой скрипт, который занимает 888 байт вполне выполняет поставленную мной задачу. И надо только скопировать файл index.php в корень апача.


    1. JanisV
      18.10.2019 13:23

      Никак не могу понять назначение icecast. У меня на серваке крутится mpd, натравленный на папку с Аэростатом. Пробовал его «пропускать» через icecast — преимуществ не обнаружил.


  1. kot5150
    18.10.2019 14:08

    Не совсем радио, а скорее open source аудио стриминговый сервис:
    koel.phanan.net

    Когда-то ставил по-баловаться — отлично работал. Выглядит тоже хорошо.


  1. maxixx
    19.10.2019 09:40

    Запилите пожалуйста плагин под AIMP? сам искал как сделать подобное, но знаний написать самому не было


    1. kasigor Автор
      19.10.2019 09:44

      Теоретически должно работать с любым аудио-плеером, в котором есть функционал воспроизведения потоков. Без всяких плагинов. К примеру mplayer воспроизводит замечательно, я проверял. Я AIMPом 10 лет не пользовался.


  1. Tachyon
    21.10.2019 09:22

    О интернет приемнике. Сердце приемника — микроконтроллер ESP32. Прошивка от KA-radio. Стоимость деталей мне обошлась в 12 долларов. Простота сборки мне позволила собрать его за пару дней.
    А можно подробнее об этом?


  1. kasigor Автор
    21.10.2019 09:39

    Очень подробная инструкция на ютубе
    Собирал по этой инструкции. Там все описано. Что и где купить, как прошить и собрать.