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

minidlnaが立ち上がらない

さて、BuffaloのWiFiルータのメディア・サーバが使えなくなったので、以前使っていたRaspberry Piのminidlnaを有効にします。しかし、ステータスがexitedになって上がらない。ログにも何にも出ず。

いったん dpkg -r minidlna して入れなおすと、今度はログに

[2020/05/29 18:02:00] minidlna.c:355: warn: Creating new database at /var/cache/minidlna/files.db
[2020/05/29 18:02:01] minidlna.c:367: fatal: Failed to clean old file cache!  Exiting…

などと出ます。そこで思いついて /var/cache/minidlna の下を全部消すと動くようになりました。

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を入れて音楽サーバにしました。ここでもトラブルがあったのでまた別の項で。

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をスタートしたら直った気がします。これが正しい対処かはわかりませんが。