I tak oto co dzisiaj powstało:
Skrypt składa się z dwóch plików: mps oraz mps-icy.
Pierwszy to ten który uruchamiamy - można go traktować jako "gui", drugi uruchamiany jest automatycznie i ma za zadanie pobieranie danych z mplayera dzięki takiemu rozwiązaniu w konsoli nie mamy brzydkich, niezawsze potrzebnych informacji ale mamy za to to co nas interesuje: nazwe stacji, gatunek i tytuł aktualnego kawałka (o ile stacja radiowa wysyła ICY Info)
Instalacja:
- Skopiować zawartość code niżej do odpowiednich plików
- zapisać
- chmod a+x mps , chmod a+x mps-icy
- upewnić się, że istnieje ~/.mplayer (bo tam mps zapisuje pliki tymczasowe oraz swoją playlistę)
- upewnić się, że posiadamy mplayera (

- uruchomić ./mps (ja wrzuciłem sobie mps i mps-icy do ~/bin/ który wcześniej dodałem do PATH.. ale to już jak kto woli, grunt żeby mps mógł uruchomić mps-icy)
Jak to obsługiwać?
Prosto ^^ takie przynajmniej ja jako twórca mam wrażenie.
Po uruchomieniu najlepiej nacisnąć "h" na klawiaturze aby zobaczyć helpa.
Zmieniając troche kod można przypisać swoje ulubione stacje np pod klawisze (dosyć wygodne ^^)
Playlista zapisywana jest w ~/.mplayer/mps_playlist w formacie:
Kod: Zaznacz cały
nazwa;url
nazwa2;url
Kod: Zaznacz cały
:add rmffm http://213.251.141.62:8000
lub
:add rmffm
(wtedy skrypt zapyta o url)
lub
:add
(wtedy skrypt zapyta o nazwe i url)
Kod: Zaznacz cały
:list
Kod: Zaznacz cały
:play numer-na-liscie
lub
:play nazwa-stacji
Jeśli nie chcemy zaśmiecać sobie listy a tylko przesłuchać stację - możemy użyc :load które tylko wczyta i zacznie odtwarzać stream, mp3, film czy co tam jeszcze mplayer akceptuje

To mój pierwszy większy skrypt w bashu wiec w niektórych miejscach może wyglądać dziwnie - ale jestem otwarty na propozycje i sugestie, piszcie a jest pewna możliwość, że jeszcze rozwinę ten skrypcik ^^
LISTINGI
Plik ./mps
Kod: Zaznacz cały
#!/bin/bash
# MPS - skrypt do obslugi mplayera z konsoli
# 2008-02-06 szkuwa
function deinit {
rm $PIPE
rm $LOG
rm $BACK
}
function init {
# ustawiamy pliki
PIPE="$HOME/.mplayer/mps_pipe"
LOG="$HOME/.mplayer/mps_log"
BACK="$HOME/.mplayer/mps_back"
# na wszelki wypadek usuwamy pliki jesli istnieja
deinit
# ustawiamy domyslna playliste jesli nie zostala podana jako parametr
if [ -z "$1" ]
then
PLS="$HOME/.mplayer/mps_playlist"
else
PLS="$1"
fi
# tworzymy pliki i uruchamiamy mplayera
mkfifo $PIPE
mkfifo $LOG
touch $BACK
mps-icy > /dev/null & # do testow mozna ta linijke zakomentowac i mps-icy uruchamiac w innym terminalu
# icy mozna uruchomic w tle bo automagicznie powinien sie zamknac razem z mplayerem
mplayer -idle -quiet -input file=$PIPE > $LOG 2> /dev/null &
# ustawienie innych zmiennych poczatkowych
mute_value=0
do_quit=0
version="0.2"
}
function mp_send {
echo "$*" > $PIPE
}
function gui_command {
par1="$1"
par2="$2"
par3="$3"
if [ -z "$par1" ]
then
echo -n "cmd:"
read par1 par2 par3
fi
case $par1 in
"help")
clear
echo "MPlayer stream helper, version $version by szkuwa"
echo "-------------------------------------------------"
echo "Commands:"
echo " q :quit - quits this program"
echo " h :help - display this help message"
echo " l :loadfile [url]"
echo " :load [url] - loads a new file to mplayer"
echo " m :mute - mute/unmute mplayer"
echo " p :pause - pause/unpause mplayer"
echo " 9/0 :volume [value] - dec/inc volume,"
echo " ( or ) sets volume to 10% and 100%"
echo " :list - display playlist"
echo " :play [name|number] - plays stream from playlist"
echo " :add [name] [url] - adds new stream to playlist"
echo " :del [name|number] - removes stream from playlist"
echo " "
echo " values in [] are optional, if not specified program will ask"
read
;;
"mute")
if [ -z "$par2" ]
then
echo -n "Do you want to mute? (1-enable, 0-disable): "
read par2
fi
mp_send "mute $par2"
;;
"quit")
do_quit="1"
mp_send "quit"
;;
"list")
clear
if [ -s "$PLS" ]
then
echo "--- Streams in playlist file ---"
i=0
while read linia
do
i=$((i+1))
adres=${linia#*;}
linia=${linia%;*}
echo "$i: $linia, adres: $adres"
done < "$PLS"
else
echo "--- Playlist file is empty ---"
echo "--- $PLS ---"
fi
read
;;
"add")
if [ -z "$par2" ]
then
echo -n "Specify stream name: "
read par2
fi
if [ -z "$par3"]
then
echo -n "Specify stream url: "
read par3
fi
echo "$par2;$par3" >> "$PLS"
;;
"del")
if [ -s "$PLS" ]
then
if [ -z "$par2" ]
then
echo -n "Type name or number: "
read par2
fi
deleted="0"
lin=""
i=0
mv "$PLS" "$PLS.tmp"
while read linia
do
i=$((i+1))
lin=${linia%;*}
if [ "$par2" == "$lin" ]
then
deleted="1"
continue
elif [ "$par2" == "$i" ]
then
deleted="1"
continue
else
echo "$linia" >> "$PLS"
fi
done < "$PLS.tmp"
if [ "$deleted" -eq "1" ]
then
echo "Entry successfull deleted"
else
echo "Somthing is wrong.. did you specified correct number or name?"
fi
rm "$PLS.tmp"
read
else
echo "What the hell are you doing? Playlist file is empty!"
echo "How can I delete stream from it?"
read
fi
;;
"play")
if [ -s "$PLS" ]
then
if [ -z "$par2" ]
then
echo -n "Type name or number: "
read par2
fi
adres=""
lin=""
i=0
while read linia
do
i=$((i+1))
lin=${linia%;*}
if [ "$par2" == "$lin" ]
then
adres=${linia#*;}
break
elif [ "$par2" -eq "$i" ]
then
adres=${linia#*;}
break
fi
done < "$PLS"
if [ -z "$adres" ]
then
echo "You specified wrong name or number, try harder ;)"
read
else
gui_command "loadfile" "$adres"
fi
else
echo "Playlist file is empty, theres nothing i can play atm"
echo "add some streams first or use :loadfile command"
echo "to play stream without adding it to playlist"
read
fi
;;
"load"|"loadfile")
if [ -z "$par2" ]
then
echo -n "Specify filename: "
read par2
else
par2="$par2"
fi
mp_send "loadfile $par2 0"
;;
"pause")
mp_send "pause"
;;
"volume")
if [ -z "$par2"]
then
echo -n "Specify volume: "
read par2
mp_send "volume $par2 1"
else
mp_send "volume $par2 $par3"
fi
;;
*)
echo "Function not implemented"
;;
esac
}
function gui_menu {
clear
echo "--- MPlayer stream helper ---"
cat "$BACK"
echo "-----------------------------"
}
function main_loop {
while [ "$do_quit" -eq "0" ]
do
gui_menu
gui_char=""
read -t 1 -n 1 -s gui_char
case $gui_char in
"m")
if [ "$mute_volume" -eq "1" ]
then
mute_volume="0"
else
mute_volume="1"
fi
gui_command "mute" "$mute_volume"
;;
"q") gui_command "quit" ;;
"p") gui_command "pause" ;;
"h") gui_command "help" ;;
"9") gui_command "volume" "-10" "0" ;;
"0") gui_command "volume" "10" "0" ;;
"(") gui_command "volume" "10" "1" ;;
")") gui_command "volume" "100" "1" ;;
"t") gui_command "loadfile" "http://213.251.139.88:7050" ;; # tylko test bindowania ;]
"l") gui_command "loadfile" ;;
":") gui_command ;;
*) ;;
esac
done
}
init
main_loop
deinit
Kod: Zaznacz cały
#!/bin/bash
# MPS - skrypt do obslugi mplayera z konsoli
# 2008-02-06 szkuwa
# ten plik jest tylko czescia skryptu, uruchamiaj plik wlasciwy
function reset_vars {
out_icy=""
out_name=""
out_genre=""
out_website=""
}
function init {
# regexy do wykrywania informacji
icy_regex="^ICY Info: .*$"
quit_regex="^Exiting.*$"
name_regex="^Name.*"
genre_regex="^Genre.*"
website_regex="^Website.*"
playing_regex="^Playing.*$"
# pliki
LOG="$HOME/.mplayer/mps_log"
BACK="$HOME/.mplayer/mps_back"
reset_vars
# podpinamy sie pod pipe ;]
exec 100<> $LOG
}
function deinit {
echo 'nic'
}
function send_to_file {
# zerujemy plik..
echo -n "" > $BACK
if [ -n "$out_name" ]
then
echo "Name : $out_name" >> $BACK
fi
if [ -n "$out_genre" ]
then
echo "Genre : $out_genre" >> $BACK
fi
if [ -n "$out_icy" ]
then
echo "Title : $out_icy" >> $BACK
fi
}
function main_loop {
while true
do
mp_data=''
read -t 1 mp_data <&100
# sprawdzamy czy czasem nie trzeba wylaczyc skryptu ^^
# robimy to na poczatku zeby niepotrzebnie nie grepowac innych rzeczy
if echo "$mp_data" | grep -Eq "$quit_regex"
then
break
fi
# sprawdzamy czy utwor sie nie zmienil, jesli tak to resetujemy info..
# na wszelki wypadek gdy nowa stacja nie udostepnia
if echo "$mp_data" | grep -Eq "$playing_regex"
then
reset_vars
continue
fi
# sprawdzamy czy to ICY Info
if echo "$mp_data" | grep -Eq "$icy_regex"
then
mp_data=`echo $mp_data |cut -d';' -f1`
out_icy=${mp_data:22}
send_to_file
continue
fi
# sprawdzamy name
if echo "$mp_data" | grep -Eq "$name_regex"
then
out_name=${mp_data:8}
send_to_file
continue
fi
# sprawdzamy genre
if echo "$mp_data" | grep -Eq "$genre_regex"
then
out_genre=${mp_data:9}
send_to_file
continue
fi
# tylko do testowania ;)
# odkomentuj to co znajduje sie nizej jesli uruchamiasz mps-icy w innej konsoli
# wtedy bedzie widac wszystko to, co mplayer z siebie wydala ;)
# if [ -n "$mp_data" ]
# then
# echo $mp_data
# fi
# done
}
init
main_loop