rfriendsでラジオ録音

ラジコ、らじるらじる、タイムフリーのラジオ番組を録音

rfriendsの状況

f:id:rfriends:20170512091958j:plain  rfriends (Windows, Linux, Raspberry Pi OS,OSX,termux対応)

rfriendsというラジコやらじるらじるを録音するソフトを作っています。タイムフリー、エリアフリー、聞き逃し、ゴガクにも対応。


 このブログでは詳細な技術情報を発信します。

WordPress ダウンロードマニュアルはWPにまとめました

上記が重いときはこちら、ダウンロード(非常用)
twitter リリース情報、TIPS等を発信します
掲示板 質問、要望などはこちらにおねがいします

rfriends を応援してください。


投げ銭(PayPayID : rfriends)

LXDで「rfriendsでラジオ録音」 その3

LXDで作成したコンテナを複製する手順を書きます。

1.前提条件

LXDで「rfriendsでラジオ録音」 その1

https://rfriends.hatenablog.com/entry/2022/05/26/131104

LXDで「rfriendsでラジオ録音」 その2

https://rfriends.hatenablog.com/entry/2022/05/27/044907

により以下のことが済んでいるものとします。

 

・LXDをインストール

・rfriendsコンテナを作成

・rfriends2をインストール

・proxyデバイスの設定済

・外部よりsshが可能

 

以下はrootで操作しています。

# lxc list
rfriends | RUNNING | XXX.XXX.XXX.XXX (eth0) | 省略 (eth0) | CONTAINER | 0  
# lxc config device show rfriends
p50022:
 connect: tcp:XXX.XXX.XXX.XXX:22
 listen: tcp:0.0.0.0:50022
 type: proxy

2.rfriendsコンテナを複製

# lxc copy rfriends rfriends_copy
# lxc list
rfriends        | RUNNING | XXX.XXX.XXX.XXX (eth0) | 省略 (eth0) | CONTAINER | 0
rfriends_copy | STOPPED |                        |             | CONTAINER | 0

3.proxyデバイスの設定

1)rfriendsのproxy設定もcopyされているのを確認

# lxc config device show rfriends_copy
p50022:
 connect: tcp:XXX.XXX.XXX.XXX:22
 listen: tcp:0.0.0.0:50022
 type: proxy

2)rfriends_copyのproxy設定を削除

ポート番号が重複することになるので削除

# lxc config device remove rfriends_copy p50022
Device p50022 removed from rfriends_copy

3)rfriends_copyコンテナをスタートさせる

# lxc start rfriends_copy

IPアドレスが振られているのを確認。

# lxc list
rfriends      | RUNNING | XXX.XXX.XXX.XXX (eth0) | 省略 (eth0) | CONTAINER | 0  
rfriends_copy | RUNNING | zzz.zzz.zzz.zzz (eth0) |             | CONTAINER | 0  

4)proxyデバイスを追加

ポートが使われていないか調べる。使われていない場合、表示なし。

$ lsof -i:50122

proxyデバイスを追加

$ sudo lxc config device add rfriends_copy p500122 \
  proxy listen=tcp:0.0.0.0:50122 connect=tcp:zzz.zzz.zzz.zzz:22

Device p500122 added to rfriends_copy

4.外部からrfriends_copyコンテナにssh

ssh radio@yyy.yyy.yyy.yyy:50122

yyy.yyy.yyy.yyyはホストのIPアドレス アクセスできない場合、firewall等でポートが閉じられていないか調べる。 データの転送は、teraterm(scp),Rlogin(sftp)が便利。

5.その他

 以上でrfriendsコンテナと同じ環境のrfriends_copyコンテナが作成できました。  同様の操作で、PCの能力が許す限りいくらでも複製できます。 rfriendsコンテナとrfriends_copyコンテナはポート番号の違いでアクセスできます。

ssh radio@yyy.yyy.yyy.yyy:50022 (rfriends)
ssh radio@yyy.yyy.yyy.yyy:50122 (rfriends_copy)

 繰り返しますが、説明のためにセキュリティについては考慮していません。 実際の場面では鍵を作成してアクセスすべきです。 copyではなく、overlayでもできますが、若干面倒になります。

 

以上

LXDで「rfriendsでラジオ録音」 その2

 LXDでrfriendsの環境を作ってみました。

今回は、作成したコンテナに外部(home)からsshでアクセスできるようにします。

[home] ----- (internet) ----- [ホスト:50022] - [コンテナ1:22]

[home] ----- (internet) ----- [ホスト:50122] - [コンテナ2:22]

1.コンテナにssh serverのインストール

コンテナ側で以下のコマンドを実行

$ sudo apt install openssh-sever
$ exit

ホスト側で以下のコマンドを実行

$ sudo lxc list

rfriendsコンテナのIPV4アドレスが表示される。 xxx.xxx.xxx.xxx.xxxはrfriendsコンテナのIPアドレスとする。

ssh radio@xxx.xxx.xxx.xxx

でrfriendsコンテナにユーザradioでログインできるのを確認。

$ exit

2.コンテナにproxyデバイスを追加

外部からrfriendsコンテナにSSHできるようにする。

ホストのport:50022 -> rfriendsコンテナのport:22

xxx.xxx.xxx.xxx.xxxはrfriendsコンテナのIPアドレス

p50022の名前は任意。

 

ポートが使われていないか調べる。使われていない場合、表示なし。

$ lsof -i:50022

proxyデバイスを追加

$ sudo lxc config device add rfriends p50022 \
  proxy listen=tcp:0.0.0.0:50022 connect=tcp:xxx.xxx.xxx.xxx.xxx:22

設定を削除したいときは

$ sudo lxc config device remove rfriends p50022

3.外部からrfriendsコンテナにssh

ssh radio@yyy.yyy.yyy.yyy:50022

yyy.yyy.yyy.yyyはホストのIPアドレス

アクセスできない場合、firewall等でポートが閉じられていないか調べる。

4.その他

 以上で外部からコンテナにSSHできるようになります。

 説明のためにセキュリティについては考慮していません。 実際の場面では鍵を作成してアクセスすべきです。

 今回の件で、例えばVPS上に複数のコンテナを作成して運用できることがわかりました。

 

以上

LXDで「rfriendsでラジオ録音」その1

 LXDでrfriendsの環境を作ってみました。

 LXDに関しては1日足らずのにわかですので、突っ込みどころ満載だと思います。

1.ホスト側の設定

 ホストはubuntu/20.04で行いました。rootで実行。

 注意:ホストが22.04だとipv4が振られない(調査中)

1)LXDインストール

lxd導入済みの場合は飛ばしてください。

# snap install lxd

2)初期化とコンテナ作成

今回は、基本的に省略時設定で進めます。すべてリターンでOK.
初期化して、rfriendsというコンテナを作成します。

# lxd init 
# lxc launch images:ubuntu/20.04 rfriends

2.ユーザradioの作成

1)コンテナの起動

ホスト側で以下のコマンドを実行

# lxc exec rfriends -- /bin/bash

2)ユーザradioの作成

 コンテナ側で以下のコマンドを実行

# adduser radio
# gpasswd -a radio sudo
# exit

3.rfriendsのインストール

1)ユーザradioでログイン

 ホスト側で以下のコマンドを実行

# lxc exec rfriends -- su --login radio

2)rfriendsのインストール

コンテナ側で以下のコマンドを実行

$ sudo apt install wget
$ cd ~/
$ rm ./rfriends2_ubuntu.sh
$ wget http://rfriends.s1009.xrea.com/files/rfriends2_ubuntu.sh
$ sh rfriends2_ubuntu.sh

3)rfriendsの起動

コンテナ側で以下のコマンドを実行

$ cd ~/rfriends2
$ sh rfriends2.sh

4.その他

以上で、rfriendsが使えるようになります。 簡単ですね。 ただし、これを外部から使えるようにするには ネットワーク設定が必要です。

その2に続きます。

 

以上

dockerで「rfriendsでラジオ録音」

 今更ですが、dockerでrfriendsの環境を作ってみました。

 本来、rfriendsはdocker向きではありません。当然ですが、終了すると設定や録音データはすべて消えます。docker環境がある人でrfriendsがどんなものか試してみるにはいいかも。おまけで、ホスト共有を使ってデータが消えないようにする設定も記述しておきます。

 dockerに関しては1日足らずのにわかですので、突っ込みどころ満載だと思います。

1.docker環境

 docker環境に関しては構築済みを前提に話を進めます。 以下はrootで行って下さい。

1)ユーザradio作成

・ユーザradioを作成しdockerグループに所属させる。

# adduser radio

・ユーザradioをsudoユーザにする。

# echo "radio ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

・dockerグループを確認

# cat /etc/group

・ない場合、dockerグループを作成 

# groupadd docker

・グループに所属させる

# usermod -aG docker radio

・設定の確認

# id radio
uid=1000(radio) gid=1000(radio) groups=1000(radio),998(docker)

2)再起動&ログイン

# reboot

再起動後、radio/radioでログイン

2.実行

 Dockerイメージの作成から実行まで。

1)Dockerfile

Dockerfileをダウンロードする。

# cd ~/ 
# wget http://rfriends.s1009.xrea.com/files/Dockerfile.zip
# unzip Dockerfile.zip

作成したユーザradioの

ARG UID=1000
ARG GID=1000

が違っていたら修正してください。

2)Dockerイメージの作成

 実行には時間がかかります。

$ docker build -t rfriends2:1.0  .
Successfully built xxxxxxxxxxxx
Successfully tagged rfriends2:1.0

と表示されたら成功です。

3)Dockerイメージ一覧を確認

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE 
rfriends2 1.0 fbb3af581c88 10 minutes ago 812MB

4)Dockerコンテナの起動

ホスト側で

$ docker run -it rfriends2:1.0

5)rfriendsの実行

コンテナ側で

$ sudo cron &
$ sudo atd &
$ cd rfriends2
$ sh rfriends2.sh

6)終了

$ exit

設定したデータや録音データはすべて消えます。

3.データ保存

 ホスト共有という機能を使ってデータが消えないようにします。

1)rfriendsを展開

 ホスト側のディレクトリを参照するので 共有ディレクトリにrfriendsを展開します。 これは一回のみ実行。

ホスト側で

$ cd ~/ 
$ mkdir rfriends2
$ wget http://rfriends.s1009.xrea.com/files/rfriends2_latest_script.zip
$ unzip rfriends2_latest_script.zip

2)rfriendsを実行

ホスト側で

$ docker run -v /home/radio/rfriends2:/home/radio/rfriends2 -it rfriends2:1.0

 

コンテナ側で

$ sudo cron &
$ sudo atd &
$ cd rfriends2
$ sh rfriends2.sh

 

 ホスト共有をすることにより終了しても、データがホスト側のディレクトリに残ります。 例えば、ホストの/home/radio/rfriends2/usr/radikoradikoの録音データがあります。

4.その他

 Dockerは同一環境の再現という意味ではとても有用だと感じました。そういう用途のものなので当然ですが。

 

以上

rfriends2 2.9.2-b1(開発版)から2.9.2-b10(開発版)の修正内容

rfriends2 2.9.2-b1(開発版)から2.9.2-b10(開発版)の修正内容をまとめました。

1.バグ修正

1) [8-7][9-8]バックアップ/リストア/初期化のバグを修正しました。

2) おうちで英語学習が2022 年度に切り替わっていなかったのを修正しました。

2.機能追加

1) らじる聞き逃しの仕様変更(5/13)に対応しました。
    http_seekable 0 オプションを追加

2) おうちで英語学習の年度を選択可としました。
  4月-6月の間は前年度が設定できます。
  [9-1]パラメータ設定(radiru_gogaku_ouchi_nendo)

3) updateのメニューに新たに”旧安定版”、”旧開発版を追加しました。

4) [4-1]らじるの予約一覧で、CH表示を地方がわかるように変更。例:r1_sa (札幌)。

 

rfriendsとRaspberry Piとbluetoothスピーカ

 bluetoothスピーカはとても便利なんですが、スピーカにより再接続がうまくいかないものがあります。

ダイソーで売っているスピーカを例にあげると
SR9910はOKですが、

SR1323はうまくいきません。

ネットで調べると、どうやらRaspberry Pi側というかbluetoothのドライバに原因があるようです。スマホだと問題なく再接続できますから。

 

以下、SR1323を例として対策を行います。
前提として、以下のようにSR1323とはペアリング、トラストが済んでいるものとします。
やり方については、bluetoothctlで検索してください。

$ sudo bluetoothctl
Agent registered
[bluetooth]# paired-devices
Device XX:XX:XX:XX:XX:XX SR1323
[SR1323]# 

このデバイスアドレス(XX:XX:XX:XX:XX:XX)をメモしてください。

1)対策1

・SR1323の電源をOFF/ONする。

ピンポンという音が鳴ってRaspberry Piに接続されますが、
数秒でピロロンという音が鳴って接続が切れます。
(SR9910はこのピロロンという音が鳴らずに接続が維持されます。)

Raspberry Piより以下のコマンドを実行する。

$ sudo bluetoothctl
[bluetooth]# connect XX:XX:XX:XX:XX:XX
Attempting to connect to XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
Connection successful
[CHG] Device XX:XX:XX:XX:XX:XX ServicesResolved: yes
# quit

 

rfriendsをインストールしている方は、対策2,3のほうが楽です。

2)対策2

・SR1323の電源をOFF/ONする。

Raspberry Piより以下のコマンドを実行する。(2.9.2-b1以降)

$ cd ~/rfriends2
$ sh btutl.sh con
bluetooth utility ver. 0.01
Device XX:XX:XX:XX:XX:XX SR1323
接続したい機器の電源をONにしてください
接続しますか(y/N) ? y
Attempting to connect to XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
Connection successful

Connection successful と表示されたら成功です

3)対策3

・rfriendsの[9-1]パラメータ設定を行う。(2.9.2-b1以降)

bd_name = "SR1323"
bd_address = "XX:XX:XX:XX:XX:XX"

以降、[2-9]番組聴取で再接続を促される。

 SR1323 に再接続する場合は電源をONにしてください。
 再接続しますか。(y/N)

 

以上

 

rfriends2 2.9.0(安定版)からrfriends2 2.9.1-b27(開発版)の修正内容

 rfriends2 2.9.0(安定版)からrfriends2 2.9.1-b27(開発版)の修正内容をまとめました。

1.バグ修正

1) hrtimeがない場合はmicrotimeを使用するように変更しました。
(PHP7.3.0未満対策)

2) user_process.batファイルの文字コードをUTF -> SJIS(CRLF)に変更。
windowsでユーザプロセスを利用している方のみ)

3) premium radikoNHK-FMの録音ができないバグを修正
radikoでのNHK-FMは常にプレミアムではなくノーマル扱いのため

4) podcastで証明書が古いためエラーになる件に対処。

5) podcastで以下のエラーが出るサイトに対応。
error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small

6) 古い番組予約データの削除をファイル日付から番組日付に変更。
 予約日数を7などに変更していると、例えば1週間前に予約した番組が実行前に削除されてしまうバグに対応。

7) [1-1]録音中止。
中止してもリトライを繰り返していた不具合を修正。

8) updateチェック
検出ミスを修正。

9) 番組名にタブがあって誤動作する件に対処

10) macosユーザのみ
  macos Catalinaでは動作確認にしましたが、
  BigSur,Montereyでは行っていません。

php,ffmpeg,wget,AtomicParsley他はhomebrewでのインストールを前提に固定。
  固定した理由はLaunch対策。
  インストール先はbrew --prefix + bin で取得。
  通常/usr/local/bin/

・予約録音、add tagerrに対処。
・coverartエラーに対処。
・デイリー処理起動のバグ修正。
 [9-3]デイリー処理使用中の方は一旦取消後、登録。

2.機能追加・変更

1) configのバージョンを08に変更。

2) user_processに加えuser_process2を追加。

; user_process  radiko,radiruの録音終了時に起動
; パラメータはログファイル
; user_process2 すべての録音終了時に起動
; パラメータは録音ファイル名
1つにしなかった理由は、
- 既存ユーザ保護
- process1のタイミングでは、最終録音ファイル名が取得できない
- process2のタイミングでは、ログが取得できない
なお、podcastはuser_processの対象外。
transfer処理がONの場合はuser_process2は起動しません。

3) podcast関連

・デイリー処理を最新1週間分から最新1週間分、または最新エピソードに変更。
wgetでエラーになったらffmpegを使用。

・プリセットのチェックを見直し

・ダメ文字、utf8-mac関連の修正等。
  utf8-macとは、macでは「が」などを「か」+濁点で表します。
  従来から対応していましたが、一部見直しを行いました。

・[9-1]にパラメータ追加
; 例:
; podcast_days = 8
; podcast_cnt = 1
; 8日前までのものをダウンロードする。
; ただし最低1個はダウンロードする

4) らじるらじる、ゴガク
2022年度に向け微修正。
[6-2-1]おうちで英語学習の表示順を降順に変更。
ついでに、2020年度分もダウンロード可能に。

5) ジャンル関連
関連個所、[2-5][3-3][4-5][9-4]
vod,gogakuはジャンル情報なし。
ほかにもジャンル情報がないものあり。

らじるは、「ARIB STD-B10 デジタル放送に使用する番組配列情報標準規格」
に準拠していますが、radikoの基準はわかりません。一部似てはいるんですが。

・ログにジャンル表示を追加。
 FMT_山崎怜奈の誰かに話したかったこと。_20220324_1300_1455
  (P007,トーク C008,女性アイドル)

・[9-4]にジャンル一覧表示追加
・[2-1][4-1]予約一覧
番組を選択すると、アーティスト、ヒットしたキーワードを表示。(一つ選択した場合のみ)

6) [8-5]NHK r2の重複番組情報更新。

7) windows版のトップにstandby表示追加。

8) 重複番組。
ログ出力メッセージを一部変更。

9) wgetのパラメータ、inet4_onlyのon/offスイッチを追加。
wget_inet4_only   = 1 or 0
[9-1-2]パラメータ編集で設定可。
ネットワーク接続がうまくいかない場合のみ設定してください。

10) [10-7] ネットワークテスト
nslookupを追加。DNSサーバを表示します。

 Raspiosにはnslookupが入ってないので事前に
 $ sudo apt install dnsutils
 が必要です。

 1. ラジコとの接続状況(ping)
 2. ラジコとのwgetテスト
 3. ラジコとの認証テスト(簡易)
 4. ラジコとの認証テスト(詳細)
 
 5. らじるとの接続状況(ping)
 6. らじるとのwgetテスト

11) インストールシェルの追加
・Rocky Linux 8 (事実上、CentOSの後継)

wget http://rfriends.s1009.xrea.com/files/rfriends2_rocky.sh
sh rfriends2_rocky.sh

CentOS Stream8 
  Rockyと同じスクリプトです。

wget http://rfriends.s1009.xrea.com/files/rfriends2_stream.sh
sh rfriends2_stream.sh

12) デバッグ機能 [9-4]
日付指定でラジコ・らじるの番組表をログに出力する機能を追加
ユーザにはほとんど不要の機能です。

13) [5-3]らじる聞き逃しの検索範囲を全範囲に変更
2週間以上前の番組があるため

14) [9-2]タグに%12を追加。
プレイリスト等の楽曲情報(らじるのみ)


15) updateチェック
使用中の版(安定版、開発版)のチェックに変更。
使用していない側の版のupdateは検出できません。

 10. rfriends2について [.]

- 安定版に一致(無表示)
- 開発版に一致([.])
- update([!])

16) PHP8,8.1対応
非推奨(deprecated)な使い方をしているとエラーメッセージが出ます。

Deprecate implicit non-integer-compatible float to int conversions
floatからintへの暗黙の型変換にE_DEPRECATEDが発生

17) ffmpeg 5.0対応

・録音実行時、ログに使用しているffmpegのversionを表示。
 ffmpeg version 5.0-static ...

Linux,RaspberryPi
ffmpeg-release-amd64-static.tar.xz
ffmpeg-release-armhf-static.tar.xz
https://johnvansickle.com/ffmpeg/releases/

windows
http://ffmpeg-release-essentials.zip
https://gyan.dev/ffmpeg/builds/

macos
ffmpeg-5.0.7z
ffprobe-5.0.7z
ffplay-5.0.7z
https://evermeet.cx/ffmpeg/

18) Termux対応
・アプリ確認を'which'から'command -v'に変更。
 'which'は非推奨のため。

19) premium契約の方のみ
 ログのエリア、キーワード表示をわかりやすく(?)変更しました。
・ Rfriends2 2.9.0.1e [22/03/01(Tue) 01:23:45]
  premium_x  main: JP13  home: JP27
  radiko: JP13,東京都  radiru: tokyo

premium mode 
=1の時、premium
=2の時、premium_x
 mainはpremium_main_station,homeは居住地

3.その他

1) macosユーザのみ
pidofが見つからないというメッセージが表示される方はターミナルで、
brew install pidof 
を実行してください。

2) [8-3-3]エリアフリー
 
:premium_main_station
#JP13
コメントアウトすると、ホームエリア(居住地)に自動設定。

3) ubuntu 20.04 PHP7.4->8.1
 
 $ sudo add-apt-repository ppa:ondrej/php
 $ sudo apt update
 $ sudo apt upgrade

 

以上