日々

 昼前にTAKEにマクドナルドで昼食買ってくるお使いを頼まれたので、ついでにこれまで貯めていたスマートフォン貯金をPixel 3 XL買ったので銀行に入金。あと先日のイベントで余った資金も入金。帰りにダイソーでカーテンフックを査収。そういえば、ここのマクドがUbar Eatsに対応した模様。

 nuroモバイルの0SIMのサポートに電話。0SIMのデータプランを使っているが、音声プランに変更できないので新規申し込みが必要とあるが、0SIMはデータプランと音声プランもまとめて1つしか契約できないとあるので、解約して新規申し込みとなると思うが、解約後いつ契約出来るのかを確認。
 解約は解約手続き後、その月末に行われるので、翌月1日から新規申し込みが可能とのこと。父親のんは昨日解約したので1/1以降に新規申し込みか。
 radikoプレミアムのタイムフリー録音スクリプトの続き。base64コマンドは環境によって入ってないこともあるのでopensslコマンドで代替。radikoプレミアム入ってない場合にログイン&ログアウトと認証でのクッキー読み込みを省くだけで同様に使えることを確認。
 あとは番組表からの検索を作り込み。放送局一覧から放送局IDを順次取得してループ。dateコマンドで日本標準時での表示方法が判ったので28時間表記で7日前から今日までの日付を順次取得してループ。これで放送局ごとの1日分の番組表を取得して、xpathでキーワード検索して、録音するだけ。
 てな訳で、指定したキーワードを含む番組を録音するシェルスクリプトを作ってみた。キーワードは引数で指定する。radikoプレミアムに対応させる場合はログインとクッキー保存、認証処理でクッキー読み込み、ログアウトとクッキー読み込みを追加して、エリアIDに関係なく全ての放送局一覧を取得する処理に変更する必要があるかと思う。

#!/bin/sh
# radikoを聞くための認証処理
wget -q -O auth1 --server-response --trust-server-names --header="X-Radiko-App: pc_html5" --header="X-Radiko-App-Version: 0.0.1" --header="X-Radiko-User: dummy_user" --header="X-Radiko-Device: pc" https://radiko.jp/v2/api/auth1 2> auth1.err
authtoken=`sed -n -e 's/.*X-RADIKO-AUTHTOKEN: //ip' auth1.err`
keylength=`sed -n -e 's/.*X-Radiko-KeyLength: //ip' auth1.err`
keyoffset=`sed -n -e 's/.*X-Radiko-KeyOffset: //ip' auth1.err`
partialkey=`echo -n "bcd151073c03b352e1ef2fd66c32209da9ca0afa" | sed -n -e "s/.\{$keyoffset\}\(.\{$keylength\}\).*/\1/p" | openssl enc -base64`
wget -q -O auth2 --server-response --trust-server-names --header="X-Radiko-AuthToken: $authtoken" --header="X-Radiko-PartialKey: $partialkey" --header="X-Radiko-User: dummy_user" --header="X-Radiko-Device: pc" https://radiko.jp/v2/api/auth2 2> auth2.err
# エリアIDを取得して放送局IDの一覧を取得
area_id=`sed -n -e 's/,.*//p' auth2`
wget -q -O station.xml http://radiko.jp/v2/station/list/$area_id.xml
for station_id in `xmllint --xpath "/stations/station/id" station.xml | sed -e "s/<id>\([^<]*\)<\/id>/\1\n/g"`
do
        # 28時間表記で7日前から本日までの日付を取得
        for day in 7 6 5 4 3 2 1 0
        do
                program_date=`TZ="Asia/Tokyo" date --date="$day days ago 5 hours ago" +"%Y%m%d"`
                # 放送局IDと日付を指定した番組表から引数で指定したキーワードを含む番組名の開始日時と終了日時を取得
                wget -q -O program.xml http://radiko.jp/v3/program/station/date/$program_date/$station_id.xml
                for result in `xmllint --xpath "/radiko/stations/station/progs/prog/title[contains(text(),"\""$1"\"")]/parent::prog/@ft|/radiko/stations/station/progs/prog/title[contains(text(),"\""$1"\"")]/parent::prog/@to" program.xml | sed -e 's/ ft="\([^"]*\)" to="\([^"]*\)"/\1:\2\n/g'`
                do
                        # 放送局IDと開始日時と終了日時を指定してタイムフリー録音
                        ffmpeg -loglevel error -fflags +discardcorrupt -headers "X-Radiko-Authtoken: $authtoken" -i "https://radiko.jp/v2/api/ts/playlist.m3u8?station_id=$station_id&l=15&ft=${result%:*}&to=${result#*:}" -acodec copy -vn -bsf:a aac_adtstoasc -y "${result%:*}-${result#*:}-$station_id.m4a"
                done
        done
done

 何とか動くものが無事出来たところで本日は終了。
 定時後、第二神明で帰宅。やっとこさ楽天カードETCカードが届いた。今月で期限切れとナビが毎日警告するので少し不安だったけど、これで安心。
 カーテンフック(アジャスター式)を早速取り付け。折れてカーテンの一部が下がった状態で長らく放置していた箇所と、先日カーテンをソファの上に母親が乗せていて、それを踏んで折ってしまった2箇所を交換。元通りにキレイにカーテンが閉まる状態になった。

 晩御飯はミートドリア。
 ふと、Twitter見てたら激安超特価商店街さんがNTT-X Storeでフィリップスの23インチIPS液晶フルHDディスプレイが1万切りで出てるのを紹介してたので確認。スピーカー搭載でアナログRGBもHDMIも付いててVESAマウントにも対応していたので思わず衝動買い。
 母親の知人SK宅へ。先日ヨドバシで注文して届いていたエレコムのフラットモールを持っていって壁面の角から天井を這わせてエアコンの上まで、同じく角から壁に沿って這わせてテレビの横近くまで貼り付けて、先日設置したBSアンテナのケーブルを収納して出来上がり。
 あとはNHKの契約云々テロップを消す方法とか、三菱のUHD Blu-ray内蔵4Kチューナー内蔵4K液晶テレビを買ったアサヒデンキが怪しいトコじゃないかとか聞かれたり。ついでにMiix2 8を全然使ってないと聞いていたので回収させていただいた。お茶いれてもらって一服した後、夜9時すぎ帰宅。
 Miix2 8を充電して電源を入れる。Windows 10だし、Bluetoothキーボードもペアリングされてはいるが、Windows Updateや大型アップデートが溜まりまくっていたり、Cドライブの容量が逼迫していて色々と面倒。別ドライブ用意しろと言われてmicroSD入れてもダメらしく、USBドライブ付けて解決。