Comment puis-je générer une liste de lecture M3U (format URL http) à partir du terminal?

11

Je voudrais générer une liste de lecture M3U pour un répertoire contenant des fichiers mp3 sur mon serveur à partir du terminal. Comme je voudrais m'assurer que chaque joueur sera en mesure de diffuser ces fichiers, je voudrais préfixer chaque entrée de fichier avec l'URL absolue dans ce répertoire, comme ceci:

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

Donc, malheureusement, tout simplement ls -1 *.mp3 > play.m3une suffit pas. Existe-t-il une doublure pour y parvenir?

3k-
la source

Réponses:

8

Je pense que le one-liner suivant devrait fonctionner:

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

chronite
la source
7

C'est la réponse @chronitis avec quelques améliorations:

  • stocke le nom du fichier sur la variable $ playlist pour une utilisation ultérieure
  • supprimera le fichier s'il existe précédemment
  • écrit le chemin complet du fichier sur la liste de lecture

La commande

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

Pour jouer avec mplayer sur la ligne de commande aussi

mplayer -playlist play.m3u
bistoco
la source
Je ne sais pas pourquoi quelqu'un downvoted cette réponse. Ceci est la seule solution qui semble fonctionner dès la sortie de la boîte et doit être acceptée ou au moins favorisé. Merci beaucoup!
Geppettvs D'Constanzo
si je veux ajouter des formats de fichiers multiples dans cette commande?
Sumeet Deshmukh
4

Vous avez initialement demandé de créer chaque entrée en tant que ligne au format URL Web. En plus de remplacer le chemin local par http: // ..., vous devrez également remplacer les espaces par '% 20'. Donc, longue file d'attente, mais c'est parti:

find /path/to/mp3s/ -name "*.mp3" | sed 's/ /%20/g' | sed 's|/path/to/mp3s/|http://www.server.com/serverpath/|g' > playlist.m3u
jokono
la source
bonne idée! l'utilisation d'un signe plus (+) à la place entraînerait une URL plus lisible
3k
2

Ce script bash peut faire le travail:

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

Une version un peu plus développée. L'URL est codée dans le bon .m3ustyle.

krizoek
la source