25 мая 2014 г.

mplayer и список радиостанций

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

И на последок пара скриншотов:

Выбор станции

Выбор потока

Комментариев нет:

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