RaspberryPiでradikoを再生する【2021年】
以前も同じような記事を書きましたが、radikoの仕様変更により再生できなくなってしまいました。最新の環境でも動作するスクリプトを用意しました。
今回はPython3とffplayが必要になります。
検索すると出てくるので、ここでは取り扱いません。
プログラム【radiko.py】
import urllib.request, urllib.error, urllib.parse import os, sys, datetime, argparse, re import subprocess import base64 import shlex import logging from sys import argv auth_token = "" auth_key = "bcd151073c03b352e1ef2fd66c32209da9ca0afa" key_lenght = 0 key_offset = 0 def auth1(): url = "https://radiko.jp/v2/api/auth1" headers = {} auth_response = {} headers = { "User-Agent": "curl/7.56.1", "Accept": "*/*", "X-Radiko-App":"pc_html5" , "X-Radiko-App-Version":"0.0.1" , "X-Radiko-User":"dummy_user" , "X-Radiko-Device":"pc" , } req = urllib.request.Request( url, None, headers ) res = urllib.request.urlopen(req) auth_response["body"] = res.read() auth_response["headers"] = res.info() return auth_response def get_partial_key(auth_response): authtoken = auth_response["headers"]["x-radiko-authtoken"] offset = auth_response["headers"]["x-radiko-keyoffset"] length = auth_response["headers"]["x-radiko-keylength"] offset = int(offset) length = int(length) partialkey= auth_key[offset:offset+length] partialkey = base64.b64encode(partialkey.encode()) # logging.info(f"authtoken: {authtoken}") # logging.info(f"offset: {offset}") # logging.info(f"length: {length}") # logging.info(f"partialkey: {partialkey}") return [partialkey,authtoken] def auth2( partialkey, auth_token ) : url = "https://radiko.jp/v2/api/auth2" headers = { "X-Radiko-AuthToken": auth_token, "X-Radiko-Partialkey": partialkey, "X-Radiko-User": "dummy_user", "X-Radiko-Device": 'pc'} req = urllib.request.Request( url, None, headers ) res = urllib.request.urlopen(req) txt = res.read() area = txt.decode() print(txt) return area def gen_temp_chunk_m3u8_url( url, auth_token ): headers = { "X-Radiko-AuthToken": auth_token, } req = urllib.request.Request( url, None, headers ) res = urllib.request.urlopen(req) body = res.read().decode() lines = re.findall( '^https?://.+m3u8$' , body, flags=(re.MULTILINE) ) # embed() return lines[0] res = auth1() ret = get_partial_key(res) token = ret[1] partialkey = ret[0] auth2( partialkey, token ) # NACK5の部分に放送局名をセットします。 url = "http://f-radiko.smartstream.ne.jp/NACK5/_definst_/simul-stream.stream/playlist.m3u8" m3u8 = gen_temp_chunk_m3u8_url( url ,token) print(token) print(m3u8) cmd = "ffplay -nodisp -loglevel quiet -headers 'X-Radiko-Authtoken:" + token + "' -i '" + m3u8 + "'" print(cmd) os.system(cmd)
ネットに転がっているソースをベースにしていますが、そのままだと動作しなかったので少し修正してあります。Windows上で実験するときはコマンドのところを修正する必要があるので注意してください。シングルクォートで括ると動きません。
自動再接続シェルスクリプト【loop_radiko.sh】
while true do python3 radiko.py sleep 10s done
非同期実行するためのコマンド
nohup ./loop_radiko.sh NACK5 >/dev/null 2>&1 &