Создаём простую, компактную и дешёвую интернет радиостанцию

в 12:23, , рубрики: linux, Orange Pi, php, Компьютерное железо, Настройка Linux, настройка сервера, хостинг, эксперименты

Софтовой платформой будет Linux, для простоты лучше использовать что-то распространённое, с кучей информации в интернете, если вдруг что-то пойдёт не так. Железом для интернет радиостанции может быть что угодно, полноценный сервер с вашими проектами, какой-нибудь старый ноутбук, или нетбук, мы же хотим дёшево, а особой производительности от железа нам не требуется.

Если же под рукой ничего такого нет, или нам нужен совсем бесшумный сервер, почему бы не попробовать использовать мини компьютер?
Что-то типа Raspberry Pi 3?
Нет, мы же хотим дешевле, так что нам нужно что-то типа Orange Pi.
У меня нашлась модель Orange Pi Pc Plus с 1GB DDR3 оперативной памяти и 8GB EMMC Flash.

Создаём простую, компактную и дешёвую интернет радиостанцию - 1

Что нам может ещё понадобиться?
Я хочу попробовать настроить всё по простому, поэтому ещё понадобится витая пара до роутера и карта памяти Micro SD, так как на прямую на микро компьютер операционную систему установить не получится. Я нашёл у себя карту памяти на 8 гигабайт, этого объёма вполне хватит.

Итак, первым делом нужно записать образ операционной системы на карту памяти.
Для серверов я предпочитаю использовать проверенный временем Debian (да, более молодое поколение, вероятнее всего, предпочитает CentOS, но седобородые согласятся со мной, что Debian всё ещё очень хорош).

Вообще, для Orange Pi на www.orangepi.org/downloadresources существует огромное количество готовых образов, но я всё-таки схожу на www.armbian.com/download и скачаю с dl.armbian.com/orangepipcplus торрент файл с armbian (в моём случае Debian_stretch_next.7z).
У меня Orange Pi Pc Plus, у вас может быть любой другой мини компьютер, поэтому ищите соответствующий образ.

После закачки распаковываем архив и видим образ в формате img. Кто чем хочет, тем и заливает образ, лично я предпочитаю Etcher (https://etcher.io). Вставили карту памяти, выбрали её, если у вас подключено несколько носителей, нажали кнопку шить, ввели пароль если у вас на десктопе или ноутбуке тоже стоит линукс.

Создаём простую, компактную и дешёвую интернет радиостанцию - 2

Карта с образом готова, можно начинать всё подключать.
Что же нам нужно, чтобы запустить и начать настраивать наш сервер?
Сам мини компьютер, интернет по Ethernet проводу и блок питания.
И всё.

Нет, конечно можно заморочиться, подключить монитор и клавиатуру и настраивать всё напрямую, но мне больше нравится клавиатура моего ноутбука, поэтому я буду настраивать свой мини компьютер удалённо, по SSH.

Итак, приступим, втыкаем кабель Ethernet, карту Micro SD с образом Armbian.
Осталось только подать питание на мини компьютер.
А вот с питанием на Orange Pi всё очень печально. Что есть на нормальном мини копьютере? Правильно, Micro-USB, а как можно запитать Orange Pi? Только 5V через штырьковый разьём, который покупается отдельно.

Адаптер питания с подходящим разьёмом стоит дороже, чем просто провод со стандартным USB на конце, поэтому можно взять его.
Если нет свободного блока питания с USB (а нам надо не абы какой, а на 2 ампера), то роемся в своём ящике с проводами, адаптерами и платами для компьютеров (у вас же есть такой ящик, правда?) и находим подходящий адаптер от какого-нибудь старого, давно разбитого ребёнком планшета, перепаиваем кабель и питание для нашего сервера готово.

Ну или просто берём зарядник от старого дискового mp3 плеера iRiver (он всего 4,7 вольта и 1,2 ампера но тоже работает).
Подаём питание и мы готовы перейти, собственно говоря, к тому, ради чего всё и затевалось, к созданию интернет радиостанции.

Если вы, так же как и я, намереваетесь обойтись минимумом периферии, то нам нужно узнать какой IP адрес получил наш мини компьютер. Самым простым способом узнать его, это зайти на свой роутер и посмотреть какой IP адрес роутер дал нашему серверу (ваш роутер же умеет DHCP, правда?).

Теперь можно заходить по SSH на наш сервер. Кому какой SSH клиент удобен, тот тем и пользуется (мало ли у вас виндовс, а как там с SSH клиентами я вот вообще не в курсе).
В моём случае я просто забиваю в консоль ssh root@192.168.0.88, соглашаюсь на добавление ключа ECDSA, пароль по умолчанию для root установлен «1234», авторизовавшись мы оказываемся в консоли микрокомпьютера, который сразу же предлагает сменить пароль root.

Создаём простую, компактную и дешёвую интернет радиостанцию - 3

После этого предлагается создать аккаунт непривилегированного пользователя, создаём.
По сравнению с предыдущими версиями ОС, текущая версия несколько упрощена в плане настроек и много чего уже настраивается автоматически.
У Armbian есть очень удобный инструмент настройки: armbian-config копируем команду в консоль и смотрим что нам может пригодиться.

Создаём простую, компактную и дешёвую интернет радиостанцию - 4

Настройки системы нам пока что не нужны, но они могут понадобится позже, например для переноса настроенной системы с Micro SD на встроенную 8GB EMMC Flash память мини компьютера.

Нам будет полезен раздел Network, всё-таки неплохо бы иметь серверу статический IP адрес. Нашу интернет радиостанцию можно подключить к сети даже по Wi-Fi. Уровень извращённости каждый устанавливает себе сам, но если вы строите интернет радио чисто для себя и не планируется более 10 слушателей одновременно, то почему бы наш сервер и не подцепить всё-таки по Wi-Fi? В крайнем случае, воткнуть кабель Ethernet можно в любой момент.

Итак, мы определились с типом подключения, теперь нам нужно настроить статический IP адрес, для этого мы идём в настройки IP и выбираем нужный интерфейс сети, после чего мы говорим, что хотим статичный адрес, заводим его и сохраняем настройки. Менять маску и шлюз нет необходимости, так как они получены от вашего роутера по DHCP.

Создаём простую, компактную и дешёвую интернет радиостанцию - 5

После того, как вы введёте новый IP адрес и нажмёте Enter, ваша SSH сессия тут же зависнет, так как сразу же у устройства появится новый IP адрес. Поэтому просто закрываем окно с терминалом и заходим на наш мини компьютер по SSH используя новый IP адрес.

Кстати, раз все функции у нас будут иметь административный характер, чтобы не писать постоянно перед каждой командой sudo, я просто авторизуюсь на мини компьютере под пользователем root.

Запустив armbian-config снова мы можем посмотреть что можно настроить ещё интересного? В разделе Personal мы можем настроить временную зону, локаль и имя хоста. Я добавил локаль ru_RU.UTF-8 UTF-8, вдруг пригодится.

Чтобы применились настройки нужно выйти из утилиты настройки, разлогиниться и зайти снова, или перезагрузить сервер командой reboot.
Я использовал команду reboot, чтобы убедиться, что настройки сохранились и сервер с ними успешно стартует.
Базовая настройка сервера произведена и почему бы не установить работающую с MicroSD ОС на внутреннюю EMMC Flash память? Конечно, если ваш мини компьютер имеет на борту эту самую память.

Для этого заходим в armbian-config — System — Install, выбираем доступный накопитель, жмём Enter, получаем привет из прошлого, соглашаемся и выбираем тип файловой системы ext4.

Создаём простую, компактную и дешёвую интернет радиостанцию - 6

Теперь мы можем откинуться на спинку кресла и дожидаться пока OS перенесётся на внутренний накопитель мини компьютера.

Создаём простую, компактную и дешёвую интернет радиостанцию - 7

После завершения копирования, выбираем отключить питание. Ждём пару секунд пока не погаснет светодиод на мини компьютере, выдёргиваем питание, вынимаем MicroSD карту, втыкаем питание обратно и включаем компьютер.

Да, если у вас нет внутренней памяти и вы не перенесли на неё операционную систему, вытащить MicroSD, вероятнее всего, будет не очень хорошей идеей.

После входа на наш мини компьютер по SSH и убедившись, что всё работает, можно начинать настраивать саму радиостанцию.

Первым делом обновляем информацию о пакетах, вбив apt update в консоль сервера.
Да, я люблю комфорт, поэтому устанавливаю mc командой apt install mc.
Я люблю всё делать из под mc, а если мне нужно увидеть консоль, я просто нажимаю ctrl+o.

Первым делом устанавливаем сам музыкальный плеер-демон: apt install mpd.
Вместе с ним установится куча зависимостей.

Перейдем к настройке. За конфигурацию демона отвечает файл /etc/mpd.conf, открываем его командой nano /etc/mpd.conf.
Имя моего пользователя без привилегий hzs, и мой конфигурационный файл выглядит примерно так:

music_directory         "/home/hzs/music"
playlist_directory      "/home/hzs/.mpd/playlists"
db_file                 "/home/hzs/.mpd/tag_cache"
log_file                "/home/hzs/.mpd.log"
pid_file                "/home/hzs/.mpd/pid"
state_file              "/home/hzs/.mpd/state"
sticker_file            "/var/lib/mpd/sticker.sql"

user                    "hzs"
bind_to_address         "localhost"
restore_paused "yes"

metadata_to_use "artist,title"
auto_update             "yes"

audio_output {
        type            "httpd"
        name            "My New Internet Radio Station!!!"
        encoder         "lame"                  # optional, vorbis or lame
        port            "8000"
        bind_to_address "0.0.0.0"               # optional, IPv4 or IPv6
        bitrate         "256"                   # do not define if quality is defined
        format          "44100:16:2"
}

volume_normalization    "yes"
filesystem_charset      "UTF-8"
id3v1_encoding          "UTF-8"

Тут всё понятно и без особых комментариев.
Для работы нужно создать структуру директорий из верхней части настроек. Обратите внимание, хозяином для этих директорий должен быть непривилегированный пользователь, от которого будет всё работать, в моём случае hzs.
Из под root выполняем следующие команды:
chown -cR hzs:hzs /home/hzs/music
chown -cR hzs:hzs /home/hzs/.mpd

Пора заливать музыку, у нас на сервере есть SSH, так что мы можем законнектиться любимым FTP клиентом к нашему серверу.
IP адрес нам известен, порт 22, имя пользователя и пароль те, что вы задали при создании непривилегированного пользователя, тип соединения SSH. Заливаем немного музыки для теста в директорию для музыки, указанную в конфиге.

Создаём простую, компактную и дешёвую интернет радиостанцию - 8

Сейчас проигрыватель запущен с неправильным конфигом, поэтому останавливаем демона и запускаем его снова:
service mpd stop
service mpd start
Для простейшего управления демоном мы поставим консольную утилиту mpc командой apt install mpc.
После установки немного сконфигурируем проигрыватель:
mpc random on
mpc repeat on

Сейчас нужно добавить треки а плейлист, в консоли это несколько гиморройно, но ничего не поделать.
Смотрим доступные нам файлы, которые мы можем добавить в плей лист:
mpc ls
Чтобы добавить файл в плейлист, в команде mpc add мы должны указать полное имя добавляемого файла, выбор по маске не работает:
mpc add "01 Lost in Your Eyes.mp3"
Смотрим получившийся плейлист:
mpc playlist
Пора запускать нашу радиостанцию:
mpc play

Создаём простую, компактную и дешёвую интернет радиостанцию - 9

Попробуем послушать, для этого в любом аудиоплеере открываем аудио поток нашей радиостанции. Для этого вводим адрес потока http://ip:port, у меня это http://192.168.0.90:8000.
Audacious играл с перебоями, была проблема с кешированием, а вот SMPlayer и VLC проблем не ощутили.

Создаём простую, компактную и дешёвую интернет радиостанцию - 10

Создаём простую, компактную и дешёвую интернет радиостанцию - 11

Создаём простую, компактную и дешёвую интернет радиостанцию - 12

В принципе, на данном этапе наша интернет радиостанция уже работает, нужно добавить в плейлист музыки и пробросить порты на роутере, чтобы наша интернет радиостанция стала всё-таки интернет радиостанцией, а не радио в локальной сети.

У меня есть несколько доменов, так что первым делом я в настройках DNS создаю «A» запись с testradio и статическим внешним IP адресом моего роутера дома. Вам этого делать необязательно.

Далее на своём роутере я настраиваю port forwarding.
Так как у меня уже есть своя радиостанция на большом сервере, я указываю внешний исходный порт 9000, а внутренний локальный 8000, таким образом из вне радиостанция будет вещать по http://внешний_ip:9000.

Создаём простую, компактную и дешёвую интернет радиостанцию - 13

Всё, теперь у нас получилась «настоящая» интернет радиостанция.

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

Существует куча консолей управления, некоторые можно посмотреть тут: musicpd.org/clients, но я буду использовать Pitchfork MPD Client: sourceforge.net/projects/pitchforkmpd

Это полноценная web морда, и да, мы будем стрелять пушкой по воробьям и поднимем полноценный http сервер на мини компьютере с нашей радиостанцией:
apt install apache2
Так же нам понадобится PHP:
apt-get install php
Ещё понадобятся
apt install php7.0-xml
и
apt install php-pear

Создаём в домашней папке директорию /home/hzs/wwwroot/pf и распаковываем в неё предварительно загруженный по SSH Pitchfork MPD Client.

Создаём простую, компактную и дешёвую интернет радиостанцию - 14

В конфигурационном файле веб сервера apache2 /etc/apache2/sites-available/000-default.conf
nano /etc/apache2/sites-available/000-default.conf
всё выкашиваем и пишем (не забывая поменять «hzs» на имя своего пользователя):

<VirtualHost *:80>
    ServerName localhost
    ServerAdmin webmaster@localhost
    DocumentRoot /home/hzs/wwwroot
    <Directory /home/hzs/wwwroot/>
        Options All
        AllowOverride All
        DirectoryIndex index.php index.html index.htm
        Order Allow,Deny
        Allow from All
        Require all granted
    </Directory>
</VirtualHost>

После чего перезагружаем http сервер
service apache2 restart

Зайдя по адресу своего сервера IP/pf (в моём случае: http://192.168.0.90/pf)
Мы увидим пульт управления:

Создаём простую, компактную и дешёвую интернет радиостанцию - 15

Всё достаточно просто и интуитивно понятно.
Далее нажимем на иконку папки справа и вкладку Filesystem.
Для обновления списка файлов нажимам кнопку Update DB, после чего выбираем оставшиеся файлы, которые у нас до сих пор отсутствуют в плейлисте и нажимаем кнопку Add чуть ниже.

Обновляем страницу и видим, что все файлы у нас добавились в плейлист:

Создаём простую, компактную и дешёвую интернет радиостанцию - 16

Если нужно спрятать управление проигрывателем под пароль, то можно отредактировать конфигурационный файл:
nano /home/hzs/wwwroot/pf/config/config.xml
Там вполне понятная структура настроек.

Итак, у нас получился полноценный сервер интернет радиостанции размером 10*7*3 сантиметра. Конечно, используемый маломощный сервер не потянет сотни слушателей, но он как минимум не оставит вас без любимой музыки где бы вы ни были, если рядом найдётся интернет.

В принципе, можно не продолжать читать, но для особо упорных продолжаем дальше.
У нас же есть полноценный веб сервер, почему бы…
Ну вы уже поняли.

Создаём в корне нашего веб сервера директорию testradio, создаём в ней файл "index.php":

<!DOCTYPE html>
<html xmlns="https://www.w3.org/1999/xhtml" xml:lang="ru-ru" lang="ru-ru" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>My Test Radio</title>
<script src="jquery-3.3.1.min.js"></script>
</head>
<body>

	<h1>My Test Radio</h1>
	<div id="song">
		now playing:<br>
		<div id="title">now playing</div>
		<br>
		<div>
			<span id="play" type="button">Play</span>
			<span id="pause" type="button">Pause</span>
		</div>
		<br>
		<div>
			vol:<br>
			 <input id="volume" type="range" min="0" max="10" value="5" />
		 </div>
		<span id="duration"></span>
		<br>
		<div>256 kbps</div>
	</div>

<script language="JavaScript">
	var audio = new Audio('http://testradio.nisel.ru:9000');
	var play = document.getElementById('play');
	play.addEventListener('click', function() {
		audio.play();
	}, false);
	var pause = document.getElementById('pause');
	pause.addEventListener('click', function() {
	     audio.pause();
	}, false);
	var volume = document.getElementById('volume');
	volume.addEventListener('change', function(){
	    audio.volume = parseFloat(this.value / 10);
	}, false);
	audio.addEventListener("timeupdate", function() {
	    var duration = document.getElementById('duration');
	    var s = parseInt(audio.currentTime % 60);
	    var m = parseInt((audio.currentTime / 60) % 60);
	    var h = parseInt((audio.currentTime / 3600) % 60);
	    if (s < 10) s = '0' + s;
	    if (m < 10) m = '0' + m;
	    if (h < 10) h = '0' + h;
	    duration.innerHTML = h + ':' + m + ':' + s;
	}, false);
</script>

<script  language="JavaScript">  
    function show()  
    {  
        $.ajax({  
            url: "trackname.php",  
            cache: false,  
            success: function(html){  
                $("#title").html(html);  
            }  
        });  
    }
    $(document).ready(function(){  
        show();  
        setInterval('show()',5000);  
    });  
</script>
</body>
</html>

Это простейший пример создания плеера для сайта, так же он умеет выводить название текущей композиции, обновляемое с помощью ajax каждые 5 секунд.

Внешний вид можно допилить по вкусу с помощью css.

В коде видно, что аудио поток уже идёт по адресу, указанному в DNS моего домена.
Не забываем закинуть в директорию файл jquery (в моём случае jquery-3.3.1.min.js). Вообще, конечно, jquery тут перебор и можно было бы сделать ajax запрос без него, но думать оказалось совсем лень и я использовал готовый кусок кода.

Далее создаём файл "trackname.php":

<?php echo file_get_contents('http://192.168.0.90/mpc');?>

Так же в корне веб сервера создаём директорию «mpc» а в ней файл "index.php":

<?php echo exec('mpc current');?>

Зачем такие костыли могут спросить некоторые, дело в том, что в моей боевой радиостанции сервер плеера находится на одном сервере, а веб морда сайта, находится на физически другом веб сервере.

Создаём простую, компактную и дешёвую интернет радиостанцию - 17

Так как опрашивать проигрываемый трек нужно непосредственно на сервере с проигрывателем, то директория веб сервера mpc должна быть на нём, а файл "trackname.php" находится на веб сервере самого сайта и подгружает файл с описанием трека с другого сервера по его IP адресу.

Сам плеер и сайт радиостанции могут находиться очень далеко друг от друга и общаться как по внешним IP адресам, так и по адресам, забитым в DNS. Чтобы всё работало, нужно всего лишь правильно пробросить порты.

Дорабатывать проект можно по своему вкусу, ну я а приятно провёл субботнюю половину дня.
Всем удачных экспериментов!

Автор: Александр

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js