Raspberry PiでNHKラジオを自動録音する

これはとっくにここにポストしていた気がするけど、実はまだだったのですね。
ここに来るまでけっこう苦労したので載せておきます。

基本的にはriocamposさんのこのページを参考にしました。違いは http://www.nhk.or.jp/radio/config/config_web.xml を毎回参照して、akamaihd.net のURLが変更されていても対応することです。

ではRubyスクリプト。読めばわかるので説明は略。

#!/usr/bin/env ruby
# Usage: record_nhk.rb [options] area station duration outdir

require ‘optparse’
require “rexml/document”
require “open-uri”

URL = “http://www.nhk.or.jp/radio/config/config_web.xml”

# MYAREA is one of the followings
# sapporo  
# sendai  
# tokyo  
# nagoya  
# osaka  
# hiroshima  
# matsuyama  
# fukuoka  

params = ARGV.getopts(nil, ‘title:’, ‘artist:’, ‘album:’)

myarea = ARGV[0]
station = ARGV[1]
duration = ARGV[2]
outdir = ARGV[3]

xml = open(URL).read
doc = REXML::Document.new(xml)

radiru_config =  nil
doc.each do |e|
 if e.kind_of?(REXML::Element) and e.name == “radiru_config”
   radiru_config = e
   break
 end
end

stream_url= radiru_config.elements[‘stream_url’]

area = nil
stream_url.each do |data|
 if data.kind_of?(REXML::Element)
   if data.elements[‘area’].text == myarea
     area = data
     break
   end
 end
end

case station
when ‘r1’
 surl = area.elements[‘r1hls’].text
when ‘r2’
 surl = area.elements[‘r2hls’].text
when ‘fm’
 surl = area.elements[‘fmhls’].text
else
 surl = area.elements[‘fmhls’].text
end

now = Time.now.to_s.sub(/(\d\d\d\d-\d\d-\d\d)\s+(\d\d:\d\d):\d\d.*$/){ $1 + ‘_’ + $2.sub(/
:/, ‘-‘) }

meta = “”

if params[‘title’]
 meta += ” -metadata title=\”” + params[‘title’] + “\””
end

if params[‘artist’]
 meta += ” -metadata artist=\”” + params[‘artist’] + “\””
end

if params[‘album’]
 meta += ” -metadata album=\”” + params[‘album’] + “\””
end

ffmpeg_cmd = sprintf(“ffmpeg -t %s -i %s %s -write_xing 0 %s/%s.mp3”, duration, surl, meta
, outdir, now)

system(ffmpeg_cmd)

使いかたはcronでこんな感じです。趣味がわかってしまう…
sleep 30は遅延を考慮してですが、もっと多いほうがいいかも。

05 16 * * 0     sleep 30;/home/pi/NHK/record_nhk.rb –artist “DJ日本史” –album “トーク” tokyo r1 00:50:00 /disk/Music/Radio/NHK-R1/DJ  
30 19 * * 1-5   sleep 30;/home/pi/NHK/record_nhk.rb –artist “ベスト・オブ・クラシック” –album “クラシック” tokyo fm 01:40:00 /disk/Music/Radio/NHK-FM/Classic
15 21 * * 1-5   sleep 30;/home/pi/NHK/record_nhk.rb –artist “青春アドベンチャー” –album “ラジオドラマ” tokyo fm 00:15:00 /disk/Music/Radio/NHK-FM/Adventure
00 22 * * 6     sleep 30;/home/pi/NHK/record_nhk.rb –artist “FMシアター” –album “ラジオドラマ” tokyo fm 01:00:00 /disk/Music/Radio/NHK-FM/Theatre
05 10 * * 6     sleep 30;/home/pi/NHK/record_nhk.rb –artist “真打ち競演” –album “落語” tokyo r1 00:50:00 /disk/Music/Radio/NHK-R1/Sin-uti
20 19 * * 0     sleep 30;/home/pi/NHK/record_nhk.rb –artist “新日曜名作座” –album “ラジオドラマ” tokyo r1 00:30:00 /disk/Music/Radio/NHK-R1/Meisaku
30 10 * * 1-3   sleep 30;/home/pi/NHK/record_nhk.rb –artist “遠山顕の英会話楽習” –album “英語” tokyo r2 00:15:00 /disk/Music/Radio/NHK-R2/Rakushuu

スマホとラズパイとWiFiルータ

また間があいてしまいました。

ADSLを解約してから、モバイルルータを家の中でも使っていたのだけど、やはり遅いし、どうにも使いにくい。あきらめて光にしたけど、今は混んでる時期なのか、工事は随分先に。そこでこれまでの家の中のWiFi環境をそのままに、ADSLモデムのかわりにスマホをつなぐことにします。これで他の機器は何も変更なしでいいので。構成は

スマホ—-(USB接続)—-Raspberry Pi3—-(Ethernet接続)—-Buffalo WiFiルータ

という感じです。もちろんスマホでUSBテザリングします。

すなおにスマホがusb0として認識されていればいいのですが、されてない場合は以下をやってみましょう。

$ sudo ifconfig usb0 up
$ sudo dhcpcd usb0

それで以下のようにIPが振られていてインターネットに接続できればOK。

$ ifconfig usb0
usb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.42.116  netmask 255.255.255.0  broadcast 192.168.42.255

次にルータにつなぐeth0を設定しますが、めんどくさいので固定IPにします。/etc/dhcpcd.conf でこんな感じに。

interface eth0
static ip_address=192.168.0.10/24
static domain_name_servers=127.0.0.1

一方BuffaloのWiFiルータのインターネット側の設定も固定IPにして、

IPアドレス 192.168.0.2
デフォルトゲートウェイ 192.168.0.10
DNS(プライマリー) 192.168.0.10

などとします。

あとはforwardの設定をしておしまい。

動的には sysctl -w net.ipv4.ip_forward=1 で、パーマネントには
/etc/sysctl.conf で
net.ipv4.ip_forward=1
にします。そしてiptablesで以下のように。

sudo iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE
sudo iptables -A FORWARD -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o usb0 -j ACCEPT

参考にしたのは以下です。

https://superuser.com/questions/1505796/4g-lte-device-usb-tethering-raspberry-pi-ethernet-router-is-this-poss

ownCloudの更新とSamba外付けストレージ(結局失敗)

また日が開いてしまいました。

ownCloudのデータのディスクを移動したく、ついでにRaspberry PiでownCloudを10.2から10.4に上げてみると、PHPが7.0じゃだめで7.1が要るという。Raspbian GNU/Linux 10じゃ7.1はないんですよ。こんなのちゃんとdependencyで見てほしいぞ。

しょうがないので、https://raspberrypi.stackexchange.com/questions/70388/how-to-install-php-7-1/70394 を参考に

In /etc/apt/sources.list change stretch to buster, which is the next-stable/testing repository.
Update System sudo apt-get update && sudo apt-get upgrade
Remove previous PHP sudo apt-get remove ‘^php.*’
Install PHP 7.1 sudo apt-get install php7.1-fpm php7.1-cli or sudo apt-get install php7.1

で上げます。ownCloudのデータベースを移動するのは前はなぜかうまく行かなかったので、スクラッチから作って、現状のデータをアップするつもり。そこで /var/www/owncloud/config/config.php を消して最初からやりなおすと…

なんでこんなにいろいろ言われるんだろ?

すこしぐぐって
sudo systemctl reload apache2
とやると少し減ったけど、まだ本当にいろいろ足りないらしい。

sudo apt install php7.1-zip php7.1-sqlite3 php7.1-xml php7.1-intl  php7.1-mbstring php7.1-gd php7.1-curl
と入れたあと、reloadじゃだめな場合もあるので
sudo systemctl restart apache2
とします。

しかし、

と言われますたしかに今まではSQLiteだったけど、そこまで言われちゃしょうがない

sudo apt install php7.1-mysql

してから

sudo mysql
で入ったあと
CREATE DATABASE owncloud;
GRANT ALL PRIVILEGES ON owncloud.* TO ‘owncloud’@’localhost’ identified by ‘xxxxxxxxx’;
などとしておきます

さて、最近のownCloudから入ったらしい、Sambaを外部ストレージに指定するのを試します。BuffaloのWiFiルータのUSBにSSDを挿して簡易NASにしているのです。

そうすると、トップ階層に「SMB」として見えます。

だがしかし、まだ終わらない。UbuntuのownCloudクライアントがすぐ落ちるんですよ。syslogには以下のメッセージが

kernel: [119581.377081] traps: owncloud[2942] general protectio
n ip:7f490f66f436 sp:7ffed9a6b7e0 error:0 in libowncloudsync.so.2.4.1[7f490f5de000+119
000]

しょうがないので
/etc/apt/sources.list.d に

deb http://download.owncloud.org/download/repositories/10.2.1/Ubuntu_18.04/ /

の内容で owncloud.list を入れてowncloudを最新にしてみたもののダメ

結局Ubuntuを18.04から20.04に上げたら解決しました。元々上げるつもりだったからいいけどさ。

★★★★★★★★★★★★★★★★

けれどけれど、なんかSambaのディスクに上げようとすると、めっちゃ遅くてタイムアウトが続出。

結局Sambaはあきらめ、Raspberry PiにSDDをつなぎ直し、それをownCloudのデータ領域にしました。

BuffaloのWiFiルータにはメディアサーバ機能があって便利だったのだけど、また昔のようにRaspberry Piにminidlnaを入れて音楽サーバにしました。ここでもトラブルがあったのでまた別の項で。

Raspberry Piでeth0が見えなくなる

また随分間が空いてしまいました。

ラズパイをいじってて、apt-get upgradeしたあとrebootしたら、sshで入れない。

泣く泣くモニタとキーボードをつないで調べると、eth0がないじゃない(有線でつないでます)。

dmesgで調べたら、なんかeth0をリネームしたよ、などと出てくる。なんて余計なことしてくれるんだい。いろいろぐぐってみるとraspi-configで

Network interface names Enable/Disable predictable network interface names

をdisableすると良いとあったので半信半疑でやったら直りました。predictableってのはMACアドレスを使った名前になるようです。こんなの有効にした覚えないんだけどな。upgradeで勝手になったのだろうか。だとしたら迷惑な話だ。

このあたりに事情が載ってます。

minidlnaが追加されたファイルを無視する

Raspberry Piに外付けSSDをつないで、minidlnaを立てて音楽サーバにしてます。
しかし最近、media_dirの下にMP3を放り込んでもちっとも認識してくれません。今までは自動で認識してくれたのですが。

ログを見ると
sql.c:41: error: SQL ERROR 8 [attempt to write a readonly database]
なんぞと出てます。minidlnaはrootで動いてるんだから、/var/cache/minidlna/files.db に書けないわけないんですけどねえ。

そういえば、最近SSDをでかい奴に変えたのでそのせいかと思い、minidlnaを止めてfiles.dbを消し、sudo minidlnad -Rしてからminidlnaをスタートしたら直った気がします。これが正しい対処かはわかりませんが。