Jak mogę wygenerować listę odtwarzania M3U (format URL URL) z terminala?

11

Chciałbym wygenerować listę odtwarzania M3U dla katalogu zawierającego pliki mp3 na moim serwerze z terminala. Ponieważ chciałbym upewnić się, że każdy odtwarzacz będzie mógł przesyłać strumieniowo te pliki, chciałbym poprzedzić każdą pozycję pliku bezwzględnym adresem URL do tego katalogu, jak poniżej:

http://server.com/dir/file1.mp3
http://server.com/dir/file2.mp3
...

Niestety ls -1 *.mp3 > play.m3unie wystarczy po prostu robić . Czy istnieje jedna linijka, aby to osiągnąć?

3k-
źródło

Odpowiedzi:

8

Myślę, że następujący linijka powinna działać:

for f in *.mp3; do echo "http://..../$f" >> play.m3u; done

chronitis
źródło
7

To jest odpowiedź @chronitis z pewnymi ulepszeniami:

  • przechowuje nazwę pliku na liście odtwarzania zmiennej $ do późniejszego wykorzystania
  • usunie plik, jeśli istnieje wcześniej
  • zapisuje pełną ścieżkę pliku na liście odtwarzania

Komenda

playlist='play.m3u' ; if [ -f $playlist ]; then rm $playlist ; fi ; for f in *.mp3; do echo "$(pwd)/$f" >> "$playlist"; done

Aby zagrać w mplayer również w wierszu poleceń

mplayer -playlist play.m3u
bistoco
źródło
Nie wiem, dlaczego ktoś głosował za tą odpowiedzią. To jedyne rozwiązanie, które wydaje się działać od razu po wyjęciu z pudełka i powinno zostać zaakceptowane lub przynajmniej wypromowane. Dziękuję Ci bardzo!
Geppettvs D'Constanzo
co jeśli chcę dodać wiele formatów plików do tego polecenia?
Sumeet Deshmukh
4

Pierwotnie poprosiłeś o utworzenie każdego wpisu jako linii w formacie URL. Oprócz zamiany ścieżki lokalnej na http: // ... musisz także zamienić spacje na „% 20”. Długa kolejka, ale proszę bardzo:

find /path/to/mp3s/ -name "*.mp3" | sed 's/ /%20/g' | sed 's|/path/to/mp3s/|http://www.server.com/serverpath/|g' > playlist.m3u
jokono
źródło
dobry pomysł! użycie znaku plus (+) zamiast tego dałoby bardziej czytelny adres URL
3k-
2

Ten skrypt bash może wykonać zadanie:

rawurlencode() {
  local string="${1}"
  local strlen=${#string}
  local encoded=""
  local pos c o

  for (( pos=0 ; pos<strlen ; pos++ )); do
     c=${string:$pos:1}
     case "$c" in
        [-_.~a-zA-Z0-9] ) o="${c}" ;;
        * )               printf -v o '%%%02x' "'$c"
     esac
     encoded+="${o}"
  done
  echo "${encoded}"
}

rm -rf p.m3u
for f in *.mkv; do echo "#EXTINF:-1,SR:$f
  http://10.0.0.144/tvtmp/"$(rawurlencode $f) >> p.m3u; 
done
sed -i '1s/^/#EXTM3U\n/' p.m3u
rm -rf l.m3u
for f in *.mkv; do echo "#EXTINF:-1,SR:$f
  http://127.0.0.1/tvtmp/$f" >> l.m3u; 
done
sed -i '1s/^/#EXTM3U\n/' l.m3u

Trochę bardziej rozwinięta wersja. Adres URL jest zakodowany we właściwym .m3ustylu.

krizoek
źródło