ターミナルからサーバー上のmp3ファイルを含むディレクトリのM3Uプレイリストを生成したいと思います。すべてのプレーヤーがそれらのファイルをストリーミングできるようにしたいので、次のように、各ディレクトリの絶対URLを各ファイルエントリの前に付けたいと思います。
http://server.com/dir/file1.mp3 http://server.com/dir/file2.mp3 ...
残念ながら、単にls -1 *.mp3 > play.m3u
を行うだけでは十分ではありません。これを達成するためのワンライナーはありますか?
私は次のワンライナーが動作するはずだと思う:
for f in *.mp3; do echo "http://..../$f" >> play.m3u; done
これはいくつかの改良を加えた@chronitisの回答です:
コマンド
playlist='play.m3u' ; if [ -f $playlist ]; then rm $playlist ; fi ; for f in *.mp3; do echo "$(pwd)/$f" >> "$playlist"; done
コマンドラインでmplayerでプレイするには
mplayer -playlist play.m3u
最初は、各エントリをWeb URL形式の行として作成するように要求しました。ローカルパスをhttp:// ...で置き換えることに加えて、スペースを '%20'で置き換える必要もあります。だから、長い行ですが、ここに行きます:
find /path/to/mp3s/ -name "*.mp3" | sed 's/ /%20/g' | sed 's|/path/to/mp3s/|http://www.server.com/serverpath/|g' > playlist.m3u
このbashスクリプトは次のことを実行できます。
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
もう少し開発されたバージョン。 URLは適切な.m3u
スタイルでエンコードされます。