Raspberry Piでらじるらじるを自動録音する(2)
Python部分
この装置(?)はPythonでスケジューリングを行っています。以下はPythonのコードです。
import sched
import time
import datetime
import subprocess
s=sched.scheduler(time.time,time.sleep)
JST=datetime.timezone(datetime.timedelta(hours=+9),'JST')
UTF8_BOM=bytearray([0xEF,0xBB,0xBF]).decode()
str_s=open('/mnt/nas/radiocfg.txt','r').readlines()
def strip_bom(s):
if s.startswith(UTF8_BOM):
return s[len(UTF8_BOM):]
return s
def writelog(logtext):
logfile=open('/mnt/nas/log.txt','a')
logfile.write(datetime.datetime.now(JST).strftime('%Y%m%d %H%M%S:')+str(logtext)+'\n')
logfile.close()
def record(len,title):
now=datetime.datetime.now(JST)
url='https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8'
fname='/mnt/nas/'+str(now.strftime('%Y%m%d_%H%M%S_'))+title+'.mp3'
writelog(fname)
try:
p=subprocess.Popen(['ffmpeg','-i',url,'-to',len,fname])
except:
writelog('Error url:'+url+'filename:'+fname+'length:'+len+'title:'+title)
def update():
map(s.cancel,s.queue)
subprocess.Popen('sleep 5 && { sudo apt-get update && sudo apt-get -y upgrade && sudo apt-get -y dist-upgrade && sudo apt-get -y autoremove && sudo apt-get -y autoclean && echo "complete!" ; } > /mnt/nas/updlog.txt ; init 6; ',shell=True)
writelog('Update:Exit')
exit()
now=datetime.datetime.now(JST)
dt=datetime.datetime(now.year,now.month,now.day,0,0,0,tzinfo=JST).timestamp()
writelog('started')
for elem in str_s:
syobi,rectimes,slen,stitle=strip_bom(elem).rstrip('\n').split(' ',3)
shour,smin,ssec=rectimes.split(':',2)
tyobi=now.weekday()
yobi=int(syobi)
hour=int(shour)
min=int(smin)
sec=int(ssec)
if(tyobi==yobi):
if(datetime.datetime(now.year,now.month,now.day,hour,min,sec,tzinfo=JST)>now):
day=0
else:
day=7
elif (tyobi<yobi):
day=yobi-tyobi
elif (tyobi>yobi):
day=7-tyobi+yobi
ts=dt+86400*day+3600*hour+60*min+sec
if(int(slen)<0):
s.enterabs(ts,1,update)
else:
s.enterabs(ts,1,record,(slen,stitle,))
writelog(s.queue)
s.run()
このコードを書いたときにはいろいろと詰まりました。いくつか紹介します。
その1:時刻がずれる
これはただ単にデフォルトが世界標準時なだけです。が、修正には少々時間がかかりました。(tzinfo=で設定できる)
その2:日本語対応
日本語といえばUTF-8がよかろうということでメモ帳の「名前を付けて保存」からUTF-8で保存し、実行してみました。すると、意味不明なエラー(内容は忘れた)が発生し、だいぶ時間を食いました。調べてみたところではメモ帳は勝手にファイルの最初のところにBOMとよばれるバイト列をつけるのだそうです。昔の名残らしいのですが、それを取り除くコードをコピペしてきたら、直りました。VS Codeは右下にBOMの有無が出るので、助かっています。
その3:実行権限
このスクリプトはcronから自動実行しています。そうすると、crontab -eを実行したときのユーザーで実行されるんですね。つまり、
crontab -e
と
sudo crontab -e
は意味が違うということです。
もともとsudoなしでcrontabを開いていたので、管理者権限が必要な処理が実行されず、ログも出なかったので苦労しました。(スクリプトとかの中でsudoを書いてもダメっぽい)
また、cronは/home/piにアクセスできないようだったので、/home/pi以外の場所にスクリプトを置く必要があります。
ちなみに
url='https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8'
の行のURLを、次のGistを参考に適宜書き換えれば、NHK東京第二放送以外も録音できます。
ページの情報について
一年も前の内容なので、参考にした文献を忘れてしまいました。必要に応じて出典を書き加えますので、ご連絡ください。また、このコードは有償、無償を問わず自由にコピペ、利用してくださって結構です。
また、ずいぶん前のことを思い出しながら書いているので、間違っているものがあるかもしれません。もし間違いを見つけたら連絡してください。
お読みいただきありがとうございました。NASについては完全に記憶にないので、今は書けません。