-
-
Save ji6czd/f86440200ba286f1f7af2e103dd430ff to your computer and use it in GitHub Desktop.
Radikoを聴くためのスクリプトです。元々は認証してプレイリストのURLを取得するものを、ちょっとだけ修正と整理をしてコマンドラインから簡単に聴けるようにしてみました。ffmpegの付属ツールffplayが必要です。HLS形式での配信になり、rtmpdump, swftoolsが不要になりました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
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' # '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 ) | |
url = f'http://f-radiko.smartstream.ne.jp/{argv[1]}/_definst_/simul-stream.stream/playlist.m3u8' | |
m3u8 = gen_temp_chunk_m3u8_url( url ,token) | |
os.system( f"ffplay -nodisp -loglevel quiet -headers 'X-Radiko-Authtoken:{token}' -i '{m3u8}'") | |
#print( f"curl -v -H 'X-Radiko-Authtoken:{data['token']}' '{data['url']}' " ) |
すいません、もとの説明ページを見てませんでした。googleの検索で探していたもので、説明ページに従って修正してから再度質問します。
82行の
url = f'http://f-radiko.smartstream.ne.jp/{argv[1]}/_definst_/simul-stream.stream/playlist.m3u8'
を
url = 'http://f-radiko.smartstream.ne.jp/{argv[1]}/_definst_/simul-stream.stream/playlist.m3u8'.format(argv[1])
としてみたのですが
./radiko.py RN1
b'JP13,\xe6\x9d\xb1\xe4\xba\xac\xe9\x83\xbd,tokyo Japan\r\n'
Traceback (most recent call last):
File "/jffs/radiko/tool/./radiko.py", line 82, in
url = 'http://f-radiko.smartstream.ne.jp/{argv[1]}/_definst_/simul-stream.stream/playlist.m3u8'.format(argv[1])
KeyError: 'argv'
となるのですが、おかしそうなところをアドバイスいただけないですか?
起動時に引数を与えていないだけでした。おさがわせしました。ソース公開ありがとうございます
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
興味があるのでソースをコピーさせて頂きました。
Python 3.9.4で試させていただきました。
57行の "X-Radiko-Device": 'pc' # 'pc' 蝗コ螳・ }の影響で
./radiko.py
File "/jffs/radiko/tool/./radiko.py", line 58
req = urllib.request.Request( url, None, headers )
となります。”# 'pc' 蝗コ螳・”を削って動かすと
./radiko.py
b'JP13,\xe6\x9d\xb1\xe4\xba\xac\xe9\x83\xbd,tokyo Japan\r\n'
Traceback (most recent call last):
File "/jffs/radiko/tool/./radiko.py", line 82, in
url = f'http://f-radiko.smartstream.ne.jp/{argv[1]}/_definst_/simul-stream.stream/playlist.m3u8'
IndexError: list index out of range
となります。f'http:/を'http:/に変えて動かすと
./radiko.py
b'JP13,\xe6\x9d\xb1\xe4\xba\xac\xe9\x83\xbd,tokyo Japan\r\n'
Traceback (most recent call last):
File "/jffs/radiko/tool/./radiko.py", line 83, in
m3u8 = gen_temp_chunk_m3u8_url( url ,token)
File "/jffs/radiko/tool/./radiko.py", line 70, in gen_temp_chunk_m3u8_url
res = urllib.request.urlopen(req)
File "/opt/lib/python3.9/urllib/request.py", line 214, in urlopen
File "/opt/lib/python3.9/urllib/request.py", line 523, in open
File "/opt/lib/python3.9/urllib/request.py", line 632, in http_response
File "/opt/lib/python3.9/urllib/request.py", line 561, in error
File "/opt/lib/python3.9/urllib/request.py", line 494, in _call_chain
File "/opt/lib/python3.9/urllib/request.py", line 641, in http_error_default
urllib.error.HTTPError: HTTP Error 404: Not Found
となるのですが、おかしそうなところをアドバイスいただけないですか?