Como posso gerar uma lista de reprodução M3U (formato http URL) a partir do terminal?

11

Eu gostaria de gerar uma lista de reprodução M3U para um diretório que contém arquivos mp3 no meu servidor a partir do terminal. Como eu gostaria de garantir que todos os players possam transmitir esses arquivos, prefixo cada entrada de arquivo com a URL absoluta para esse diretório, desta forma:

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

Então, infelizmente, simplesmente ls -1 *.mp3 > play.m3unão basta. Existe uma linha para conseguir isso?

3k-
fonte

Respostas:

8

Eu acho que o seguinte one-liner deve funcionar:

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

cronite
fonte
7

Esta é a resposta @chronitis com algumas melhorias:

  • armazena o nome do arquivo na variável $ playlist para uso posterior
  • excluirá o arquivo se existir anteriormente
  • grava o caminho completo do arquivo na lista de reprodução

O comando

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

Para reproduzi-lo com o mplayer na linha de comando também

mplayer -playlist play.m3u
bistoco
fonte
Não sei por que alguém votou negativamente nesta resposta. Essa é a única solução que parece funcionar imediatamente e deve ser aceita ou pelo menos promovida. Muito obrigado!
Geppettvs D'Constanzo
e se eu quiser adicionar vários formatos de arquivo neste comando?
Sumeet Deshmukh
4

Você pediu originalmente para criar cada entrada como uma linha formatada em URL da web. Além de substituir o caminho local por http: // ..., você também precisará substituir espaços por '% 20'. Então, linha longa, mas aqui está:

find /path/to/mp3s/ -name "*.mp3" | sed 's/ /%20/g' | sed 's|/path/to/mp3s/|http://www.server.com/serverpath/|g' > playlist.m3u
jokono
fonte
boa ideia! usando um sinal de mais (+) em vez resultaria em uma URL mais legível embora
3k-
2

Este script bash pode fazer o trabalho:

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

Uma versão um pouco mais desenvolvida. O URL é codificado no .m3uestilo apropriado .

krizoek
fonte