Archive for April, 2014

Записване на онлайн радио

Thursday, April 3rd, 2014

От известно време слушам Eurodance канала на Digitally Imported. Отвреме навреме пускат уникални миксове, които не могат да бъдат намерени никъде из нета. За това се захванах и написах едно кратко скриптче за да ги рипна.

Радиото излъчва ICY таг, който съдържа името на песента. По този таг може да се разделят песните в общия стрийм, като единствения кусур е че идва с няколко секунди закъснение или предварение.

Използвах -dumpstream опцията на mplayer за записване на потока. Паралелно с това върви още един mplayer процес, който наблюдава за пристигането на ICY таг и пуска ново записване в нов файл. Скрипта създава нова директория за всеки ден, като песните които запазва са с префикс на времето в което са излъчени.

  1. #!/bin/bash
  2.  
  3. # задаваме някой директории и файлове
  4. FIFO=/tmp/mplayer_recording
  5. OUT_DIR=/home/ivanatora/di.fm
  6.  
  7. LAST_PID=0
  8. LAST_SONG=""
  9.  
  10. if [ ! -e "$FIFO" ]
  11. then
  12.     mkfifo $FIFO
  13. fi
  14.  
  15. # това е процесът, който следи таговете с имената на песните и ги изпраща в едно FIFO
  16. nohup mplayer -ao null http://pub3.di.fm:80/di_eurodance | stdbuf -o L grep ICY > /tmp/mplayer_recording &
  17.  
  18. # тук четем от FIFO-то и пускаме нов записващ процес при получаване на ICY таг
  19.  
  20. while read LINE < $FIFO; do
  21.     DATE=`date +%F`
  22.     if [ ! -d "$OUT_DIR/$DATE" ]
  23.     then
  24.         mkdir "$OUT_DIR/$DATE"
  25.     fi
  26.  
  27.     echo "—–"
  28.     echo $LINE
  29.     # името на песента е заградена в единични кавички
  30.     # @TODO: понякога в самото име има единични кавички – да се обмисли този случай
  31.     SONG=`echo $LINE | cut -d\‘ -f2 | sed -e ‘s/ /_/g‘`
  32.    echo "Last: $LAST_SONG"
  33.    echo "Current: $SONG"
  34.    # тук имам един бъг някъде – получавам таговете по два пъти. Това е workaround, който дава да се продължи само ако тагът който идва е различен от предния.
  35.    if [ "$SONG" != "$LAST_SONG" ]
  36.    then
  37.        TIME=`date +%T`
  38.        echo "##### $TIME"
  39.  
  40.        # ако вече имаме записващ процес – време е да го спрем и да пуснем нов
  41.  
  42.        if [ $LAST_PID -ne 0 ]
  43.        then
  44.            kill $LAST_PID
  45.        fi
  46.  
  47.        nohup mplayer http://pub3.di.fm:80/di_eurodance -dumpstream -dumpfile "$OUT_DIR/$DATE/$TIME"_"$SONG".mp3 &
  48.        LAST_PID=$!
  49.        LAST_SONG="$SONG"
  50.    fi
  51. done

Тук имам следние проблеми:
1) Таговете ми идват по два пъти.
2) Закъснението на таговете, което не е константа, която може да бъде уловена и компенсирана. На практика няколко секунди от началото на песента се записват в предния файл.
3) Предполагам че може да бъде оптимизирано и направено само с 1 mplayer процес.
4) Ако ми умре нета за секунда, mplayer-ите се прекратяват, което минава през фифото и цикъла `while read` заминава.

Някой bash-майстор може да се произнесе с идеи 🙂