moOde8.0.2 サイマルラジオ
JCBAサイマルラジオは仕様変更によりMPDからは再生不可となったため現在はListenRadioとmoOde Audioのラジオをサイマルラジオから選局可能にしています。
音量の個別設定はラジコ、moodeラジオも設定可にしています。また音量コントロール(pulse.php)下部のロゴは画像ファイルを用意すればmoodeラジオも表示可能にしました。
Pulseaudio環境
# pulse.phpの変更箇所を追記しました。(20220615)
# 前回の記事から間もなくしてchromium-browserがアップデートされました。以来chromium-browserでも正常にPulseaudio再生が可能になっています。(1年ぶりくらいでしょうか)
前回設定のmoOde Audio + Pulseaudio環境ではPulseaudioは外部からの接続のみですがラジコなどもmoOde Audio側で再生できれば使い勝手が良くなります。
moOde Audio自身からクライアントとして再生する際はpulseaudioがスタートしていないと100%で出力することになり十分留意する必要があります。作成したサイマルラジオやラジコプレーヤーからはmpdとpulseaudioを自動で切り替えます。当サイトの環境では何ら問題なく動作していますが設定を完了、動作確認をするまでは十分注意する必要があります。最悪の場合アンプ、スピーカーを破損してしまうことも想定されます。当サイトのアンプは3Wのデジタルアンプ(PAM8403)をメインとして十分満足とまでは行かなくとも納得して運用しています。
dwm + tigervnc-standalone-server
作成したサイマルラジオやラジコプレーヤーはX環境が必要になります。moOde Audioはxorg,chromium-browserがインストールされていますがおそらくディスプレイを接続、chromium-browserからmoOde playerを直接操作することを想定していると思われます。当サイトではmoOdeにvnc-serverを立ち上げPi4からtigervnc-viewerでリモート接続をしています。
moOde8.0.2ではtigervnc-standalone-server(xorg)の挙動が若干変更になったようで最初の記事の通り~/.vnc/xstartupを変更しています。
moOdeのX環境は目的が達成できれば何でもいい(但しlxdeなどの統合デスクトップ環境はダメ)のですがウィンドウマネージャには軽量高速なタイル型ウィンドウマネージャdwmを採用しています。スタック型に慣れているとタイル型は特異に感じるかもしれません。またdwmを使いこなすにはキーバインドなど設定するコンパイル作業は必須と言えそうです。(コンパイル自体は簡単です)最低限の使い方がわかると快適に使えます。moOde側ではmpd以外のプレーヤーソフトはpulseaudioがスタートしている必要があります。したがって基本ターミナルから直接プレーヤーソフトを実行しない。ファイルマネージャーを導入しない、必要なアプリケーションのみをインストールするなどの工夫でスタック型ウィンドウマネージャでもシンプルに構成可能と思います。当サイトで採用しているファイルマネージャー(ranger)は関連付けでpulseaudioをスタートするようにしています。
ListenRadio
CSRA系サイマルラジオ 現在はウェブブラウザからの見栄えや新機能のJCBAサイマルラジオに押され気味の感がありますがmpdからは再生開始が比較的早いのがメリットです。元々ウェブブラウザに依存したくないという動機で作成したサイマルラジオなので使えるうちは利用していこうと思います。
リスラジのサイマルラジオ局リストは整理して順次紹介したいと思います。
~/radio/ListenRadio/csra3 #ListenRadio 関東例 " --- ListenRadio 関東 ---" " --- 茨城県 ---" "FMぱるるん/茨城県水戸市 http://mtist.as.smartstream.ne.jp/30022/livestream/playlist.m3u8" "たかはぎFM/茨城県高萩市 http://mtist.as.smartstream.ne.jp/30075/livestream/playlist.m3u8" "FMひたち/茨城県日立市 http://mtist.as.smartstream.ne.jp/30023/livestream/playlist.m3u8" "FMうれしうれしく放送/茨城県牛久市 http://mtist.as.smartstream.ne.jp/30021/livestream/playlist.m3u8" " --- 群馬県 ---" "まえばしCITYエフエム/群馬県前橋市 http://mtist.as.smartstream.ne.jp/30043/livestream/playlist.m3u8"
moOde Radio
JCBAの代わりにmoodeラジオをアルファベット順に適当に割り当てました。moode playerではロゴイメージから選局するのに対してテキスト形式から選局することになるのでほとんどがランダムに選局する感じになります(こんな聞き方もたまにはいいでしょう)。よく聞くサイトはmoode(1),(2)ボタン、またはFAVORITEボタンにも登録するようにします。サイマルラジオのボタンから選局するメリットはListenRadio同様ラジオ局ごとに音量を設定することが出来ます。moodeラジオもサイマルラジオほどでは無いですがサイト間で音量差があります。再生は設定した音量値で再生を開始します。vol.listに±の値を書いておけばデフォルト音量値+設定値で音量を変更します。
下段のcfg_radioボタンでmoodeのデーターベースからラジオ局を抜き出します。(~/radio/cfg_radio.csv)
cfg_radio.csvが無い場合はリストに登録したurlをmpc addします。ある場合は/var/lib/mpd/music/RADIO/xxx.plsをmpc loadします。結果的には同じラジオ局を再生しますが表示関連が若干違ってきます。サイマルラジオ局もこのファイルを利用するので登録した際は最新の状態にします。
moodeラジオをサイマルラジオの各ボタンに登録するためcfg_radio.csvから一覧を作成
~/radio/moode/cfg_moode_radio cat ~/radio/cfg_radio.csv | awk -F "," '$1 <= 490 { print $3,$2}' | tr -d '"' | sed 's/^/"/;s/$/"/' | sort -f > ~/radio/moode/cfg_radio802.list 実行 $ sh ~/radio/moode/cfg_moode_radio
下記形式のファイル一覧ができるので各ボタンに適当に割り振り(~/radio/moode/cfg_radio802.list)
~/radio/moode/moode2 #moOde audio Radio List例 " --- moOde audio Radio List ---" " --- A ---" "A.M. Ambient http://radio.stereoscenic.com/ama-h" "ABC Country http://live-radio01.mediahubaustralia.com/CTRW/mp3/" "ABC Jazz http://live-radio01.mediahubaustralia.com/JAZW/mp3/" "Absolut Hot https://edge68.live-sm.absolutradio.de/absolut-hot/stream/aacp?aggregator=smk-m3u-aac" "Absolut music XL https://absolut-musicxl.live-sm.absolutradio.de/absolut-musicxl/stream/mp3" "Absolut Relax https://edge56.live-sm.absolutradio.de/absolut-relax/stream/mp3" "Ambient Sleeping Pill http://radio.stereoscenic.com/asp-h" "Ancient FM - Mediaeval and Renaissance Music https://mediaserv73.live-streams.nl:18058/stream" "ArtSound FM 92.7 http://119.15.96.188/stream2.mp3"
らじる★らじる
ローカル番組、特別番組を除いて共通なのでmoode playerに登録する際は地元の局だけでOKと思います。聴取自体はすべて可
~/radio/NHK/NHK.list " --- らじる★らじる ---" " --- 札幌 ---" "NHK R1 札幌 https://radio-stream.nhk.jp/hls/live/2023545/nhkradiruikr1/master48k.m3u8" "NHK FM 札幌 https://radio-stream.nhk.jp/hls/live/2023546/nhkradiruikfm/master48k.m3u8" " --- 仙台 ---" "NHK R1 仙台 https://radio-stream.nhk.jp/hls/live/2023543/nhkradiruhkr1/master48k.m3u8" "NHK FM 仙台 https://radio-stream.nhk.jp/hls/live/2023544/nhkradiruhkfm/master48k.m3u8" " --- 東京 ---" "NHK R1 東京 https://radio-stream.nhk.jp/hls/live/2023229/nhkradiruakr1/master48k.m3u8" "NHK FM 東京 https://radio-stream.nhk.jp/hls/live/2023507/nhkradiruakfm/master48k.m3u8" " --- 名古屋 ---" "NHK R1 名古屋 https://radio-stream.nhk.jp/hls/live/2023510/nhkradiruckr1/master48k.m3u8" "NHK FM 名古屋 https://radio-stream.nhk.jp/hls/live/2023511/nhkradiruckfm/master48k.m3u8" " --- 大阪 ---" "NHK R1 大阪 https://radio-stream.nhk.jp/hls/live/2023508/nhkradirubkr1/master48k.m3u8" "NHK FM 大阪 https://radio-stream.nhk.jp/hls/live/2023509/nhkradirubkfm/master48k.m3u8" " --- 広島 ---" "NHK R1 広島 https://radio-stream.nhk.jp/hls/live/2023512/nhkradirufkr1/master48k.m3u8" "NHK FM 広島 https://radio-stream.nhk.jp/hls/live/2023513/nhkradirufkfm/master48k.m3u8" " --- 松山 ---" "NHK R1 松山 https://radio-stream.nhk.jp/hls/live/2023547/nhkradiruzkr1/master48k.m3u8" "NHK FM 松山 https://radio-stream.nhk.jp/hls/live/2023548/nhkradiruzkfm/master48k.m3u8" " --- 福岡 ---" "NHK R1 福岡 https://radio-stream.nhk.jp/hls/live/2023541/nhkradirulkr1/master48k.m3u8" "NHK FM 福岡 https://radio-stream.nhk.jp/hls/live/2023542/nhkradirulkfm/master48k.m3u8" " --- 全国 ---" "NHK R2 全国 https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master48k.m3u8"
radiko
streamlinkを利用してffplayからpulseaudio再生をしています。画像ファイルを別途用意しておけばpulse.phpから表示できますがリアルタイムには反映しません。pulse.phpでは60秒の再読込時間を設定しているので1分以内に自動で切り替わります。(サイマルラジオも同様)もしくはpulse.phpのロゴ画像をクリック
ラジコも音量設定可能にしています。個別の音量設定はsimul_vol.pyで実行しています。
~/radio/RADIKO/radiko.list " --- radiko(ラジコ) ---" " --- Bayfm78 ---" "radiko/Bayfm78 BAYFM78" " --- FM yokohama ---" "radiko/FM yokohama 84.7 YFM" " --- Inter FM 897 ---" "radiko/Inter FM 897 INT" " --- J-WAVE ---" "radiko/J-WAVE FMJ" " --- NACK5 ---" "radiko/NACK5 NACK5" " --- NIKKEI ---" "radiko/ラジオNIKKEI第1 RN1" "radiko/Rani Music RN2" " --- TOKYO FM ---" "radiko/TOKYO FM FMT" " --- TBSラジオ ---" "radiko/TBSラジオ TBS" " --- ニッポン放送 ---" "radiko/ニッポン放送 LFR" " --- ラジオ日本 ---" "radiko/ラジオ日本 JORF" " --- 文化放送 ---" "radiko/文化放送 QRR" " --- らじる★らじる ---" "radiko/NHKラジオ第1 JOAK" "radiko/NHK-FM JOAK-FM" " --- 放送大学 ---" "radiko/放送大学 HOUSOU-DAIGAKU"
streamlink radiko player
上記のラジコと同様ですが専用のUIでクイックに選局が可能です。無料で聴取できる局はエリア(プロバイダー)によって違います。サイマルラジオのラベルタイトルに表示させるためにはON-AIRボタンを押します。streamlinkはパッケージから導入しています。
# apt install streamlink
pulseaudio user設定 (moode audio user)
moodeにはuser pi(moodeaudio)がいます。user piから実行するとしてユーザーのclient.conf(default-server)は自マシン(127.0.0.1)に向けます。
~/.config/pulse/client.conf autospawn = no daemon-binary = /bin/true default-server = 127.0.0.1
プログラム
$ chmod 755 ~/bin/*
$ tree ~/bin /home/pi/bin ├── date.sh ├── killall.sh ├── radiko-streamlink.py ├── radio_menu.py ├── simul.py ├── simul_vol.py
date.sh dwm時計表示(~/.vnc/xstartupから起動)
#!/bin/sh while true; do xsetroot -name "$(date +" %R")" sleep 10 done
killall.sh プレーヤーアプリ停止(実質使用しているアプリはmpv,ffplayですがチェック目的でmplayerもまだ使用する可能性があるので含めています。オプション(-q)でメッセージ抑制)play開始時は多重起動防止のため全て停止後再生を開始
#!/bin/sh killall -q mpv killall -q mplayer killall -q ffplay mpc pause sleep 0.1 mpc volume 10 #default vol mpc clear echo "1" > /tmp/test_id sleep 0.4
radio menu
スピーカーボタンはsimul_vol.pyを起動して個別にセットしたボリュームを適用(vol.list)
radio_menu.py.20220608
simul mms radio
CSRAサーバー配信と思いますがmmsプロトコルのラジオサイトがあります。moOde audioのmpdはmsプロトコルに対応していないのでmpvでpulseaudio再生をしています。またYouTubeの再生に対応しています。こちらはまた別の機会に紹介したいと思います。
ラジオデータ ファイル構成
$ tree ~/radio /home/pi/radio ├── FAVORITE │ ├── favorite1 │ ├── favorite2 │ ├── favorite3 │ └── favorite4 ├── ListenRadio │ ├── csra1 │ ├── csra2 │ ├── csra3 │ ├── csra4 │ ├── csra5 │ ├── csra6 │ ├── csra7 │ └── csra8 ├── NHK │ └── NHK.list ├── RADIKO │ └── radiko.list ├── cfg_moode_vol ├── cfg_radio.csv ├── moode │ ├── cfg_moode_radio │ ├── cfg_radio802.list │ ├── moode1 │ ├── moode2 │ ├── moode3 │ ├── moode4 │ ├── moode5 │ ├── moode6 │ ├── moode7 │ ├── moode8 │ ├── moode_f1 │ └── moode_f2 └── vol.list
simul.py サイマルラジオ本体
simul.py.20220608
日本語はダウンロードすると正常に表示できると思います。
simul_vol.py サイマルラジオ音量セットツール
simul_vol.py.20220608
vol.listに記載した値をセットします。デフォルト値が10ならば+5でボリューム値は15
記載の仕方は各項目によって多少違います。(下記例参照)またこのリストはlabelタイトル(ON AIR)にも使用しています。
ListenRadioはリスラジIDを検索しているのである程度自由に記載できます。
moodeラジオはcfg_radio.csvから音量値+0としてvol.listの末尾に追記(231局802)実行は1回のみにしておきます。
~/radio/cfg_moode_vol cat ~/radio/cfg_radio.csv | awk -F "," '$1 <= 490 { print $3}' | tr -d '"' | sed 's/$/\t+0/' | sort -f >> ~/radio/vol.list 実行 $ sh ~/radio/cfg_moode_vol
~/radio/vol.list
#-- radiko -- radiko/BAYFM78 --- Bayfm78 --- +2 radiko/YFM --- FM yokohama --- +2 radiko/INT --- Inter FM 897 --- +5 #-- らじる★らじる -- 2023545 +5 NHK R1 札幌 2023546 +5 NHK FM 札幌 2023229 +10 NHK R1 東京 2023507 +10 NHK FM 東京 #-- ListenRadio -- 30001 +5 えふえむ・エヌ・ワン/石川県野々市市 30002 +5 フラワーラジオ/埼玉県鴻巣市 #-- moOde radio -- 1.FM - Blues Radio +0 2BOB Radio 104.7 FM +10 4ZZZ FM 102.1 - Alternative +0 6forty Radio +0 A.M. Ambient +0 ABC Country +10 ABC Jazz +15
音量セット
vol.listにラジオ局を登録、下段のVol_Editボタンをクリックすると再生中のラジオ局にカーソルが移動します。(xterm + vim)サイマルラジオ局用に作成したのでmoodeラジオでは必ずしも上手く行くとは限りません。(基本外れる)
pulse.php ロゴ画像
再生開始時pythonから/var/www/html/imgにロゴ画像の有無をtestコマンド(linux)でチェック/tmp以下に保存しています。
ナナコライブリーエフエム.jpg 0(有り) 1(無し)
$ cat /tmp/moode_id ナナコライブリーエフエム $ cat /tmp/test_id 0
pulse.phpでは0(有り)で画像表示、1(無し)では今まで通りmoode.jpgを表示。画像を作成する際はimg_fileボタンクリックでファイル名表示(表示名称.jpg(300×60)で作成 qで終了)/var/www/html/imgにコピー。コピーは空白が含まれていることが多いのでシングルコーテーションでファイル名囲む
moOde audio + pulse.php
moOde audio自身(内部)から実行するpulseaudioは動作が確認できるまでは十分注意する必要があります。当サイトの環境では作成したアプリケーションから実行するmpd,pulseaudio(ラジコ)再生は問題無く自動で切り替えています。内部から実行するラジオは音量セット、ロゴ画像表示可と更に使いやすくなりました。
/var/www/html/pulse.php
「追記」pulse.phpの変更箇所が未記載でした。(165行目附近)
// radiko Img logo $station = shell_exec("ps ax | grep radiko.jp | grep -v grep | awk '{print $(NF-1)}' | awk 'NR==1' | cut -c 26-"); if ($station == NULL) { $station = shell_exec("ps ax | grep -v grep | grep mms:// | awk -F '/' '{print $(NF)}'"); } if ($pulse == TRUE) { if ($station == NULL) { sleep(0.1); $station = ('pulse'); } }else{ sleep(0.1); $station = shell_exec("cat /tmp/moode_id"); $test = shell_exec("cat /tmp/test_id"); if ($test != 0) { $station = ('moode'); } }