--- ---
Skip to content

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については完全に記憶にないので、今は書けません。

執筆

phenylshimaのプロフィール画像
phenylshima phenylshima on GitHub

そのへんの大学生です.プロフィールについてはGitHubを見ていただければ…

最近よく使う言語はRustとTypeScriptです.Rustは書いていてたのしいので,よく採用します.