ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Bashの終了ステータスを利用した小技

(2022-01-24 初稿 - )

Bashスクリプトを作っていると、Webでいろいろ調べてとても勉強になる。

今回は、終了ステータスを利用した小技を紹介。

今回は、以下のサイトを参考にさせていただいた。多謝。m(__)m

コマンドを実行後、その成否が終了ステータスに保存される。

例えば、Terminal上で、以下のコマンドを実行した場合、成功した場合としない場合で終了ステータスは以下のとおり。

$ ls dir
$ echo $?
dir ディレクトリがあれば   0
dir ディレクトリがない       2

直前のコマンドの終了ステータスは、$?に保存され成功すれば0である。

終了ステータスを利用した小技

「;」でつなぐ

まず事前の知識として、「;」でコマンドをつないだ場合は、終了ステータスを利用せず、左側のコマンドから順に実行する。

このため、「;」でつないだ場合は、コマンドの実行結果(エラー or 成功)の終了ステータスに関係なく、次の右のコマンドを実行する。

$ ls dir1 ; ls dir2

「&&」でつなぐ

終了ステータスを利用して、複数のコマンドを実行することができる。

例えばディレクトリを作成して、ファイルをコピーして、コピーしたファイルを表示する場合は、以下のとおり。

$ mkdir ~/test-dir && cp a.txt ~/test-dir && cat ~/test-dir/a.txt

「&&」でつなげた場合は、コマンドが成功したときのみ次のコマンドが実行される。

「||」でつなぐ

「&&」でコマンドをつなぐ場合は、成功した場合に次のコマンドを実行したが、「||」でコマンドをつないだ場合は、左のコマンドが失敗した場合に次のコマンドを実行する。

これを使うとエラー処理がとても簡潔に書ける。このページを書いた最大の理由がこの機能だった。(^^ゞ

参考までに、以下の記事で書いたスクリプトは「||」を用いた。

上記スクリプトに以下の記述があり、コマンドを実行した結果、エラーになればオプションを付加

$CMD $* $OPTIONS || $CMD $* --id $OPTIONS

ちなみに、普通にifで書くと以下のとおり。

if [  $($CMD $* $OPTIONS) ]; then
    $CMD $* --id $OPTIONS
fi

Bashって奥が深いなぁ…  と、最近良く思う。

関連ページ

Raspberry Pi(ラズパイ)にスピーカーになってもらうよ

(2022-01-23 初稿 - )

これまでに、Raspberry Piに、BGMサーバやラジオになってもらった。

これはこれで、とても便利だけど、Raspberry Piを単にスピーカー代わりに使うだけなら、もっと簡単に設定できる。

ここで言う「単にスピーカー代わり」をもう少し説明すると、ローカルのPCで曲やストリーム放送を受信、再生して、音声データをRaspberry Piに流すのがスピーカー代わり。

一方、BGMサーバやルトリームラジオは、Raspberry PiがPi内に保存されている曲を再生したり、ストリーム放送を受信して再生する。

ローカルPCからすると、「スピーカー代わり」は負荷が多いけど、手元のPCだから操作はとても簡単。一方、Raspberry Piにまかせる方は、ローカルPCは命令するだけだから、負荷はほとんどないけど、リモートPCを操作するので少し面倒だね。

説明がヘタ過ぎるので、下に図を書いた。(^^ゞ

f:id:hymd3a:20220123201332j:plain

ローカルPCとRaspberry Piの役割

設定

設定は、Raspberry PiにX環境がある場合とない場合で、大きく異なるので、共通部分とX環境あるなしで分けて記述する。

なお、設定は以下のサイトを参考にさせていただいた。多謝。m(__)m

共通

まずは、ローカルPC、Raspberry Piともに、以下のとおりpaprefsパッケージをインストールする。

$ sudo apt install paprefs

以上で共通部分は終了。

Raspberry PiにX環境がある場合

  1. ローカルPC(クライアント)側では、メニューから「設定」、「PulseAudio Preference」を選択
  2. 「Network Access」タブを開いて、「Make discoverable PulseAudio network sound devices abailable locally」にチェックを入れる

f:id:hymd3a:20220123193425p:plain

ローカルPC(クライアント)側の設定
  1. Raspberry Pi(サーバ)側も、メニューから「設定」、「PulseAudio Preference」を選択
  2. 「Network Server」タブを開いて、以下の3つにチェックを入れる。
Enable network access to local sound devices
  Allow other machines on the LAN to discover local sound devices
  Don't require authentication

以上で設定終了。

f:id:hymd3a:20220123194012p:plain

Raspberry Pi(サーバ)側の設定
確認方法

確認は、vlcメディアプレーヤー等で、「オーディオ(A)」メニューを開いて、「オーディオデバイス(D)」の中から、先程設定したRaspberry Piサウンドバイスを選択し、音楽等が鳴れば成功。

Raspberry PiにX環境がない場合

Raspberry PiにX環境がない場合は、少し面倒で、筆者も完な動作ができている状態ではない。

サーバとなるRaspberry Piに以下の設定を行う。

$ cp /etc/pulse/client.conf ~/.config/pulse
$ vi .config/pulse/client.conf
; mod H.Y 2022-01-23
 autospawn = no                          # noに変更
 daemon-binary = /usr/bin/pulseaudio     # コメントを外す
$ cp /etc/pulse/default.pa ~/.config/pulse
$ vi .config/pulse/defaults.pa
(以下の行を追加)
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.11.0/24 auth-anonymous=1
確認方法

X環境がない場合は、vlcメディアプレーヤーの「オーディオデバイス(D)」のメニューにRaspberry Piが表示されない。(-_-;)

では、接続できないかというと、以下のようにすればRaspberry Piの音を鳴らすことができる。

操作は、ローカルPCで行う。

$ PULSE_SERVER=192.168.xxx.xxx cvlc xxxxx.mp3

筆者のところでは、上記のように環境変数をセットして実行するとRaspberry Piから音が鳴るので良しとしている。

もし、もっと良い方法があれば教えてください。

 

 

Raspberry Pi(ラズパイ)にBluetoothスピーカーをつないだよ

(2022-01-22 初稿 - 2022-01-24 追記)

(2022-01-24 追記)

Raspberry Piとなかなか接続(Connect)が成功しないスピーカーがあったので、その対策のスクリプトを追記。

(追記終了)

はじめに

先日、Raspberry Pi(ラズパイ)をBGMサーバとラジオをきけるようにした記事をアップした。

自宅にはまだ余っていたラズパイがあったので、各部屋にラズパイを置いてBGMサーバにしようとしたが、部屋によってはラズパイを離れた場所に置かなければならなくて、不便に感じることもあった。

ダイソーに寄ったら、安いBluetooth接続のスピーカーが売っていたので、購入しRaspberry Piに接続してみた。この記事は、Raspberry Piに接続したしたときのメモを残す。

なお、以下のサイトを参考にさせていただいた。多謝。m(__)m

筆者が購入したスピーカーは、ダイソーで700円で売っていたもので、充電式なのでどこにでも置ける。

f:id:hymd3a:20220121190048j:plain

購入したダイソーBluetooth接続のスピーカー

実際に使ってみて、接続ケーブルが無くどこにでも置けるというのが、とても便利なことに気がついた。Buletoothが10m程度まで接続できるとのことなので、普通の部屋ならば便利に使えると思う。

接続の手順

最初は、GUIで接続を試みたが、接続(Connect)のところでうまく行かなくなってしまったので、CUIで設定した。Raspberry Piにディスプレイをつないでいない場合には参考になるかな…

筆者のRaspberry Piには既にインストール済みだったが、インストールされていない場合もあるかもしれないので、以下のコマンドでインストールを行う。

$ sudo apt-get install pulseaudio pulseaudio-module-bluetooth

次の操作も必須ではないが、スピーカーの電源ONにしたときつながり易くなるらしいので一応実行する。

pi@hoge:~ $ sudo cp /etc/pulse/default.pa /etc/pulse/default.pa.org
pi@hoge:~ $ sudo vi /etc/pulse/default.pa
ファイルの最後に以下の行を追加する。
# automatically switch to newly-connected devices
load-module module-switch-on-connect

ユーザpiをBluetoothグループに追加して、再起動する。

pi@hoge:~ $ sudo usermod -G bluetooth -a pi
pi@hoge:~ $ sudo reboot

再起動後、piがbluetoothグループに所属していることを確認。

pi@hoge:~ $ groups
pi adm dialout cdrom sudo audio video plugdev games users input netdev bluetooth lpadmin pulse-access gpio i2c spi

以下は、本当はGUIでやりたかったけど、うまく接続できなかったので、以下のとおりコマンドで接続した。コマンドで行う方が情報が多くて、少なくとも最初は確実なような気がする。

pi@hoge:~ $ bluetoothctl 
Agent registered
[bluetooth]# power on
Changing power on succeeded
[bluetooth]# scan on
Discovery started
[CHG] Controller DC:A6:32:9D:EE:BB Discovering: yes
[NEW] Device E0:5D:F5:35:B7:F2 SR1323

SR1323というのがBluetoothスピーカーで、E0:5D:F5:35:B7:F2 がID。

続けて、ペアリングを実行する。

[bluetooth]# pair E0:5D:F5:35:B7:F2
Attempting to pair with E0:5D:F5:35:B7:F2
[CHG] Device E0:5D:F5:35:B7:F2 Connected: yes
[CHG] Device E0:5D:F5:35:B7:F2 Modalias: bluetooth:v05D6p000Ad0240
[CHG] Device E0:5D:F5:35:B7:F2 UUIDs: 00001101-0000-1000-8000-00805f9b34fb
[CHG] Device E0:5D:F5:35:B7:F2 UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[CHG] Device E0:5D:F5:35:B7:F2 UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device E0:5D:F5:35:B7:F2 UUIDs: 0000111e-0000-1000-8000-00805f9b34fb
[CHG] Device E0:5D:F5:35:B7:F2 UUIDs: 00001200-0000-1000-8000-00805f9b34fb
[CHG] Device E0:5D:F5:35:B7:F2 ServicesResolved: yes
[CHG] Device E0:5D:F5:35:B7:F2 Paired: yes
Pairing successful
[CHG] Device E0:5D:F5:35:B7:F2 ServicesResolved: no
[CHG] Device E0:5D:F5:35:B7:F2 Connected: no

無地ペアリングまではできたので、infoで情報を確認する。

[bluetooth]# info E0:5D:F5:35:B7:F2
Device E0:5D:F5:35:B7:F2 (public)
    Name: SR1323
    Alias: SR1323
    Class: 0x00340404
    Icon: audio-card
    Paired: yes
    Trusted: no
    Blocked: no
    Connected: no
    LegacyPairing: no
    UUID: Serial Port               (00001101-0000-1000-8000-00805f9b34fb)
    UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
    UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
    UUID: Handsfree                 (0000111e-0000-1000-8000-00805f9b34fb)
    UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
    Modalias: bluetooth:v05D6p000Ad0240
    ManufacturerData Key: 0x5754
    ManufacturerData Value:
  53 4d 4f aa 58                                   SMO.X           
    RSSI: -71

単なるスピーカーなので、trustにする。

[bluetooth]# trust E0:5D:F5:35:B7:F2
[bluetooth]# info E0:5D:F5:35:B7:F2
    Trusted: yes

再度iinfoで確認し、TrustedがyesになればOK。

最後に、なぜかGUIではうまくConnectできなかったけど、CUIならうまく行った。

[bluetooth]# connect E0:5D:F5:35:B7:F2
Attempting to connect to E0:5D:F5:35:B7:F2
[CHG] Device E0:5D:F5:35:B7:F2 Connected: yes
Connection successful
[CHG] Device E0:5D:F5:35:B7:F2 ServicesResolved: yes
[NEW] Device D7:C0:DF:31:AE:8A AlterLock
[DEL] Device 77:B8:89:CB:65:2F 77-B8-89-CB-65-2F
[NEW] Device 77:B8:89:CB:65:2F 77-B8-89-CB-65-2F

Connection successfulを確認して、終了。

[SR1323]# quit

適当なmp3等を再生するが、その前に以下の画像のように、スピーカーのマークを右クリックして出力先がBluetoothスピーカーになっていることを確認する。

(画像は、別のダイソースピーカーになってる。m(__)m )

f:id:hymd3a:20220122204303p:plain

スピーカーを右クリックして、出力先を確認

vlc(cvlc)またはmplayer等で、適当なmp3等を再生する。うまくスピーカーから再生されれば成功。

うまく接続(Connect)できないときに(2022-01-24追記)

筆者のRaspberry Piでも、ペアリングまでは成功しても、接続が成功しない場合がある。そのときには、コマンドで以下の通り接続する。

$ bluetoothctl
# connect E0:5D:F5:35:B7:F2
# quit

毎回、行うのば面倒なので以下のBashスクリプトを作成した。

余談だけど、ヒヤドキュメントってこういう使い方があるんだって初めて知った。

$ cat bin/blule-connect
#/bn/bash
# bluetooth connect

bluetoothctl << EOC
connect E0:5D:F5:35:B7:F2
quit
EOC
(追記終了)

おわりに

充電式のBluetoothスピーカーが、持ち運べて意外に便利だったので、自宅用と職場用と2つのスピーカーを買ってしまった。ただし、いずれも安いスピーカーなので音質は期待できないけど…(^^ゞ

関連ページ

Raspberry Pi(ラズパイ)にラジオになってもらうよ

(2022-01-22 初稿 - )

はじめに

先日、Raspberry PiをBGMサーバにする記事をアップした。

BGMサーバとしても、とても役立つラズパイだけど、ついでにラジオも流してもらうことにした。

この記事では、ラズパイでNHKのラジオ、地域のコミュニティFMShoutcastのネットワーク上のラジオ局を聞く方法を記述する。

ちなみに、下の写真は、Raspberry Piに、ダイソーBluetoothスピーカーをペアリングしてラジオを流しているところ。とても可愛らしいスピーカーだったので、ついつい買ってしまった。^^;

f:id:hymd3a:20220121190048j:plain

ラズパイとダイソーのスピーカーでラジオを流しているところ

Raspberry Piには、ディスプレイ、キーボード、マウスを付けたくないので、原則操作はリモートPC(Debian)から行う。Raspberry PiSSH接続ができれば、どんなOSでもできるよ。

準備

まずは、Raspberry Pivlcをインストール。mplayerも試したけど、vlcの方がラジオの受信が安定してた。

sudo apt install vlc

HDMI、アナログ、Bluetoothなんでもいいから、Raspberry Pivlcから音が出るように設定。

また、Raspberry PiにはロカールPCからSSHで接続できるように設定をしておく。

わからなければ、以下を参照して。

面倒なのは各放送局のストリームURLを調べないといけないけど、筆者は以下のサイトを参照して調べた。

NHK

【地域コミュニティ】

Shoutcast

ShoutCastのストリームURLの取得は、下のスクリーンショットを参考に取得する。

  1. 聞きたいStationのダウンロードマークをクリック
  2. Any player (.m3u) を右クリック
  3. リンクのアドレスをコピー
  4. テキストエディタ等に貼り付け

f:id:hymd3a:20220121192244p:plain

ShoutCastのストリームURLの取得方法

ラジオを聞く

まずは、Raspberry Piで聞く方法。

$ cvlc http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1760430
$ cvlc http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1760430 & #バックグランド実行

vlcコマンドだとGUIVLCが起動してしまうので、ディスプレイがついてないラズパイではcvlcが便利。しばらくして、音楽が聞こえてきたら成功。簡単だね。

スクリプトの作成

1局だけ聞くのは簡単だけど、聞きたい局を変更したり、リモートのRaspberry Piに接続に行くのがいちいち面倒。

そこで、筆者お得意の超ローテクのbashスクリプトを作った。

$ cat lradi

#/bin/bash
# Listen Radio Program 
# ver 0.01 2022-01-20 started
# ver 0.02 2022-01-21 list配列変更

# Global Variable
# Station List ','で区切って列記
st_list=(
  "NHK-FM,https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8"
  "NHK-R1,https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8"
  "NHK-R2,https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8"
  "G-SKY,http://musicbird-hls.leanstream.co/musicbird/JCB036.stream/playlist.m3u8"
  "FM-HARO,http://musicbird-hls.leanstream.co/musicbird/JCB034.stream/playlist.m3u8"
  "America's_Best_Ballad,http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1760430"
  "Bay_Smooth_Jaz,http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1852944"
  "ADULT_CONTEMPORARY,http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1592967"
)

USAGE="  lradi Ver0.02 Listen Radio Program
  [Usage] lradi -h   Display Usage and Exit
          lradi -l   List : Display Radio Station Number
          lradi n    n=Radio Station Number
          lradi -q   Quit lradi
          lradi -s   -s Servername
          lradi -u   -u Remote Uername"

#echo ${st_list[0]} ${st_list[0]%%,h*} ${st_list[0]#*,}

st_name=()
st_url=()
USR="pi"         # Default User
SERVER=""
qflag=0

# function
usage_exit() {
  echo "$USAGE"
  exit 1
}

prn_slist() {
  local n=0
  for i in ${st_name[@]}; do
    echo $n ":" "${i}"
    n=$((n+1))
  done
  exit 0
}

sl=""
for sl in ${st_list[@]}; do
  IFS=, st=(${sl})
  #echo "[name]"${st[0]}  ":" "[URL]"${st[1]}
  st_name+=(${st[0]})
  st_url+=(${st[1]})
done 

while getopts :lhqs:u: OPT
do
  case $OPT in
    l)  prn_slist
        ;;
    h)  usage_exit
        ;;
    q)  qflag=1
    ;;
    s)  SERVER=$OPTARG
    ;;
    u)  USR=$OPTARG
        ;;
    \?) usage_exit
        ;;
  esac
done

shift $((OPTIND - 1))

snum="$1"

if [ $SERVER ]; then
  #echo "SERVER="$SERVER "USER="$USR
  if [ $qflag -ne 0 ]; then
    ssh $USR@$SERVER killall vlc
    exit
  fi
  
  rt=""
  rt=$(ssh $USR@$SERVER /usr/bin/pgrep vlc)
  if [ $rt ]; then
    echo "change Station"
    ssh $USR@$SERVER killall vlc
  fi
  echo listening... ${st_name[$snum]}
  ssh $USR@$SERVER PULSE_SERVER=localhost cvlc \
    ${st_url[$snum]} > /dev/null 2>&1 &
  sleep 3
  #echo $!  # クライアント側プロセスを消してOK
  kill $!   #直前のバックグランドjobのプロセスID
else
  #echo ${st_url[$snum]}
  if [ $qflag  -ne 0 ]; then
    killall vlc
    exit
  fi
  
  rt=$(pgrep vlc)
  if [ $rt ]; then
    killall vlc
  fi
  echo listening... ${st_name[$snum]}
  cvlc ${st_url[$snum]} > /dev/null 2>&1 &
fi

exit 0

エディタに貼って、以下のとおり実行権を付与。

chmod +x lradi

使い方

$ lradi -u Username -s Server 聞きたいラジオ局
$ lradi -l    (このスクリプトに入っているラジオ局は以下のとおり。)
0 : NHK-FM
1 : NHK-R1
2 : NHK-R2
3 : G-SKY
4 : FM-HARO
5 : America's_Best_Ballad
6 : Bay_Smooth_Jaz
7 : ADULT_CONTEMPORARY
自分で好きな局を見つけて加えてね。

$ lradi -u Username -s Server 聞きたいラジオ局(ラジオ局の変更)
$ lradi -u Username -s Server -q   (終了)

なお、Usernameはデフォルトでpi、Serverをつけれければ、ローカルPCでvlcが起動する。

おわりに

新型コロナのオミクス株が猛威を奮っている今日この頃、ラジオでも聞いてのんびり過ごしましょう。

この記事では、ラジコ(radiko)で放送されている放送にもチャレンジしたが、うまく聞くことができなかった。(-_-;)

何か情報を持っている方は、教えてください。m(__)m

関連ページ

超ローテクでRaspberry Pi 3をBGMサーバーに

(2022-01-17 初稿 - 2022-01-21 修正・追記 )

(2022-01-19 追記)

VLC media playerが、バックグランドにもなり、とても使い勝手が良いことがわかった。そこで、この記事もVLCを利用する方法に修正、追記した。

(追記終了)

 

サーバとして使っていたRaspberry Pi 3を、先日苦労してBusterからBullseyeにアップグレードした。実のところ、アップグレードは、この記事のBGMサーバにするための準備だった。

筆者以外にもPi 3を4に更新し、余っているPi 3がある方も多いのではないかと思う。筆者の手元には数台のPi 3があり、その有効活用のひとつとして、Pi 3を超ローテクでBGMサーバにしてしたみた。

前提条件

f:id:hymd3a:20220117161751j:plain

ラズパイにSSHで命令

ラズパイをBGMにするために、この記事では以下の前提がある。前提が多くて申し訳ない。m(__)m

  1. ラスパイとSSH接続できるPCがあり、できればパスフレーズ無しで接続できることが望ましい
  2. ラズパイにはスピーカーをつないでBGMを流す
  3. BGMなので、曲は選ばずにプレイリスト内の曲をランダムに選択して流す

以上の前提があり、それでも使ってみるという方は、以降を読んでください。

ラズパイの設定

プレイヤーソフトの選択

余ったラズパイには、ディスプレイやキーボード、マウスを付けておきたくないので、ラズパイはX環境の無いCLIとし、操作はリモートPCからのSSH接続で行うこととする。

CLIで運用するので、もちろん音楽再生ソフトもCLIで動作させる必要がある。CLIで動作するプレイヤーソフトとして、筆者が試した以下の3つを挙げる。

  • mpg123:軽量、今回の目的には必要十分
  • mpg321:やや重い、romoteコントロールが使えるようになると面白い(調査中)
  • mplayer:重量、今回の目的以外にも、ラジオなどの他のストリーム系も対応可
  • VLC Media Player:cvlcでCLIに対応、かつ、バックグランド実行にも対応

今回の目的のためには、いずれのソフトも必要十分な機能なので、コメントを参考にインストールして欲しい。インストール方法は、以下のとおり。

$ sudo apt install mpg123 ( or mpg321 or mplayer or vlc)

以下では、すべてのソフトの設定を示すのは冗長なので、mpg123の設定を示し、場合によりmplayerの設定を示す。

バックグランドでの実行

筆者の望みとしては、これらのソフトをバックグランドで実行し、必要に応じてフォアグランドで操作することだった。が、残念ながらいずれのソフトも希望に叶わず、バックグランド実行ができなかった。

VLCのみが、バックグランド実行に対応していた。

しかし、この問題は、どのソフトでも後ほどSSH接続で解決できる。

蛇足だが、nohupを用いれば、いずれのソフトもバックグランド実行が可能である。

$ nohup mpg123 xxxx.mp3 &
$ cvlc xxxx.mp3 &

fgコマンドでフォアグランドにできるが、残念ながらVLC(cvlc)以外は、再びバックグランドにすることができない。

さらに余談であるが、どのソフトもラズパイにtmuxやscreenを導入すれば解決する。しかし、今回は簡易なBGMサーバであるため、これらの導入は見送った(単に面倒 (^^ゞ)。

SSH接続での操作

ここでは、ローカルPCからリモートのラズパイにパスフレーズで接続することを想定しているが、まだ設定が済んでいない場合は、以下を参考に設定して欲しい。

ラズパイ本体では思うような動作が難しかったが、筆者がやりたかったSSHを用いてリモートPCでラズパイを操作する方法はnohupを用いなくても動作する。

ssh Server  mpg123 xxxx.mp3 

さらに、以下のようにバックグランドで動作させるとsshのPIDを削除してもBGMを流し続けてくれる。

$ ssh Server  mpg123 xxxx.mp3  & 
$ pgrep mpg123 $ kill 上記で調べたPID

playlistファイルの作成

playlistファイルの作成は、以下のように行う。

$ ls ~/Music/folder/*.mp3 > ~/Music/playlist-sample.m3u

他にもいろいろ情報を書き込めるようだが、今回は省略するので、必要な方はWebで検索して欲しい。

スクリプトの作成

これらを踏まえて、以下のBashスクリプトを作成した。

なお、mplayerを利用することを前提に作成したが、mpg123に変更する場合はコメントを参照して変更願う。

(2022-01-19 追記)

一応、以下のスクリプトも残しておくが、もうひとつ下のVLCを用いたスクリプトの利用をおすすめする。

(追記終了)

$ cat bin/bgm

#/bin/bash
# Written H.Yamada 2022-01-16
# ver0.03 2022-01-16 サーバ設定をコマンドライン引数に
# Raspberry Pi 3をBGMサーバに
# bgm  Music Start/Stop Toggle

# Global Variable
USAGE="bgm BGM On/Off Program for Raspberry Pi
ver0.03 Raspberry PiをBGMサーバに
[Usage] bgm server
        On/Off togle switch program
        server:設定無しの場合は手元のPC
"
CMD="mplayer"                       # CMD="mpg123"
OPTION="-quiet -shuffle -playlist"  # OPTION="-q -Z -@"
M3UFILE="Music/playlist-sample.m3u" if [ $# -gt 2 ]; then   echo "$USAGE"   exit fi SERVER="$1" #echo $SERVER if [ $SERVER ]; then   rt=$(ssh $SERVER pgrep $CMD)   if [ $rt ]; then     echo "BGM off"     ssh $SERVER killall -9 $CMD   else     echo "BGM on"     ssh pi@$SERVER $CMD $OPTION /home/pi/$M3UFILE &     sleep 3     #echo $!  # クライアント側プロセスを消してOK     kill $!   #直前のバックグランドjobのプロセスID   fi else   rt=$(pgrep $CMD)   if [ $rt ]; then     echo "BGM off"     kill $rt   else     echo "BGM on"     nohup $CMD $OPTION ~/$M3UFILE &   fi fi

こちらのスクリプトがおすすめ。

(2022-01-19追記)

#/bin/bash
# bgm  Music Start/Stop Toggle
# Written H.Yamada 2022-01-16
# ver0.05 2022-01-19 vlc(cvlc)に変更 
# Raspberry Pi 3をBGMサーバに
# Global Variable
USAGE="bgm BGM On/Off Program for Raspberry Pi
ver0.05 Raspberry PiをBGMサーバに
[Usage] bgm [-u username] [-f m3u-file] server
        On/Off toggle switch program
        Options
          -u username default pi
          -f m3u-file default m3ufile.m3u
        server:設定無しの場合はローカルPC
"
CMD="vlc"                             # CMD="mpg123" or "mplayer"
OPTION="-I dummy -Z"                  # cvlc nearly = vlc -I dummy
M3UFILE="playlist-sample.m3u"

usage_exit() {
        echo "$USAGE"
        exit 1
}

if [ $# -gt 6 ]; then
  usage_exit
fi

USR="pi"         # Default User
SERVER=""

while getopts :f:hu: OPT
do
  case $OPT in
    f)  M3UFILE=$OPTARG
        ;;
    h)  usage_exit
        ;;
    u)  USR=$OPTARG
        ;;
    \?) usage_exit
        ;;
  esac
done

shift $((OPTIND - 1))

SERVER="$1"

#echo "USER="$USR "SERVER="$SERVER "M3UFILE="$M3UFILE

if [ $SERVER ]; then
  rt=$(ssh $USR@$SERVER pgrep $CMD)
  if [ $rt ]; then
    echo "BGM off"
    ssh $USR@$SERVER killall -9 $CMD
  else
    echo "BGM on"
    ssh $USR@$SERVER PULSE_SERVER=localhost \
      $CMD $OPTION /home/$USR/Music/$M3UFILE \
      > /dev/null 2>&1 &
    sleep 3
    #echo $!  # クライアント側プロセスを消してOK
    kill $!   #直前のバックグランドjobのプロセスID
  fi
else
  rt=$(pgrep $CMD)
  if [ $rt ]; then
    echo "BGM off"
    kill $rt
  else
    echo "BGM on"
    $CMD $OPTION ~/Music/$M3UFILE &
  fi 
fi

(追記終了)

実際の実行は、ローカルPCの場合は、bgm コマンドのみをリモートPCで実行する場合は、オプションで-u ユーザ名 -f m3uファイル名の他、サーバ名を入力する。

$ bgm [-u Username -f M3ufile] (server) # serverをなしの場合ローカルPCで実行

再度同じコマンドを入力することにより、BGMをoffにできる。

音量調節

スクリプトでは、音量調節ができないので(<をい)、ラズパイに付けたスピーカーのボリュームで調節するか、以下のようにSSHでサーバに接続してalsamixerで調節してね。^^;

$ ssh Server
$ alsamixer

おわりに

バックグランド実行で手間取ったが、なんとか思うようにラズパイをBGMサーバとして活用できそうだ。VLCmplayerはサイマルラジオ等のネットストリームの再生もできるようなので、設定ができたらまたアップする。

なお、余談だが、この投稿がはてなブログの100個目の記事になる。

少し振り返ってみると、誤字や間違いが多くあるので、しばらくの間、新規を控えて修正と更新をしたいと考えている。

今後ともご愛顧お願いします。

関連ページ

 

CLIのRaspberry PiのBusterをBullseyeにアップグレードして苦労した

(2022-01-16 初稿 - )

はじめに

以前にRaspberry PiのOSをBusterからBullseyeにアップグレードする記事をアップしたが、その記事の場合は別のSDカードを用意して新たにBullseyeをインストールして、Busterで実現していた機能をできるようにした。

今回は、X環境がないサーバとして用いていたRaspberry Pi 3B+を、aptでアップグレードしようとして苦労した話をアップする。

実際にやってみて、Raspberry Piの公式ページに従ってクリーンインストールでBullseyeにアップグレードした方が明らかに苦労なく移行できるので、どうしても現状のBusterをアップグレードしなければならない理由が無い限り、以降の記述はまねしない方が良いと思われる。

ということで、このページは、あくまでも筆者のメモとして残す。

aptラインの編集

aptラインを編集する前に、Busterを全て最新版にアップグレードする。

sudo apt update ; sudo apt upgrade

続いて、aptラインを以下のとおり編集する。なお、64bit版は別のaptラインになるので注意。

$ sudo vi /etc/apt/sources.list
deb http://raspbian.raspberrypi.org/raspbian/ bullseye main contrib non-free rpi
$ sudo vi /etc/apt/soursed.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ bullseye main

アップグレード

アップグレードは、Debianのマニュアルにあるように以下を順に行う。

$ sudo apt update
$ sudo apt upgrade --without-new-pkgs
$ sudo apt full-upgrade

途中いくつか質問があるが、基本的にデフォルト(エンターキー)を入力すれば良い。

再起動後の設定

アップグレードまでは順調だったが、再起動後が地獄のようだった。(-_-;)

その原因は、以下の3点が主なもの。

  • Locationが日本に設定されていなくて、キーボードが英語モードだったこと
  • X環境がないため、文字化けしたメッセージを見ながら、CLIコマンドをキーボードで入力しなければならなかったこと
  • ネットワークが使えないこと

ネットワークの設定

ネットワークの復帰

まずは、ネットワークを使えるようにして、SSHでログインし設定できるようにすることを優先した。

何度か再起動してしているうちに、ログインする前から以下のメッセージが表示されるようになった。

Failed DHCP Clients Daemon 

上記エラーメッセージを検索すると以下のサイトがヒット。多謝。

筆者は一応バックアップをとってから、設定を変更した。

$ sudo cp /etc/systemd/system/dhcpcd.service.d/wait.conf /etc/systemd/system/dhcpcd.service.d/wait.conf.bak
$ sudo vi /etc/systemd/system/dhcpcd.service.d/wait.conf
[Service]
ExecStart=
ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w      (変更前)
ExecStart=/usr/sbin/dhcpcd -q -w             (変更後)

上記変更後、再起動するとなんとかネットワークに接続できるようになった。喜んで他のPCからSSHで接続を試みるが接続できない。(-_-;)

IPアドレスの固定化

ネットワークは復帰したものの、他のPCからはSSH接続ができない原因は、IPアドレスが以前と異なっていたためだった。

Bullseyeからは、NetworkManagerがネットワーク管理をするようで、Debianの公式ページにCLIの場合のネットワークの固定方法の記述があったので、そのとおり実施した。

具体的には "/etc/systemd/network/static.network" を作成する。

[Match]
Name=en*

[Network]
Address=192.168.0.15/24
Gateway=192.168.0.1

IPアドレスは、ネットワーク環境に応じて適宜修正を。

上記を修正し再起動することによって、IPアドレスの固定化ができ、他のPCからSSH接続して設定できるようになった。

おわりに

その他設定で大きなものはなかったが、日本語localeの設定やタイムゾーンを日本に変更することにより、ようやく通常の利用ができるようになった。

冒頭に書いたように、よほどの理由が無い限り明らかにクリーンインストールして設定を行った方が効率的である。

それでも、いろいろなエラー対策が皆さんの参考になれば幸いである。

 

関連ページ

youtube-dl(yt-dlp)のTipsとファイル名エラーへの対策

(2022-01-14 初稿 - 2023-10-09 追記)

Debianyoutube-dlを便利に使わせてもらっている。ここでは、筆者が使ってみて便利だと思う機能とファイル名エラーへの対策を記述する。

 

(2023-10-09 追記)

youtube-dlでは、動画がダウンロードできなくなってしまったので、Web検索して似たような機能のyt-dlpを見つけた。多謝。m(__)m

インストールは以下のとおり。ただし、Raspberry Piのaptにはなかった。^^;

sudo apt install yt-dlp

yt-dlpyoutube-dlの派生だけに、オプションもほとんど同じで、以下の記述もyoutube-dlをyt-dlpにコマンドを変更するだけで利用できる。

(追記終了)

いきなり音楽ファイルへ

これまで動画をダウンロードして、以下の記述のとおりmp3等の音楽ファイルへと変換していた。

しかし、動画ファイル全体のダウンロードはサイズが大きいばかりか、ときどきエラーが起きる。

youtube-dlには、動画の音楽ファイルを抽出するオプションがあり、このオプションを用いるとダウンロード後、いきなり音楽ファイルを抽出してくれる。 

Post-processing Options:
    -x, --extract-audio                  Convert video files to audio-only files
                                         (requires ffmpeg/avconv and
                                         ffprobe/avprobe)
    --audio-format FORMAT                Specify audio format: "best", "aac",
                                         "flac", "mp3", "m4a", "opus", "vorbis",
                                         or "wav"; "best" by default; No effect
                                         without -x

上記のヘルプメッセージから、筆者はいつも以下のオプションを付けている。

-x --audio-format mp3

実際にオプションを付けると明らかにダウンロードサイズが小さくなり、おまけに抽出までしてくれるので、動画の音楽だけに興味がある方はオプションを付けた方が良いようだ。

複数動画のダウンロード

複数動画をダウンロードするときは、いちいちコマンドラインにURLを書いてyoutue-dlを実行するのが面倒。でも、youtube-dlには以下のオプションがあり、ダウンロードしたいURLを一覧にしたファイルを作っておけば、リスト順にダウンロードしてくれる。

  Filesystem Options:
    -a, --batch-file FILE                File containing URLs to download ('-'
                                         for stdin), one URL per line. Lines
                                         starting with '#', ';' or ']' are
                                         considered as comments and ignored.

ダウンロードしたいURLを記述した以下のようなファイルを作り。

cat Downloads-urls.txt
https://www.youtube.com/watch?v=xxxxxxxxxxx
https://www.youtube.com/watch?v=xxxxxxxxxxx
https://www.youtube.com/watch?v=xxxxxxxxxxx

以下のように実行すると、リスト順にダウンロードしてくれる。

youtube-dl -a Downloads-urls.txt

 

他にも出力するファイル名を制御する等便利すぎて泣きたくなるようなオプションがたくさんあるから、man youtube-dl または youtube-dl --help で確認を。

 

ファイル名エラー対策

実際にYoutubeからダウンロードすると、動画のタイトルがファイル名に使えない文字があったり、タイトルが長すぎて、エラーが起きてしまうときがある。

具体的には、以下の赤字下線のような例。

hoge@fuga:~$ youtube-dl https://www.youtube.com/watch?v=Spicm6nUl88
[youtube] Spicm6nUl88: Downloading webpage
[download] Destination: 【〇〇 】〇〇年人気の洋楽ランキング【最新】〇〇〇〇ファイル名として使えない文字などのメドレー 2021 🇯🇵 バイクで聞くと最高かも 3-xxxxxxxxxxxxxxxxxx.f248.webm
[download] 100.0% of 571.83MiB at 74.70KiB/s ETA 00:00ERROR: unable to rename file: [Errno 2] No such file or directory: 'https://hymd3a.hatenablog.com/entry/2021/06/01/191937【〇〇】〇〇年人気の洋楽ランキング【最新】〇〇〇〇ファイル名として使えない文字などのメドレー 2021 🇯🇵 バイクで聞くと最高かも 3-xxxxxxxxxxxxxxxxxx.f248.webm'
hoge@fuga:~ $ youtube -dl https://www.youtube.com/watch?v=QXwgpoDR-YM
[youtube] QXwgpoDR-YM: Downloading webpage
ERROR: unable to open for writing: [Errno 36] File name too long: 'じゅげむじゅげむごこうの〇〇〇〇〇〇長い長いタイトルだよ 勉強用BGM・作業用・オフィス・店舗用・サロン・商業利用最適 洋楽 2022-xxxxxxxxxxx.webm.part'

こんなときは、きっと対処法があるはずだと、man youtube-dlを調べると…

(前略)
Filesystem Options:
       (中略)
       --id   Use only video ID in file name
(後略)

なるほど、--id オプションで、ファイル名がidになるんだ。

youtube-dl https://www.youtube.com/watch?v=xxxxxxxxxxxxxx --id

ということで、問題解決。

Bashスクリプト

いろいろ便利なオプションがあり、また、エラー対策まで取れそうなyoutube-dlyt-dlpだけど、筆者の頭ではオプションが覚えきれそうにないので、以下のBashスクリプトを作った。

#/bin/bash
# Written by H.Y 2022-01-13
# ver0.02 2022-01-14
# ver0.03 2023-10-09 youtube-dl to yt-dlp # Youtubeファイルをmp3に変換する Usage=" yt2mp3 youtube url  yt2mp3 -a Download-urls.txt" CMD="/usr/bin/yt-dlp" # 2023-10-09 修正 OPTIONS="-x --audio-format mp3" if [ $# -lt 1 ]; then   echo "$Usage"   exit fi # error が起きた場合は --id オプションを付ける $CMD $* $OPTIONS || $CMD $* --id $OPTIONSつ

(2023-10-09追記)

ついでに、上記サイトにmplayerを使って、コマンドラインでいきなり曲を再生する方法の記述があったので、vlcで再生する方法を書いておくね。

yt-dlp ’YoutbueのURL' -x --audio-format mp3 -o - | cvlc - --play-and-exit

cvlcはvlcコマンドライン版。--play-and-exitのオプションを付けないと、曲が終わってもvlcが終了しない。このことは、以下のサイトに教えていただいた。多謝。m(__)m

(追記終了)

皆さんの参考になれば…

関連ページ