logo
Published on

WSL Bash「VLC」で音楽をランダム再生するツール

Authors

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

}

このスクリプトは、指定されたディレクトリ内の音楽ファイルを再生するためのもので、以下のステップに分けて説明します:

  1. findコマンドを使用して、音楽ファイル(.wav、.mp3、.flac、.wave)のリストを生成し、shufmusic_list.tmp.txtに保存します。このリストはランダム再生のために使用されます。もし$1(スクリプトに渡された第一引数)がmp4またはvideoである場合、リストにmp4およびaviファイルも追加します。

  2. リストファイルが空でないかどうかを確認し、空であればエラーメッセージを出力してスクリプトを終了します。

  3. メインのループが始まり、無限ループとして設定されています。

  4. ループ内で1秒間の休憩があります。

  5. リストファイルが空でない場合、ランダムに曲を選択してcurrentMusicに格納します。

  6. currentMusicが空でないことを確認し、空であればエラーメッセージを出力してスクリプトを終了します。

  7. currentMusicに含まれるファイル名をリストファイルから削除し、その曲を再生します。

  8. 曲のフォーマットに応じて、再生時間をffprobe(mp4またはaviの場合)またはsox(その他のフォーマット)で取得し、その長さに対応する時間だけ待機します。

  9. 最後に1秒間の休憩があり、次の曲へと進みます。

追加パッケージのインストールなど

このBashスクリプトを実行するためには、いくつかの外部パッケージやツールが必要です。以下はそれらのパッケージについての説明です:

  1. vlc.exe:

    • VLCメディアプレーヤーは、音楽とビデオファイルの再生に使用される有名なメディアプレーヤーアプリケーションです。このスクリプトでは、vlc.exeを使用して音楽ファイルを再生します。vlc.exeは通常、VLCメディアプレーヤーのWindowsバージョンです。このアプリケーションをインストールしてパスを通しておく必要があります。
  2. find:

    • findコマンドは、指定されたディレクトリ内でファイルを検索するために使用されます。このスクリプトでは、特定の拡張子を持つ音楽ファイルを探し出すために使用されています。一般的に、Linuxディストリビューション(またはWSL内で提供されるパッケージマネージャ)を使用してfindコマンドをインストールできます。例えば、Ubuntuではsudo apt-get install findutilsといったコマンドでインストールできます。
  3. shuf:

    • shufコマンドは、テキストファイル内の行をランダムに並べ替えるために使用されます。このスクリプトでは、shufを使って音楽ファイルのリストからランダムに曲を選択しています。shufは一般的にLinuxディストリビューションに含まれており、追加のインストールは必要ありません。
  4. wslpath:

    • wslpathコマンドは、WindowsパスとLinuxパスを変換するために使用されます。このスクリプトでは、wslpathを使ってWindowsパスをLinuxパスに変換して、vlc.exeに渡します。wslpathはWSL内で提供されるユーティリティであり、通常はWSLをインストールすると自動的に利用できます。
  5. realpath:

    • realpathコマンドは、指定されたファイルの絶対パスを取得するために使用されます。このスクリプトでは、realpathを使用してcurrentMusicの絶対パスを取得しています。realpathは一般的にLinuxディストリビューションに含まれており、追加のインストールは必要ありません。
  6. ffprobe:

    • ffprobeは、FFmpegプロジェクトの一部で、ビデオおよび音声ファイルのプロパティやメタデータ情報を取得するために使用されるコマンドです。このスクリプトでは、ffprobeを使用してmp4またはaviファイルの再生時間を取得します。ffprobeは通常、FFmpegと一緒に提供されるツールです。FFmpegをインストールすると、ffprobeも利用できます。
  7. sox:

    • soxは、音声ファイルの処理および操作のためのコマンドラインツールです。このスクリプトでは、soxを使用して音楽ファイルの再生時間を取得します。soxはLinuxディストリビューションを通じてインストールできます。例えば、Ubuntuではsudo apt-get install soxといったコマンドでインストールできます。

これらのツールとパッケージをインストールし、パスを通しておくことで、このスクリプトを正常に実行できるはずです。特にvlc.exefindshufwslpathは、環境変数PATHに追加されていることを確認してください。

まとめ

自分で作っておいてあれですが、なかなか便利です。良さげな曲を発見したらそのファイルのあるフォルダにcdしてこれを実行するだけで、ランダム再生できるわけなので、とりあえず音楽流したい的な需要にぴったり。 vlcにもプレイリストの機能はありますけど、D&Dするの面倒だし、flacだと重いし。こちらのコマンドなら、シンボリックリンクを置いたディレクトリ下で実行すれば、数万のハイレゾファイルでも難なくランダム再生できます。いいね。

コードは更新があった場合はgithubか.bashrcに上げます。