DVDを含むシステムでランダムなビデオを再生します。

DVDを含むシステムでランダムなビデオを再生します。

私の.bashrcには、任意のビデオを再生する機能(以下は参照用に書かれていません)と、すべてのメディアファイルを再生するもう1つの機能があります。たとえば、次のようになります。

createmediafiles() {
find ~+ -type f -iregex '.*\.\(mp3\|wav\|ogg\|flac\|mp4\|mov\|avi\)' > ~/mediafiles.txt
find ~+ -type d -name VIDEO_TS >> ~+/mediafiles.txt
}

playmediafiles() {
    while true; do
        while read -r line; do
            shuf -n 1 |
            tee -a ~/played-log.txt |
            xargs -d "\n" mpv
        done < ~/mediafiles.txt
    done
}

VIDEO_TS行をに追加したいのですが、関数createmediafiles内にIFステートメントを追加してシャッフルされた行がVIDEO_TSの場合は、mpvを使用してファイルを再生するのではなく、次のようにします。playmediafilesmediafiles.txt

tee -a ~/played-log.txt | xargs -d "\n" vlc --fullscreen

mediafiles.txtパイプはmpvと同じ方法で読み取られます。

VIDEO_TSで終わる行に条件付きでこれをIFステートメントに入れます。

答え1

次のように試してみることもできそうです。

playmediafiles() {
    local line cmd

    while true; do
        line=$(shuf -n 1 ~/mediafiles.txt)
        case $line in
            *VIDEO_TS* ) cmd=( 'echo' 'vlc' '--fullscreen' ) ;;
            * )          cmd=( 'echo' 'mpv' ) ;;
        esac
        cmd+=( "$line" )
        printf '%s\n' "$line" >> ~/played-log.txt
        "${cmd[@]}"
    done
}

または:

playmediafiles() {
    local line cmd

    while true; do
        while IFS= read -r line; do
            case $line in
                *VIDEO_TS* ) cmd=( 'echo' 'vlc' '--fullscreen' ) ;;
                * )          cmd=( 'echo' 'mpv' ) ;;
            esac
            cmd+=( "$line" )
            printf '%s\n' "$line" >> ~/played-log.txt
            "${cmd[@]}"
        done < <(shuf ~/mediafiles.txt)
    done
}

最初のスクリプトは永久にループから呼び出され、一度にshuf行をランダムに選択し、mediafiles.txtその行を変数に保存しますline

2番目のスクリプトは、shuf印刷されたすべてをランダムな順序で永久に呼び出し、次に毎回出力から1行を印刷し、その行を変数に格納する2番目のループを実行します。mediafiles.txtreadshufline

その後、両方の項目が含まれているかどうかをテストし、$line適切なコマンドとパラメータを使用して配列を入力しますVIDEO_TS。次に、を使用して配列の内容を配列の末尾に追加し、配列の内容を印刷してから、を使用して配列に格納されているコマンドを実行します。cmdcmd=( 'echo' 'vlc' '--fullscreen' )cmd=( 'echo' 'mpv' )linecmd+=( "$line" )played-log.txt"${cmd[@]}"

2つの間の唯一の違いは、最初のものは再生するファイルごとに1回呼び出されるサブシェルを生成し、2番目はフルshuf入力ファイルに対して1回呼び出され、次に1行に1回呼び出されるサブシェルを生成することです。です。 2番目は少し速く実行できますが、各入力行の間でメディアを再生しているので、気づいたり興味があるようには思えません。shufread

テストが完了したら、を削除して'echo'要件を満たしていることを確認してください。

関連情報