Детектор тишины на liquidsoap

Исходные данные:

Имеем linux c настроенным icecast как в статье Запись нескольких радиостанций. Хотя конечно можно брать любой источник звука.

Задача:

Посылать письма при пропадании и появлении сигнала.

Решение:

liquidsoap

Читаем про liquidsoap и устанавливаем:

sudo apt install liquidsoap

В целом liquidsoap позволяет делать кучу всего со звуковыми потоками, но нас интересует детектор тишины, не буду мучать вот скрипт silent_detector_radio.liq:


# Описываем источник
s = mksafe(input.http("http://air-control:8000/radio.m3u"))

# Функция которая будет выполнятся когда когда будет обнаружена тишина
def silentscript()
system("/home/liq-script/liquidsoap-script/silentscript.sh Пропал звук. Внимание на Радио пропал звук.")
end

# Функция которая будет выполнятся когда когда будет вновь появится звук
def noisescript()
system("/home/liq-script/liquidsoap-script/silentscript.sh Вернулся звук. На Радио вернулся звук.")
end

# Собственно оборачивание потока встроенной функцией on_blank которая реагирует на тишину
source = on_blank(track_sensitive=false, max_blank=5., on_noise=noisescript, silentscript, s)
source = mksafe(source)

# Вывод в несуществующий выход
# (может быть и реальный выход и вообще возможно подавать звук с другого источника, но это не та история)
output.dummy(source)

Файл отправки писем silentscript.sh:


#!/bin/bash

# Скрипт отправляет строку параметров на почту и sms
# Принимает первый параметр станция без пробелов
# Второй и третий параметр - это событие (пропал звук, звук восстановлен)
# sms - отправляет только три первых параметров
# на почту первые три памаметра уходит в тему, все остальные параметры в тело письма
#echo $* - все параметры

FROM="alarm@i-rrv.ru"
TO="alarm@i-rrv.ru"
SMS="+79230000000@sms.megafonsib.ru"

DATE=`date +%Y.%m.%d_%H:%M`

# Отправка на почту
(echo "From: "${FROM}; echo "To: "${TO}; echo "Subject: "$1" "$2" "$3; echo; echo $*" "${DATE}) | /usr/sbin/ssmtp ${TO}

# Перевод в латиницу если будет нужно
#rus=`echo ЭАБДЕФГХИКЛМНОПРСТУВВЗЙабдефгхиклмнопрстуввзйэ | iconv -f 'utf8' -t 'cp1251'`
#en=`echo EABDEFGHIKLMNOPRSTUVWZYabdefghiklmnoprstuvwzye | iconv -f 'utf8' -t 'cp1251'`
#sub=`echo $1" "$2" "$3 | iconv -f 'utf8' -t 'cp1251' | tr ${rus} ${en} | iconv -f 'cp1251' -t 'utf8'`

# Перевод в кодировку koi8r (Для мегафона)
sub=`echo $1" "$2" "$3 | iconv -f 'utf8' -t 'koi8r'`
# Отправка SMS через Прием электронной почты в виде SMS (это у Мегафон, у МТС есть подобное)
(echo "From: "${FROM}; echo "To: "${TO}; echo "Subject: "${sub}; echo; echo ${DATE}) | /usr/sbin/ssmtp ${SMS}

liquidsoap-daemon

Ну в целом это все будет работать, но для того что бы контролировать несколько источников (у меня несколько радиостанций) требуется воспользоватся liquidsoap-daemon. С помощью liquidsoap-daemon возможно запуск нескольких скриптов liquidsoap в виде служб, без дополнительных усилий.
Установка: Создаем пользователя, качаем в домашний каталог liquidsoap-daemon с github и распаковываем. Если не установлен sudo, то ставим и настраиваем. Далее кратко, как это делал я, более подробная инструкция читайте в документации проекта.
Поместите скрипт который требуется запускать как демон сюда:

/liquidsoap-daemon/script/.liq

Запустите:

daemonize-liquidsoap.sh

от текущего пользователя, это создаст требуемые файлы.

Запуск как службы:

sudo systemctl start -liquidsoap

Остановка службы:

sudo systemctl stop -liquidsoap

Удаление:

mode=remove [init_type=] ./daemonize-liquidsoap.sh

В целом все 🙂

Leave a Reply