web-dev-qa-db-fra.com

Comment générer une liste de lecture M3U à partir du terminal?

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

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

Donc, malheureusement, simplement ls -1 *.mp3 > play.m3u ne suffit pas. Existe-t-il un one-liner pour y parvenir?

11
3k-

Je pense que le one-liner suivant devrait fonctionner:

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

8
chronitis

Ceci est @chronitis répondre avec quelques améliorations:

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

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
6
bistoco

À l'origine, vous aviez demandé de créer chaque entrée sous forme de ligne au format URL Web. En plus de remplacer le chemin local par http: // ..., vous devrez également remplacer les espaces par '% 20'. Donc, longue ligne, mais ici vous allez:

find /path/to/mp3s/ -name "*.mp3" | sed 's/ /%20/g' | sed 's|/path/to/mp3s/|http://www.server.com/serverpath/|g' > playlist.m3u
4
jokono

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 style .m3u approprié.

2
krizoek