Skip to content

Instantly share code, notes, and snippets.

@ji6czd
Forked from takuya/test.py
Last active December 26, 2023 03:05
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ji6czd/f86440200ba286f1f7af2e103dd430ff to your computer and use it in GitHub Desktop.
Save ji6czd/f86440200ba286f1f7af2e103dd430ff to your computer and use it in GitHub Desktop.
Radikoを聴くためのスクリプトです。元々は認証してプレイリストのURLを取得するものを、ちょっとだけ修正と整理をしてコマンドラインから簡単に聴けるようにしてみました。ffmpegの付属ツールffplayが必要です。HLS形式での配信になり、rtmpdump, swftoolsが不要になりました。
#!/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']}' " )
@youtube-dl-fun
Copy link

興味があるのでソースをコピーさせて頂きました。
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
となるのですが、おかしそうなところをアドバイスいただけないですか?

@youtube-dl-fun
Copy link

すいません、もとの説明ページを見てませんでした。googleの検索で探していたもので、説明ページに従って修正してから再度質問します。

@youtube-dl-fun
Copy link

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'
となるのですが、おかしそうなところをアドバイスいただけないですか?

@youtube-dl-fun
Copy link

起動時に引数を与えていないだけでした。おさがわせしました。ソース公開ありがとうございます

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment