概要
今まで聞けたRadikoが今年に入って聞けなくなりました。何が起きているのか確かめてみました。
現状の確認と対策
認証は問題無い
下記の様にラジオ局のIDと名前が取得出来るので認証は通っているようです。
No. 0 ID: TBS , name: TBSラジオ
No. 1 ID: QRR , name: 文化放送
No. 2 ID: LFR , name: ニッポン放送
No. 3 ID: RN1 , name: ラジオNIKKEI第1
No. 4 ID: RN2 , name: ラジオNIKKEI第2
No. 5 ID: INT , name: interfm
No. 6 ID: FMT , name: TOKYO FM
No. 7 ID: FMJ , name: J-WAVE
No. 8 ID: JORF , name: ラジオ日本
No. 9 ID: BAYFM78 , name: BAYFM78
No. 10 ID: NACK5 , name: NACK5
No. 11 ID: YFM , name: FMヨコハマ
No. 12 ID: IBS , name: LuckyFM 茨城放送
No. 13 ID: ABCR-KOSHIEN , name: オーディオ高校野球
No. 14 ID: JOAK , name: NHK AM(東京)
No. 15 ID: JOAK-FM , name: NHK FM(東京)
No. 1 ID: QRR , name: 文化放送
No. 2 ID: LFR , name: ニッポン放送
No. 3 ID: RN1 , name: ラジオNIKKEI第1
No. 4 ID: RN2 , name: ラジオNIKKEI第2
No. 5 ID: INT , name: interfm
No. 6 ID: FMT , name: TOKYO FM
No. 7 ID: FMJ , name: J-WAVE
No. 8 ID: JORF , name: ラジオ日本
No. 9 ID: BAYFM78 , name: BAYFM78
No. 10 ID: NACK5 , name: NACK5
No. 11 ID: YFM , name: FMヨコハマ
No. 12 ID: IBS , name: LuckyFM 茨城放送
No. 13 ID: ABCR-KOSHIEN , name: オーディオ高校野球
No. 14 ID: JOAK , name: NHK AM(東京)
No. 15 ID: JOAK-FM , name: NHK FM(東京)
問題はStreamingのURL。つなぎ方が変わったみたいでず。
Webの開発ツールで接続方法を確認
ChromeでRadikoにアクセス。開発ツール(F12)のネットワークでアクセス方式を確認すると下記の様になっていました。
https://alliance-stream-radiko.smartstream.ne.jp/so/playlist.m3u8?station_id=FMJ&l=15&lsid=38f041c67b282c89bfe8bdb152c441cd&type=b
- 白の部分は固定
- 赤はラジオ局のID
- 青は16進32桁の乱数(多分)
このフォーマットに合わせてURLを作成しMPVに渡して見ました。
radiko.py
python
# ==========================================
# 3. ライブ配信の再生 (最新サーバーURL + mpv直結方式)
# ==========================================
def Radiko_play():
global _play, _authtoken, _proc_pt, _station_ID
_play["play"] = 1
station_id = _station_ID[_play["st_sel"]][0]
station_name = _station_ID[_play["st_sel"]][1]
live_url = "https://alliance-stream-radiko.smartstream.ne.jp/so/playlist.m3u8"
lsid = hashlib.md5(str(random.random()).encode("utf-8")).hexdigest()
params = {
"station_id": station_id,
"l": 15,
"lsid": lsid,
"type": "b",
}
target_url = f"{live_url}?{urlencode(params)}"
print(f"再生局: {station_name} ({station_id})")
print(f"ライブ再生URL: {target_url}")
cmd = [
"mpv",
"--no-video",
f"--http-header-fields=X-Radiko-AuthToken: {_authtoken}\r\n",
target_url,
]
print("再生を開始します...")
_proc_pt = subprocess.Popen(cmd)
見事に繋がりました。
今回のコード
今回はRaspberry PI 3Bで動くことを確認しました。
- OSはLEGACY 64-BIT LITE (Bookworm no desktop) を使いました
- Imagerで SSHを有効にしてインストールして下さい
- 完了後、PIにログインして下記を実行。アップデートとmpvのインストールです。
- 音声出力を確認
- 今回はヘッドフォンを使います。
- sudo raspi-config -> System Options -> Audio と進み bcm2835 Headphones を選択
- cat /proc/asound/cards コマンドでそれが何番かを確認
- コードは0番に設定されています。もし違ったら下記の -c の次の文字(3箇所)を修正して下さい。
- ここからコードをダウンロードして解凍。
- Raspberry PIのIPアドレスを確認して python3 radiko.pyと実行
- ブラウザを上げてURL欄に "http://Raspberry PIのIPアドレス:8080” と入力。Radikoが上がります。
sudo apt update
sudo apt full-upgrade -y
sudo apt install mpv
sudo apt full-upgrade -y
sudo apt install mpv
@raspi:~ $ cat /proc/asound/cards
0 [Headphones ]: bcm2835_headpho - bcm2835 Headphones
bcm2835 Headphones
1 [vc4hdmi ]: vc4-hdmi - vc4-hdmi
vc4-hdmi
0 [Headphones ]: bcm2835_headpho - bcm2835 Headphones
bcm2835 Headphones
1 [vc4hdmi ]: vc4-hdmi - vc4-hdmi
vc4-hdmi
radiko.py
python
def Set_Vol(vol):
cmd_vol = f"amixer -c 0 sset PCM {vol}%"
subprocess.run(cmd_vol.split())
global _play
if _play.get("mute", 0) == 1:
cmd_mute = "amixer -c 0 sset PCM mute"
else:
cmd_mute = "amixer -c 0 sset PCM unmute"
subprocess.run(cmd_mute.split())
最後に
またRadikoが聞ける様になりました。同じ事をESP32に行ったのですが、こちらは動きませんでした。接続方法が違った事以外に ”playlist.m3u8"の中身も変わった様です。ESP32では理解出来ない内容になった様です。