mps - mplayer stream, skrypt

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
szk
Piegowaty Guziec
Piegowaty Guziec
Posty: 2
Rejestracja: 25 sty 2008, 19:17
Płeć: Mężczyzna
Wersja Ubuntu: 7.10
Środowisko graficzne: Xfce

mps - mplayer stream, skrypt

Post autor: szk »

Jestem dosyć nowy na tym forum, trochę przeglądałem no i natknąłem się na pare skryptów do obsługi mplayera i streamów z konsoli.. co tu dużo mówić - nie były dla mnie wystarczające (brakowało mi pewnych rzeczy) więc postanowiłem napisać coś samemu.

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 ( ;P )
- 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
Uzupełniać ją możemy prosto ze skryptu wywołyjąc:

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)
Liste przeglądamy dzięki (można też ją sobie "zbindować" pod coś na klawiaturze)

Kod: Zaznacz cały

:list
Pliki z playlisty uruchamiamy za pomocą

Kod: Zaznacz cały

:play numer-na-liscie
lub
:play nazwa-stacji
Usuwamy z listy za pomocą :del które działa podobnie jak play - bierze jako parametr numer na liście lub nazwę 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
Plik ./mps-icy

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
Awatar użytkownika
jakobs84
Piegowaty Guziec
Piegowaty Guziec
Posty: 3
Rejestracja: 27 cze 2009, 10:45
Płeć: Mężczyzna
Wersja Ubuntu: 12.10
Środowisko graficzne: Brak
Architektura: x86

Odp: mps - mplayer stream, skrypt

Post autor: jakobs84 »

Jestem zielony ale instalacja skryptu nie jest trudna a mimo to nie działa.

Mplayer nie odtwarza muzyki, nie zależnie czy z playlisty czy za pomocą :load

Wiesza się nawet dla q.

Jak sprawdzić co się krzaczy??
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 20 gości