В продолжение темы 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 (аллилуйя). В коде строчка с конвертацией кодировки тегов закомменирована.
И на последок пара скриншотов:
Выбор станции
Выбор потока
Комментариев нет:
Отправить комментарий