-
-
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']}' " ) |
起動時に引数を与えていないだけでした。おさがわせしました。ソース公開ありがとうございます
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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'
となるのですが、おかしそうなところをアドバイスいただけないですか?