В продолжение темы mplayer, сетевое вещание и тэги в cp1251 хочу рассказать о дальнейшем развитии скрипта для прослушивания интернет радиостанций.
Думаю не только у меня одного, но со временем playlist любимых радиостанций начинает приедаться, а на тех радиостанциях, где человек ответственный за содержание playlist-ов к работе относится не сильно добросовестно, ты уже начинаешь угадывать какая будет следующая песня. И вот в таких ситуациях хотелось бы послушать чего-нибудь другого.
Для начала необходимо создать список радиостанций. А чтобы его не собирать частями по всему интернету, лучше всего взять уже готовый. Такой список я нашел в коде странички на сайте radio.i.ua. Это список радиостанций с url сайтов, потоков и всего остального. Выглядит примерно так:
{
"3": {
"id": "3",
"alias": "hit.fm",
"name": "Хіт FM",
"nameUA": "Хіт FM",
"isFavorited": "0",
"nowListen": "2141",
"rate": "8286",
"url": "http://www.hitfm.ua",
"logo": "http://i.i.ua/radio/logo/3/3.jpg",
"streams": {
"128kb": "http://online-hitfm.tavrmedia.ua/HitFM"
}
},
"5": {
"id": "5",
"alias": "radio.roks",
"name": "Radio ROKS",
"nameUA": "Radio ROKS",
"isFavorited": "0",
"nowListen": "37",
"rate": "4105",
"url": "http://www.radioroks.com.ua",
"logo": "http://i.i.ua/radio/logo/5/5.jpg",
"streams": {
"128kb": "http://online-radioroks.tavrmedia.ua/RadioROKS",
"32kb": "http://online-radioroks.tavrmedia.ua/RadioROKS_32"
}
},
}
Это стандартный JSON и все, что нам нужно так это его отпрарсить и сформировать список радиостанций.
Для этого я решил использовать утилиту jshon есть еще альтернатива под названием jq но я не осилил ее синтаксис и решил не напрягаться :)
Идея работы скрипта следующая:
- Парсим файл получаем список радиостанций
- Выводим диалог со списком станций для выбора
- Если у выбранной станции более чем один поток вызываем диалог с выбором потока
- Проигрываем выбранный поток в бесконечном цикле
Очередная порция листингов:
Файл screen-a имеет вид
$ cat ~/.screenrc-mplayer
# ScreenRC
# vi:ts=4:sw=4
vbell off
multiuser on
autodetach on
startup_message off
defscrollback 100000
defsilence on
screen -t shell 0
screen -t mplayer 1 $HOME/.mplayer/mplayer.sh
screen -t title 2 $HOME/.mplayer/title.sh
hardstatus alwayslastline "%{= KW}%-w%{= wk}%50>%n %t%{-}%+w%<"
Скрипт запускающий mplayer
$ cat ~/.mplayer/mplayer.sh
#!/bin/bash
#define options as array
declare -a options
declare -a optionsStream
stationPath=$(cd $(dirname $0); pwd)
countStation=$(jshon -l < ${stationPath}/station.json)
cmd=(dialog --title "Какую радиостанцию послушаем:" --menu "Всего радиостанций: $countStation" 42 106 42)
while read -r numberStation
do
nameStation=$( jshon -e ${numberStation} -e name < ${stationPath}/station.json )
options[${#options[*]}]=${numberStation}
options[${#options[*]}]=${nameStation}
done < <(jshon -k -S < ${stationPath}/station.json | sort -n)
choiceStation=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
retval=$?
clear
if [ $retval -ne 0 ]; then
exit 0
fi
countStream=$(jshon -e ${choiceStation} -e streams -l < ${stationPath}/station.json)
if [ ${countStream} -gt 1 ]; then
keyStream=1
while read -r numberStream
do
url=$( jshon -e ${choiceStation} -e streams -e "${numberStream}" -u < ${stationPath}/station.json )
optionsStream[${#optionsStream[*]}]=${numberStream}
optionsStream[${#optionsStream[*]}]=${url}
done < <(jshon -e ${choiceStation} -e streams -k < ${stationPath}/station.json | sort -n)
keyStream=$("${cmd[@]}" "${optionsStream[@]}" 2>&1 >/dev/tty)
retval=$?
clear
if [ $retval -ne 0 ]; then
exit 0
fi
else
keyStream=$(jshon -e ${choiceStation} -e streams -k < ${stationPath}/station.json)
fi
url=$(jshon -e ${choiceStation} -e streams -e "${keyStream}" -u < ${stationPath}/station.json)
while sleep 1; do
mplayer -msgcolor $url 2>&1 | tee ~/.mplayer/mplayer.log;
done
Скрипт выводящий уведомления
$ cat ~/.mplayer/title.sh
#!/bin/bash
# Имя приложения
NAMEAPP=mplayer
# Номер сообщения, необходим чтобы сообщение перезаписывалось, может быть любым, если будет = 0, будут добавлятся новые сообщения
NUMBER=1
# Имя иконки
ICON=kmplayer
#ICON=amarok
#ICON=dragonplayer
# Заголовок
HEAD="Сейчас играет"
# Время отображения сообщения
TIMEOUT=3000
tail -n1 -F ~/.mplayer/mplayer.log |
while read title
do
# вычислим название песни
SONGNAME=`echo $title | grep -i icy | cut -d = -f 2 | cut -d \' -f 2 | grep -v '^ -' `
# проверим не пустое ли название
[[ -z ${SONGNAME} ]] && continue
# отобразим сообщение
gdbus call --session \
--dest org.freedesktop.Notifications \
--object-path /org/freedesktop/Notifications \
--method org.freedesktop.Notifications.Notify \
${NAMEAPP} \
${NUMBER} \
${ICON} \
"`echo ${HEAD}`" \
"`echo ${SONGNAME}`" \
[] \
{} \
${TIMEOUT}
done
# "`echo ${SONGNAME} | iconv -f cp1251`" \
Кстати, за последние 3 года радиостанции в основной своей массе одуплилисьи и начали передавать теги песен в UTF-8 (аллилуйя). В коде строчка с конвертацией кодировки тегов закомменирована.
И на последок пара скриншотов:
Выбор станции
Выбор потока


Комментариев нет:
Отправить комментарий