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?
Je pense que le one-liner suivant devrait fonctionner:
for f in *.mp3; do echo "http://..../$f" >> play.m3u; done
Ceci est @chronitis répondre avec quelques améliorations:
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
À 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
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é.