- Published on
WSL Bash「VLC」で音楽をランダム再生するツール
- Authors
- Name
- Shou Arisaka / 有坂翔
Windows 10のWSL Linux bashでvlcで音楽をランダム再生する音楽プレイヤープログラムみたいなものをスクリプトしたのでシェアします。
成り行きで書いた。あとvlcじゃなくてもたぶんいけますね。まぁvlcしか使わないですね。
VLCで音楽ファイルをランダム再生するツール
このスクリプトは、指定されたディレクトリ内の音楽ファイルをランダムに再生するためのもので、WSL(Windows Subsystem for Linux)のBash環境で動作します。以下に、スクリプト内の主要な部分とその動作をステップバイステップで説明します。
shufmusic(){
: Play randomized music on current directory with vlc.exe. compatible with wsl bash.
: e.g. shufmusic
: e.g. shufmusic mp4
# 音楽ファイルのリストを作成し、list.txtに保存する
# ファイルの拡張子がwav、mp3、flac、waveのものをリストアップ
[[ "${1}" =~ mp4|video ]] && find -L -regextype posix-extended -regex '.*\.(wav|mp3|flac|wave|mp4|avi)' > shufmusic_list.tmp.txt || find -L -regextype posix-extended -regex '.*\.(wav|mp3|flac|wave)' > shufmusic_list.tmp.txt
# リストファイルが空でないことを確認
[ -s shufmusic_list.tmp.txt ] || { printf "\n\n${red}E: The list file empty. It's seems something worng.${end}\nINFO: You may have to use ${cyn}shufmusic mp4${end}.\n\n" ; return 1 ; }
printf "INFO: $(wc -l shufmusic_list.tmp.txt | awk '{print $1}') files found.\n"
# メインのループ
while [ true ];
do
sleep 1
# リストファイルが空でない場合、ランダムに曲を選ぶ
[ -s shufmusic_list.tmp.txt ] && currentMusic="$(cat shufmusic_list.tmp.txt | shuf | head -n 1)" || { printf "\n\n${red}E: The list file is being empty.${end}\n\n" ; return 1 ; }
# currentMusicが空でないことを確認
[ -z "${currentMusic}" ] && { printf "\n\n${red}E: \$currentMusic is empty.${end}\n\n" ; return 1 ; }
# リストから選ばれた曲を削除
perl -i -pe "BEGIN{undef $/;} s/$(printf "%q" "$currentMusic" | sed -Ee 's/\//\\\//g')\n//smg" shufmusic_list.tmp.txt
# vlc.exeを使って曲を再生
vlc.exe "$(wslpath -w "$(realpath "${currentMusic}")")" &
# 曲の長さに応じて一定時間待つ
[[ "${currentMusic##*.}" =~ mp4|avi ]] && sleep "$(ffprobe -i "${currentMusic}" -show_entries format=duration -v quiet -of csv="p=0")" || sleep "$(sox --info -D "${currentMusic}")"
sleep 1
done
}
このスクリプトは、指定されたディレクトリ内の音楽ファイルを再生するためのもので、以下のステップに分けて説明します:
find
コマンドを使用して、音楽ファイル(.wav、.mp3、.flac、.wave)のリストを生成し、shufmusic_list.tmp.txt
に保存します。このリストはランダム再生のために使用されます。もし$1
(スクリプトに渡された第一引数)がmp4
またはvideo
である場合、リストにmp4およびaviファイルも追加します。リストファイルが空でないかどうかを確認し、空であればエラーメッセージを出力してスクリプトを終了します。
メインのループが始まり、無限ループとして設定されています。
ループ内で1秒間の休憩があります。
リストファイルが空でない場合、ランダムに曲を選択して
currentMusic
に格納します。currentMusic
が空でないことを確認し、空であればエラーメッセージを出力してスクリプトを終了します。currentMusic
に含まれるファイル名をリストファイルから削除し、その曲を再生します。曲のフォーマットに応じて、再生時間を
ffprobe
(mp4またはaviの場合)またはsox
(その他のフォーマット)で取得し、その長さに対応する時間だけ待機します。最後に1秒間の休憩があり、次の曲へと進みます。
追加パッケージのインストールなど
このBashスクリプトを実行するためには、いくつかの外部パッケージやツールが必要です。以下はそれらのパッケージについての説明です:
vlc.exe
:- VLCメディアプレーヤーは、音楽とビデオファイルの再生に使用される有名なメディアプレーヤーアプリケーションです。このスクリプトでは、
vlc.exe
を使用して音楽ファイルを再生します。vlc.exe
は通常、VLCメディアプレーヤーのWindowsバージョンです。このアプリケーションをインストールしてパスを通しておく必要があります。
- VLCメディアプレーヤーは、音楽とビデオファイルの再生に使用される有名なメディアプレーヤーアプリケーションです。このスクリプトでは、
find
:find
コマンドは、指定されたディレクトリ内でファイルを検索するために使用されます。このスクリプトでは、特定の拡張子を持つ音楽ファイルを探し出すために使用されています。一般的に、Linuxディストリビューション(またはWSL内で提供されるパッケージマネージャ)を使用してfind
コマンドをインストールできます。例えば、Ubuntuではsudo apt-get install findutils
といったコマンドでインストールできます。
shuf
:shuf
コマンドは、テキストファイル内の行をランダムに並べ替えるために使用されます。このスクリプトでは、shuf
を使って音楽ファイルのリストからランダムに曲を選択しています。shuf
は一般的にLinuxディストリビューションに含まれており、追加のインストールは必要ありません。
wslpath
:wslpath
コマンドは、WindowsパスとLinuxパスを変換するために使用されます。このスクリプトでは、wslpath
を使ってWindowsパスをLinuxパスに変換して、vlc.exe
に渡します。wslpath
はWSL内で提供されるユーティリティであり、通常はWSLをインストールすると自動的に利用できます。
realpath
:realpath
コマンドは、指定されたファイルの絶対パスを取得するために使用されます。このスクリプトでは、realpath
を使用してcurrentMusic
の絶対パスを取得しています。realpath
は一般的にLinuxディストリビューションに含まれており、追加のインストールは必要ありません。
ffprobe
:ffprobe
は、FFmpegプロジェクトの一部で、ビデオおよび音声ファイルのプロパティやメタデータ情報を取得するために使用されるコマンドです。このスクリプトでは、ffprobe
を使用してmp4またはaviファイルの再生時間を取得します。ffprobe
は通常、FFmpegと一緒に提供されるツールです。FFmpegをインストールすると、ffprobe
も利用できます。
sox
:sox
は、音声ファイルの処理および操作のためのコマンドラインツールです。このスクリプトでは、sox
を使用して音楽ファイルの再生時間を取得します。sox
はLinuxディストリビューションを通じてインストールできます。例えば、Ubuntuではsudo apt-get install sox
といったコマンドでインストールできます。
これらのツールとパッケージをインストールし、パスを通しておくことで、このスクリプトを正常に実行できるはずです。特にvlc.exe
、find
、shuf
、wslpath
は、環境変数PATH
に追加されていることを確認してください。
まとめ
自分で作っておいてあれですが、なかなか便利です。良さげな曲を発見したらそのファイルのあるフォルダにcdしてこれを実行するだけで、ランダム再生できるわけなので、とりあえず音楽流したい的な需要にぴったり。 vlcにもプレイリストの機能はありますけど、D&Dするの面倒だし、flacだと重いし。こちらのコマンドなら、シンボリックリンクを置いたディレクトリ下で実行すれば、数万のハイレゾファイルでも難なくランダム再生できます。いいね。
コードは更新があった場合はgithubか.bashrcに上げます。