Raspberry Piをインターネットラジオ(radiko等)の再生環境にしたらとても快適だった!CUI操作編radikoやサイマルラジオを聞いてみよう!

2019年1月26日

ども、まーくです。皆さんラジオ聞いてますか?

我が家には、Amazonのecho dotAnkerSound Core miniなど「とりあえずラジオを聞く環境」はあったのですが、操作の手間や音質がイマイチ、時間遅れがかなりあるなどやや不満に思っていました。ラジカセ(死語?)もありません!

ふと、インターネットラジオをラズパイで聞けば良いじゃ無いか!と思い立ち、やったことをまとめました。

本記事では、ターミナルからコマンドを打って、radikoサイマルラジオの各番組を再生することを目指します。

なんでわざわざラズパイでインターネットラジオ?という点については後半に書いてます^^

準備した物

  • Raspberry Pi 3B 一式、Rapbian Stretch(9.4)
  • スピーカー(LOGICOOL ステレオスピーカー Z120BW)

全体像↓

再生環境の構築

まずは、お約束のアップデートから。

sudo apt-get update
sudo apt-get upgrade

音源は、以下サイトより。使い方は後で説明します。

万能プレイヤー Mplayerのインストール

サイマルラジオなら、これだけで再生環境が整います!

sudo apt-get install -y mplayer

放送局(音源)の探し方

  1. パソコンでサイマルラジオにアクセスして
  2. 聞きたい放送局を見つけたら、
  3. それぞれの放送局の「放送を聞く」ボタン(音声の方)を右クリックして、
  4. URLをコピーします。
    ※URLは、〜〜.asxとなっているものを選びます。

mplayerで再生する!

ラズパイにsshでログインするなどして、mplayerの後に以下のように打ち込みます。

$ mplayer -playlist ${URL}

${URL}には、先に調べた放送局のURLを入れます。

例えば、関東の「FMぱるるん」だと以下のようになります。

$ mplayer -playlist http://www.simulradio.info/asx/fmpalulun.asx

文字がずらずらっと表示された後バッファリングが始まり、数秒したら再生が始まります。
うまく再生されたでしょうか?

シェルスクリプトにまとめる

よく聞く放送局はシェルスクリプトとしてパスが通った所に置いておくと便利です!

$ mkdir ~/bin/
$ vim radio-fmpalulun.sh
 #!/bin/bash
 mplayer -playlist http://www.simulradio.info/asx/fmpalulun.asx

実行権をつけましょう。

$ chomd +x radio-fmpalulun.sh

あとは、

radio-fmpalulun.sh

と打ち込んで実行すれば放送が始まります(^o^)

radiko再生用スクリプトを入手!

ネットを探すと色々な方がradikoの録音・再生用スクリプトを紹介してくださっています。
あれこれ試してみた結果、こちらのスクリプトを使う事にしました。

git cloneします。

$ cd ~/git/
$ git clone https://gist.github.com/836952a6b09e540eb6a3.git
$ cd 836952a6b09e540eb6a3/

スクリプトを修正する

記事執筆時点ではこのままでは再生されません
radikoのプレーヤー変更に合わせてスクリプトを修正(※)する必要があります。

※修正方法はコチラの情報を参考にしました。

これに加えて、ワーキングディレクトリを/dev/shm にしたりと少々手を加えています。

変更内容はコチラ。(diffの結果なので、パッチファイルとして保存して使えます)

--- org/radiko.sh	2018-05-17 00:45:28.361873732 +0900
+++ radiko.sh	2018-05-12 18:29:19.133089875 +0900
@@ -2,8 +2,10 @@
 # https://mtunn.wordpress.com/odroid-u2★セットアップ/radikoの録音・再生(archlinux)/
 
 pid=$
-wkdir='/var/tmp'
-playerurl=http://radiko.jp/player/swf/player_3.0.0.01.swf
+#wkdir='/var/tmp'
+wkdir='/dev/shm'
+#playerurl=http://radiko.jp/player/swf/player_3.0.0.01.swf
+playerurl=http://radiko.jp/apps/js/flash/myplayer-release.swf
 playerfile="${wkdir}/player.swf"
 keyfile="${wkdir}/authkey.png"
 auth1_fms="${wkdir}/auth1_fms_${pid}"
@@ -50,7 +52,7 @@ authorize() {
   # get keydata (need swftool)
   #
   if [ ! -f ${keyfile} ]; then
-    swfextract -b 14 ${playerfile} -o ${keyfile}
+    swfextract -b 12 ${playerfile} -o ${keyfile}
 
     if [ ! -f ${keyfile} ]; then
       echo "[stop] failed get keydata (${keyfile})" 1>&2 ; exit 1
@@ -62,8 +64,8 @@ authorize() {
   #
   wget -q \
     --header="pragma: no-cache" \
-    --header="X-Radiko-App: pc_1" \
-    --header="X-Radiko-App-Version: 2.0.1" \
+    --header="X-Radiko-App: pc_ts" \
+    --header="X-Radiko-App-Version: 4.0.0" \
     --header="X-Radiko-User: test-stream" \
     --header="X-Radiko-Device: pc" \
     --post-data='\r\n' \
@@ -95,8 +97,8 @@ authorize() {
   #
   wget -q \
     --header="pragma: no-cache" \
-    --header="X-Radiko-App: pc_1" \
-    --header="X-Radiko-App-Version: 2.0.1" \
+    --header="X-Radiko-App: pc_ts" \
+    --header="X-Radiko-App-Version: 4.0.0" \
     --header="X-Radiko-User: test-stream" \
     --header="X-Radiko-Device: pc" \
     --header="X-Radiko-Authtoken: ${authtoken}" \

パッチファイルとして使う場合、上のテキストを全てコピーして、radiko.sh.patchとして保存します。

git cloneした radiko.shがあるディレクトリにパッチファイルがあるとして、

$ patch radiko.sh < radiko.sh.patch

とすればOKです。

念のため正しく書き換えられているか確認してください。
ついでに実行権も付与しておきます。

$ chmod +x radiko.sh

追記(追加でインストールするもの)

新しく環境を構築していたらインストールが必要なものがあったので追記します。
スクリプト実行時にこんな感じで色々足りないと言われました。

./radiko.sh: 行 55: swfextract: コマンドが見つかりません
./radiko.sh: 行 132: xmllint: コマンドが見つかりません
./radiko.sh: 行 166: rtmpdump: コマンドが見つかりません
./radiko.sh: 行 151: ffmpeg: コマンドが見つかりません

ということで、まとめてインストールしておきましょう。

sudo apt-get install swftools rtmpdump libxml2-utils ffmpeg

radiko.shで再生する!

では、再生してみましょう!
pオプション(play mode)に、ラジオNIKKEI第2(RN2)を指定します。

$ ./radiko.sh -p RN2

一定時間経過後に自動で停止するようにするためにはtオプションで分単位の数字を指定します。

$ ./radiko.sh -p -t 1 RN2

開始から1分で切れると思います!

チャンネル(放送局コード)を調べる

指定できるチャンネルはたくさんあります。

ラジオNIKKEI第1 RN1
ラジオNIKKEI第2 RN2

放送局一覧をAPIで提供してくださっているサイトがありますので、コチラでご自身の地域で聞けるチャンネルを探してみてください!

なぜ、ラズパイでインターネットラジオを聞くのか?

パソコンのWebブラウザを使えば簡単に再生できるし、radikoのスマホアプリもあるのになぜ?
と思われるかもしれません。

それには理由があります!

マークがラズパイ環境をオススメする理由はコチラ。

  • スマホを占有されたくない
  • PCのシステム音に邪魔されない & 作業の邪魔にならない
  • 流しっぱなしでも気にならない
  • タイマー/アラーム再生ができる
  • 安定のコマンド駆動

カラダの一部、生活の一部に組み込まれているPCとスマホ。
スマホをチェックしながらPCをいじるのは日常茶飯事。なので、作業中のパソコンから操作はできるけれど、極力邪魔にならない方法が必要でした。

朝の目覚めにラジオをかける

cronにコマンドを登録して、モーニングコールとして指定したラジオをかける方法です。

まず、ラジオ再生用のスクリプトを作っておきます。
mplayerを使用する場合は、時間が経てば自動的に切れるようtimeoutコマンドで300秒(5分)を指定しています。

スクリプトは、piのホームにあるbinディレクトリに設置します。

$ cd ~/bin/

スクリプトを編集します。

$ vim morning-radio.sh
#!/bin/bash
# サイマルラジオの場合(mplayerをtimeoutコマンドで終了させます)
timeout 300 mplayer -playlist http://www.simulradio.info/asx/fmpalulun.asx
# radiko.shの場合はコチラ(↑の行をコメントアウトして、↓の先頭#を消して下さい。
# /home/pi/bin/radiko.sh -p -t 5 RN2

実行権を付けます。

$ chmod +x morning-radio.sh

crontab毎朝7時30分に実行するように指定します。

crontab -e を実行して、以下のように編集します。

# m h dom mon dow command # この行の下に記入して保存。
 30 7 * * * /home/pi/bin/morning-radio.sh

これで毎朝7時半にラジオが流れるようになりました!

ラジオを録音してDropBoxにアップロードする

コメントでリクエストがありましたので追加しました。ラズパイで録音したラジオをDropBoxにアップロードすると、スマートフォンを使っていつでも録音したラジオを聞くことができるようになります。

まずは、アップロードできる環境をこちらの記事を参考にして構築しておいて下さい。

録音する

radiko.shには録音機能がありますのでこれを利用します。以下のような書式で指定します。

radiko.sh -d 出力先 -f ファイル名 -t 録音時間(分) -s 00:01:00 CH

例えば、ラジオNIKKEI第2を1分間録音する場合はこのようにします。

radiko.sh -d /dev/shm/ -f RN2 -t 1 -s 00:00:00 RN2

※「-s 00:00:00」の部分は無くてもOK。

ファイルの出力場所は一旦/dev/shm/にしていますが、録音時間が長いとファイルサイズがオーバーする可能性もあるので注意してください。

ちなみに、1分録音した際のファイルサイズは349KBでした。1時間で約20MBといったところ。

なお、詳しい説明は作者の投稿に記載されています。
これでいつでも好きな時間に録音できるようになりました。

DropBoxにアップロードする

先のコマンドを実行すると「/dev/shm/RN2.m4a」というファイルができあがります。これをDropBoxのアプリ下にあるフォルダ(radiko/)にアップロードしましょう。

これだけ!(「dropboxuploader.sh」があるディレクトリで実行して下さいね!)

./dropboxuploader.sh upload /dev/shm/RN2.m4a radiko/

cronで定期的に録音してDropBoxへ。

うまくアップロードできることがわかったら、cronで定期的に実行するようにしてみます。

録音&アップロードのスクリプトを作成します。

vim ~/scripts/radiko-uploader.sh

中身はこんな感じで。

#!/bin/bash
## 各スクリプトを絶対パスで指定
RADIKOAPP='/home/pi/scripts/radiko.sh'
DROPBOXAPP='/home/pi/scripts/dropbox_uploader.sh'
TEMPDIR='/dev/shm'

if [ $# != 2 ]; then
    echo "Useage: $0 [Channel] [rec_time]"
    exit
fi

CH=$1
MIN=$2
FNAME="$(date '+%Y%m%d-%H%M%S')_${CH}"

echo "Rec: Ch.=$1, Time=$2 min., File=${FNAME}"

## 録音
${RADIKOAPP} -d ${TEMPDIR}/ -f ${FNAME} -t ${MIN} -s 00:00:00 ${CH}

## アップロード
${DROPBOXAPP} upload ${TEMPDIR}/${FNAME}.m4a radiko/

## 一時ファイルの削除
### アップロードの成功・失敗判定はしていないので、不要な場合はコメントアウトしてください。
rm ${TEMPDIR}/${FNAME}.m4a

ここまでできたら、cronに登録します。例として、毎日朝10時から1時間、ラジオNIKKEI第2を録音する場合を示します。

0 10 * * * /home/pi/scripts/radiko-uploader.sh RN2 60

これで、毎朝10時から60分間録音してアップロードされるようになりました!

まとめ: ラズパイでインターネットラジオを聞くにはmplayerやradiko.shが使える。

Raspberry Piに安価なスピーカーを接続してインターネットラジオの再生環境を作りました。
apt-getで簡単にinstallできるmplayerや、有志の方が作って下さっているradiko.shを修正して手軽にインターネットラジオを聞ける環境が整いました!

今後はGUIを付けてタッチパネル付きディスプレイで操作したり、JuliusやAlexaを使って操作できるように拡張してみたいと思います(^o^)

それではみなさん、よいラズパイ生活を!

参考サイト

はじまりはここから!

radikoの録音・再生スクリプトでお世話になりました。

スクリプトの修正でお世話になりました!

timeoutコマンドを知りました!