オールナイトニッポンを聴きたくなったけど、リアタイで聴いていられるほどの体力もなし。というわけで家に転がっていたRaspberry Pi Zero W(以下、Zeroと表記)を使って、やってみたことをメモ。
- Raspberry Pi OSのデフォルトユーザーが初期設定から削除されたので、公式のイメージ書き込みソフトを使って、Zeroのモニタレスセットアップイメージ作成。
- Zeroにradikoのタイムフリーを録音するためのスクリプトを導入し、定時に録音を実行するようcrontabを設定。
- ZeroのmicroSDに保存した録音ファイルをNASに転送するため、転送開始でNASをマウントし、転送後一定時間で自動アンマウントするように設定。
- 定期的にNASへファイルを転送し、転送に成功したファイルはZero側から削除するようcrontabを設定。
参考サイト
- 【2020年12月改訂】Raspberry PiでRadikoのラジオ録音サーバーを作る | Digitalyze
- CIFS 経由で NAS に接続する | text.Baldanders.info
- NASをautofsでマウントする – NorthPage
Zeroの基本セットアップ
冒頭にも書いた通り、2022年4月よりセキュリティ上の観点からRaspberry Pi OSからデフォルト設定であるuser=pi
、password=raspberry
が削除された。デスクトップ機能のないRaspberry Pi OS Liteを利用するには、公式のイメージ書き込みソフト「Raspberry Pi Imager」を使うことで、ユーザーとパスワードを設定したイメージファイルをmicroSDに書き込むことができる。このmicroSDを使ってZeroを起動すれば、初回のSSH接続がモニタレスでも可能となる。
Raspberry Pi OSの準備
準備作業は、Windows PCを使用しておこなった。Zeroへのリモート接続には、VSCodeのWSL2環境を利用。
- Raspberry Pi Imagerをダウンロード。
- Raspberry Pi Imagerを起動し、OSで「Raspberry Pi OS (other)」から「Raspberry Pi OS Lite (32-bit)」を選択し、ストレージでmicroSDカードを選択。
- Raspberry Pi Imagerの「設定(歯車のアイコン)」をクリックし、下記のように設定して保存。
- ホスト名:radikozero(.local)
- ユーザー名:{PiUser}
- パスワード:{PiPassword}
- タイムゾーン:Asia/Tokyo
- 「終わったときにメディアを取り出す」のチェックを外す
- ここでSSHやWi-Fiの設定も可能だが、この辺はImagerに頼らず別口で設定
-
Raspberry Pi Imagerの「書き込む」ボタンを押すと書き込み開始。
-
Raspberry Pi Imagerでの書き込みが終わったら、microSDカードのルートディレクトリに「SSH」という空のファイルを作成。
-
microSDカードのルートディレクトリに「wpa_supplicant.conf」というファイルを作成し、Zeroが接続するWi-Fiの設定を下記のように書き込み。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=JP network={ ssid="{SSID}" # {SSID}と{パスフレーズ}を自分の環境に置き換え psk="{パスフレーズ}" # もしくは、wpa_passphraseコマンドで256bit変換したパスフレーズ psk={256bit変換したパスフレーズ} }
-
以上の設定を終えたmicroSDカードをZeroに挿し込んで準備完了。
Zeroの初回起動
-
ZeroにUSB給電すると起動開始。初めての起動だと3~5分くらいかかる。
-
ZeroがWi-Fiルータに接続できているか、
ping radikozero.local
コマンドで確認。 -
ssh {PiUser}@radikozero.local
コマンド(ホスト名はIPアドレスに置き換えてもOK)で、PCからZeroへSSH接続。 -
接続確認に
yes
、続けてRaspberry Pi Imagerで設定した{PiPassword}を使ってZeroにログイン。 -
ログインに成功したら、
date
コマンドでJST(日本標準時)に設定されていることと日時が合っていることを確認。(以下、個人的な初期設定メモなので、不要ならログアウトして公開鍵認証の切り替えへ) -
apt list --installed
コマンドでインストールされているアプリを確認。 -
vim-tinyを削除(
sudo apt --purge remove vim-common vim-tiny
)して、vimをインストール(sudo apt install vim
)。 -
sudo apt install git
でgitをインストール。 -
aptコマンドの参照先を日本国内のミラーに変更するため、
/etc/apt/sources.list
ファイルの参照先URLを変更。 -
sudo apt -o Acquire::http::AllowRedirect=false update
、sudo apt -o Acquire::http::AllowRedirect=false upgrade
コマンドで環境を更新。 -
ZeroのホストネームとIPアドレスを指定するため、
/etc/dhcpcd.conf
ファイルの末尾に下記の内容を追加。hostname radikozero # ホストネームの指定 interface wlan0 static ip_address=192.168.0.200/24 # 固定するIPアドレス static routers=192.168.0.1 # デフォルトゲートウェイのIPアドレス static domain_name_servers=192.168.0.1 # DNSサーバーのIPアドレス
-
Bluetoothを無効にするため、
/boot/config.txt
ファイルの末尾にdtoverlay=disable-bt
を追記。 -
NTPサーバーにNICTを指定するため、
/etc/systemd/timesyncd.conf
ファイルの末尾にNTP=ntp.nict.jp
を追記し、下記コマンドを実行。sudo systemctl daemon-reload # デーモンリロード sudo systemctl restart systemd-timesyncd.service # サービス再起動 sudo systemctl status systemd-timesyncd.service # ステータス確認
-
sudo shutdown -r
コマンドでZeroの再起動をセットして、exit
コマンドでいったんZeroからログアウト。
ZeroのSSH接続を公開鍵認証に切り替え
今回は作成済みの公開鍵を使用したが、未作成ならこの辺を参考に作成。
-
リモート接続するPCから、
scp ~/.ssh/{公開鍵} {PiUser}@radikozero.local:~/
コマンドで公開鍵をZeroに送信。 -
Raspberry Pi Imagerで設定した{PiPassword}を使って認証すると、公開鍵の送信が完了。
-
ZeroにSSHパスワード認証でログインして、以下の作業をZero側で実施。
-
mkdir ~/.ssh
コマンドで、ホームディレクトリに.ssh
ディレクトリを作成。 -
mv ~/{公開鍵} ~/.ssh/authorized_keys
コマンドで、PCから送信した公開鍵をauthorized_keys
とファイル名を変更して.ssh
ディレクトリに移動。 -
chmod 600 ~/.ssh/authorized_keys
コマンドで、ファイルのパーミッションを変更 -
chmod 700 ~/.ssh
コマンドで、ディレクトリのパーミッションを変更 -
sudo vim /etc/ssh/sshd_config
コマンドを実行し、sshd_config
ファイルに下記内容を追記して保存。Port {ポート番号} # 22から別の空き番号に変更(変更後の番号は次回ログインから使用) AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 # 公開鍵認証を有効にする PasswordAuthentication no # パスワード認証を無効にする
-
sudo /etc/init.d/ssh restart
コマンドで、sshサービスを再起動したら、いったんZeroからログアウト。 -
ssh -p {ポート番号} {PiUser}@radikozero.local
コマンドでZeroに接続し、公開鍵のパスフレーズでログインできればOK。
Radikoの録音環境セットアップ
ラジオを録音するためのシェルスクリプトがGithubにて公開されている。
- radish(配信中のラジオをリアルタイム録音)
- rec_radiko_ts(radikoのタイムフリー番組を保存)
今回は、radikoのタイムフリーを録音したいので、rec_radiko_tsを利用した。
rec_radiko_tsの準備
-
Zeroにログイン。
-
rec_radiko_tsに必要なパッケージのうち
curl
とlibxml2
はインストール済みだったので、残るffmpeg
をsudo apt install ffmpeg
コマンドでインストール。 -
git clone https://github.com/uru2/rec_radiko_ts.git
コマンドで、Zeroのホームディレクトリにrec_radiko_tsをクローン。 -
クローンした
rec_radiko_ts
フォルダからrec_radiko_ts.sh
ファイルをホームディレクトリに移動。 -
chmod 755 ~/rec_radiko_ts.sh
コマンドで、ファイルのパーミッションを変更。 -
下記コマンドで、録音テストをおこない、
test.m4a
というファイルが出力されたらOK。(放送局ID:http://radiko.jp/v3/station/region/full.xml)~/rec_radiko_ts.sh -s {放送局ID} -f {開始日時} -d 1 -o ~/test.m4a
定期的に番組録音をおこなうための設定
radiko録音スクリプト(rec_radiko_ts.sh
)を定期的に実行するための設定をcrontab
に記述し、cronサービスにて実行する。
- 録音したファイルを一時保存するフォルダ:tmp_radiko
- Zeroにログイン。
- ホームディレクトリに録音ファイルを一時保存するためのフォルダを作成するため、
mkdir ~/tmp_radiko
コマンドを実行。 crontab -e
コマンドを実行し、使用するエディタを選択し、crontab
を編集。(crontab -r
で簡単に設定が削除されてしまうので、心配ならコピーとるとか、その辺は各自工夫して)crontab
の末尾にrec_radiko_tsの定期実行内容を記述し、保存して終了。(下記は自分の設定例)
# 自分用メモ
# 深夜番組は前日基準で番組表が組まれているので、ファイル名に前日の日付を付ける
# 24時に終了する番組はタイムフリーだと録音開始が翌日になるので、録音開始日を前日で指定
# 毎週月 24~25時 空気階段の踊り場 -> 25時05分にダウンロード
05 01 * * 2 ~/rec_radiko_ts.sh -s TBS -f `date +\%Y\%m\%d`0000 -d 60 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-空気階段の踊り場.m4a"
# 毎週火 27~28時30分 オールナイトニッポン0(ぺこぱ) -> 28時35分にダウンロード
35 04 * * 3 ~/rec_radiko_ts.sh -s LFR -f `date +\%Y\%m\%d`0300 -d 90 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-オールナイトニッポン0(ぺこぱ).m4a"
# 毎週水 24~25時 ほら!ここがオズワルドさんち! -> 25時05分にダウンロード
05 01 * * 4 ~/rec_radiko_ts.sh -s TBS -f `date +\%Y\%m\%d`0000 -d 60 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-ほら!ここがオズワルドさんち!.m4a"
# 毎週木 24時~24時58分 オールナイトニッポンX(週替わり) -> 25時10分にダウンロード
10 01 * * 5 ~/rec_radiko_ts.sh -s LFR -f `date +\%Y\%m\%d`0000 -d 58 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-オールナイトニッポンX(週替わり).m4a"
# 毎週木 27~28時30分 オールナイトニッポン0(マヂカルラブリー) -> 28時35分にダウンロード
35 04 * * 5 ~/rec_radiko_ts.sh -s LFR -f `date +\%Y\%m\%d`0300 -d 90 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-オールナイトニッポン0(マヂカルラブリー).m4a"
# 毎週金 27~28時30分 オールナイトニッポン0(三四郎) -> 28時35分にダウンロード
35 04 * * 6 ~/rec_radiko_ts.sh -s LFR -f `date +\%Y\%m\%d`0300 -d 90 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-オールナイトニッポン0(三四郎).m4a"
# 毎週金 オールナイトニッポンGOLD -> 24時05分にダウンロード
05 00 * * 6 ~/rec_radiko_ts.sh -s LFR -f `date +\%Y\%m\%d --date '1 day ago'`2200 -d 120 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-オールナイトニッポンゴールド.m4a"
録音したファイルをNASに転送
Zeroに一時保存した録音ファイルをNASに転送する。利用するNASは、Synology DiskStation DS220j(以下、DS220jと記載)で、SMBサービスを有効にしてフォルダ共有をおこなっている。
DS220j側の事前準備
- ZeroからDS220jにアクセスをおこなうユーザーとパスワードをDS220jのコントロールパネルで設定。
- 録音ファイルを転送する共有フォルダを作成。
- DS220jにアクセスするユーザー名:{NasUser}
- DS220jにアクセスするためのパスワード:{NasPassword}
- DS220jの共有フォルダ:RadikoBox
CIFSを使ってZeroからDS220jをマウント
- DS220jのホスト名:ds220j
- Zero側のマウント先となるディレクトリ:zero_nas
- Zeroにログイン。
sudo apt install cifs-utils
コマンドでCIFSをインストール。(今回作成したRaspberry Pi Imageにはインストール済みだった)/etc/hosts
ファイルに、DS220jのIPアドレスとホスト名を対応させるための設定を{IPアドレス} ds220j
の形式で書き込む。mkdir ~/zero_nas
コマンドで、マウント先となるディレクトリを作成。sudo mount -t cifs //ds220j/RadikoBox ~/zero_nas -o username={NasUser}
コマンド入力後、パスワードを聞かれるので{NasPassword}を入力。df
やfindmnt
コマンドで、DS220jの共有フォルダがマウントされていることを確認できればOK。- いったん
sudo umount ~/zero_nas
でDS220jをアンマウント。
認証情報ファイルによるマウント
認証情報ファイル(例:.nascredential
)を使って、マウント時にパスワード入力を省略する。
-
sudo vim ~/.nascredential
コマンドで認証情報ファイルを作成し、下記の内容を書き込み、保存する。username={NasUser} password={NasPassword}
-
sudo chmod 400 ~/.nascredential
コマンドで、パーミッションを所有者のみ読み取り可能に変更。 -
sudo mount -t cifs //ds220j/RadikoBox ~/zero_nas -o credentials=~/.nascredential
でコマンドを実行。パスワードの入力を求められたら失敗。 -
df
やfindmnt
コマンドで、DS220jの共有フォルダがマウントされていることを確認できればOK。 -
いったん
sudo umount ~/zero_nas
でDS220jをアンマウント。
アクセス時に自動マウント、一定時間アクセスなしで自動アンマウント
マウント先にアクセスがあったときに自動でマウントし、一定時間アクセスがない場合に自動でアンマウントしてくれるautofs
を利用する。
-
sudo apt install autofs
コマンドでZeroにautofsをインストール。 -
sudo vim /etc/auto.master.d/direct.autofs
コマンドで、direct.autofsファイルを作成。 -
direct.autofsファイルに、下記の様式でマウント方法を指定するためのファイル名(例:
auto.direct
)と自動アンマウントする秒数を書き込む。--timeout
オプションをつけないと、デフォルトの時間(300秒くらい)でアンマウントする。/- /etc/auto.direct --timeout=60
-
sudo vim /etc/auto.direct
コマンドで、auto.directファイルを作成し、下記の内容を書き込む。(mountに渡すオプションは各自の好みに合わせて変更)# {マウント先フォルダ} {mountに渡すオプション} {NASの共有フォルダ} # ここでのディレクトリ指定には、ホームディレクトリとして"~"が使えないので、フルパスで指定 /home/{PiUser}/zero_nas -fstype=cifs,rw,iocharset=utf8,credentials=/home/{PiUser}/.nascredential,vers=3.1.1,file_mode=0644,dir_mode=0755,uid=0,gid=0 ://ds220j/RadikoBox
-
下記コマンドで、autofsを起動。
sudo systemctl enable autofs sudo systemctl start autofs # 起動後、/etc/auto.directの内容を反映するためにリスタート sudo systemctl restart autofs
-
アンマウントの状態で
sudo cp ~/{Zeroの適当なファイル} ~/zero_nas
コマンドを実行し、自動マウントしてファイルがコピーされればマウント成功。 -
マウント後、2分くらい放置してアンマウントされていればOK。(60秒で設定しても、きっちり60秒ではないみたい)
録音したファイルを定期的にDS220jに転送
rsync
コマンドを使って、録音したファイルをDS220jに転送し、転送が成功したら転送元(Zero)からファイルを削除する。この流れを定期的におこなう設定をcrontabに追加で登録する。
crontab -e
コマンドを実行し、crontab
を編集。crontab
の末尾に下記内容を追記し、保存して終了。(下記は自分の設定例)
# 毎朝5時5分にNASにファイルを転送、転送が成功したら転送元のファイルを削除
05 05 * * * sudo rsync -r --remove-source-files ~/tmp_radiko/ ~/zero_nas/
ラズパイって、今品薄なんだ…お手軽じゃなくなった
コメント
コメントなどありましたら、GitHubのディスカッションへお願いします。(書き込みには、GitHubのアカウントが必要です)