Raspberry Pi 3B+によるradiko受信メモ

Last Updated on 2018年10月13日 by kabekin

Raspberry Pi 3B+を使ったradiko受信の方法をメモ。

ネットで調べると色々情報が出てきますが、昔の方法は最近は使えないようなので
色々調べて2018年10月に動作した方法をメモっておきます

必要なソフトをインストール
sudo apt install rtmpdump swftools libxml2-utils libav-tools mplayer
参考にしたサイト
http://www.nofuture.tv/diary/20130111.html
https://xanadu6291.stars.ne.jp/?p=274
⇒  https://mtunn.wordpress.com/2017/02/08/raspberrypi3%E3%81%A7radiko/
こちらのサイトのradiko.shを使用し、録音関係を削除し再生用にさせて頂きました^^

#!/bin/bash
pid=$$
wkdir='/home/pi/radiko_tmp'
playerurl=http://radiko.jp/apps/js/flash/myplayer-release.swf
playerfile="${wkdir}/player.swf"
keyfile="${wkdir}/authkey.png"
auth1_fms="${wkdir}/auth1_fms_${pid}"
auth2_fms="${wkdir}/auth2_fms_${pid}"
date=`date +%Y%m%d_%H%M`
stream_url=""
url_parts=""
# Usage
show_usage() {
    echo "Usage: `basename $0` -p StationName" 1>&2
}
# authorize
authorize() {
    #
    # get player
    #
    if [ ! -f ${playerfile} ]; then
        wget -q -O ${playerfile} ${playerurl}
        if [ $? -ne 0 ]; then
            echo "[stop] failed get player (${playerfile})" 1>&2 ; exit 1
        fi
    fi
    #
    # get keydata (need swftool)
    #
    if [ ! -f ${keyfile} ]; then
        swfextract -b 12 ${playerfile} -o ${keyfile}
        if [ ! -f ${keyfile} ]; then
            echo "[stop] failed get keydata (${keyfile})" 1>&2 ; exit 1
        fi
    fi
    #
    # access auth1_fms
    #
    wget -q \
        --header="pragma: no-cache" \
        --header="X-Radiko-App: pc_ts" \
        --header="X-Radiko-App-Version: 4.0.0" \
        --header="X-Radiko-User: test-stream" \
        --header="X-Radiko-Device: pc" \
        --post-data='\r\n' \
        --no-check-certificate \
        --save-headers \
        -O ${auth1_fms} \
        https://radiko.jp/v2/api/auth1_fms
    if [ $? -ne 0 ]; then
        echo "[stop] failed auth1 process (${auth1_fms})" 1>&2 ; exit 1
    fi
    #
    # get partial key
    #
    authtoken=`perl -ne 'print $1 if(/x-radiko-authtoken: ([\w-]+)/i)' ${auth1_fms}`
    offset=`perl -ne 'print $1 if(/x-radiko-keyoffset: (\d+)/i)' ${auth1_fms}`
    length=`perl -ne 'print $1 if(/x-radiko-keylength: (\d+)/i)' ${auth1_fms}`
    partialkey=`dd if=${keyfile} bs=1 skip=${offset} count=${length} 2> /dev/null | base64`
    echo "***[Authorize Info]**************************"
	echo "authtoken: ${authtoken}" 1>&2
    echo "offset: ${offset}" 1>&2
    echo "length: ${length}" 1>&2
    echo "partialkey: ${partialkey}" 1>&2
	echo "*********************************************"
    rm -f ${auth1_fms}
    #
    # access auth2_fms
    #
    wget -q \
        --header="pragma: no-cache" \
        --header="X-Radiko-App: pc_ts" \
        --header="X-Radiko-App-Version: 4.0.0" \
        --header="X-Radiko-User: test-stream" \
        --header="X-Radiko-Device: pc" \
        --header="X-Radiko-Authtoken: ${authtoken}" \
        --header="X-Radiko-Partialkey: ${partialkey}" \
        --post-data='\r\n' \
        --no-check-certificate \
        -O ${auth2_fms} \
        https://radiko.jp/v2/api/auth2_fms
    #echo "authentication success" 1>&2
    areaid=`perl -ne 'print $1 if(/^([^,]+),/i)' ${auth2_fms}`
    #echo "areaid: ${areaid}" 1>&2
    rm -f ${auth2_fms}
    #
    # get stream-url
    #
    wget -q -O ${ch_xml} \
        "http://radiko.jp/v2/station/stream/${channel}.xml"
    if [ $? -ne 0 -o ! -f ${ch_xml} ]; then
        echo "[stop] failed stream-url process (channel=${channel})"
        rm -f ${ch_xml} ; show_usage ; exit 1
    fi
    stream_url=`echo "cat /url/item[1]/text()" | \
            xmllint --shell ${ch_xml} | tail -2 | head -1`
    url_parts=(`echo ${stream_url} | \
            perl -pe 's!^(.*)://(.*?)/(.*)/(.*?)$/!$1://$2 $3 $4!'`)
    rm -f ${ch_xml}
}
# Play
play() {
    # rtmpdump
    rtmpdump -r ${url_parts[0]} \
        --app ${url_parts[1]} \
        --playpath ${url_parts[2]} \
        -W $playerurl \
        -C S:"" -C S:"" -C S:"" -C S:$authtoken \
        --live \
        --stop ${duration} | \
        mplayer -
}
# Get Option
while getopts pd:f:t:s: OPTION
do
    case $OPTION in
        p ) OPTION_p=true
            ;;
        * ) show_usage ; exit 1 ;;
    esac
done
# Get Channel
shift $(($OPTIND - 1))
if [ $# -ne 1 ]; then
    show_usage ; exit 1
fi
channel=$1
ch_xml="${wkdir}/${channel}${pid}.xml"
# PLAY Mode
if [ "${OPTION_p}" ]; then
# Get Minute
	duration=`expr ${VALUE_t:=0} \* 60`
    authorize && play
fi

home/pi の下に radiko_tmp ディレクトリを作成して
radiko.shに実行権限を付加すれば
./radiko.sh -p RCC で再生OK

受信可能な放送局一覧は広島では
http://radiko.jp/v2/station/list/JP34.xml
で取得可能
RCC
HFM
RN1
RN2
HOUSOU-DAIGAKU
JOFK
JOAB
JOAK-FM
http://www.dcc-jpl.com/foltia/wiki/radikomemo


サイマルラジオで配信されている放送はmplayerでそのまま受信できるらしい
まえばしCITYエフエムの場合

http://radio.maebashi.fm:8080/mwave?MSWMExt=.asf

日本コミュニティ放送協会で配信されている放送は
FMちゅーピーの場合

mplayer https://musicbird-hls.leanstream.co/musicbird/JCB082.stream/playlist.m3u8?args=web_03

FM湘南ナパサの場合 JCB014(JCBxxxの部分放送局選択) 等で受信できるようですが、
途中音声が途切れるので何か工夫が必要なのかも・・
mplayer から ffplay -nodisp に変えると少し改善するが、それでも途切れる
⇒引数のweb_xxの値を変えたり削除すると途切れにくくなった気がするが、真相は不明・・・^^;;
-nodisp -rtbufsize 10M 効果なし
ffmpegを経由すると改善あり
sudo apt install ffmpeg でインストール

ffmpeg -i https://musicbird-hls.leanstream.co/musicbird/JCB014.stream/playlist.m3u8 -f mp3 - | mplayer - -novideo

ffmpeg経由でmplayerを使うと最初にエラーが発生するので、プレーヤはffplayに変更^^

ffmpeg -bufsize 5M -i https://musicbird-hls.leanstream.co/musicbird/JCB082.stream/playlist.m3u8 -f mp3 - | ffplay -i -nodisp -

AVOptionsにバッファサイズ指定があったので5MB設定してみました。
効果は不明ですが1Mだと切断あり、50Mと極端に大きくすると別のエラーが頻発し、5Mだと好結果でした
それでも切断することはあるので5MBのバッファで切断有りとなると、思っている動作とは違うんだと思います^^;;
しかし、これなら実用になりそうです^^


ついでにyoutube の 音声再生環境のメモ
参考にしたページ  ⇒ https://qiita.com/yuki_ycino/items/594c27426c5580450bf2
必要なソフトをインストール
sudo apt install youtube-dl mplayer
youtube-dl ‘https://www.youtube.com/watch?v=NdfXqwWgbBE&t=12s’ -o – | mplayer – -novideo
youtube-dl ‘https://www.youtube.com/watch?v=TMnKRA-koac&t=141s’ -o – | mplayer – -novideo
youtube-dl ‘https://www.youtube.com/watch?v=R2TRdynJiIE’ -o – | mplayer – -novideo
youtube-dl ‘https://www.youtube.com/watch?v=uhOMW_NOXDU&t=29s’ -o – | mplayer – -novideo
で再生OK
-noviceo オプションを外すと動画も表示されるらしい
ffplayをプレーヤで使う場合は
youtube-dl ‘https://www.youtube.com/watch?v=NdfXqwWgbBE&t=12s’ -o – | ffplay -i -nodisp -hide_banner –
でOK

ローカルファイルの再生はmplayerのみでOK
mplayer /share/10.YUKI.mp3
エラーが出る場合
ERROR: Signature extraction failed: Traceback (most recent call last):
sudo pip install –upgrade youtube_dl でアップデート
>>実行結果
Collecting youtube_dl
Downloading https://files.pythonhosted.org/packages/fc/fd/eec89ed38b6ddba29fba41be1d3d98a933ed4dd0c426ca04444b1d6789d4/youtube_dl-2018.9.10-py2.py3-none-any.whl (1.8MB)
100% |████████████████████████████████| 1.8MB 153kB/s
Installing collected packages: youtube-dl
Successfully installed youtube-dl-2018.9.10

2件のコメント

  1. 私もRaspberryPiでradikoを再生したいと思っておりまして、インストールしては失敗を繰り返していて、未だに聴取には至っておりません。ネットで色々な方法を探しているのですが、基本的なことから勉強しないとならないみたいで、なかなかクリアできません。
    まず、OSはRaspberryPiOSでなければいけないのか?KONA Linux for RaspberryPiでも良いのか?
    かべきんさんの書かれているソフトをインストール&設定していけば良いのか?はたまた
    https://dbpro.xyz/10314
    に書かれているStreamlinkという再生プログラムを使えるのか?などなど分からないことだらけで
    ご教授いただければ幸いです。
    radikoも一局だけ(東京のTBSのみ)聴くことができれば良いので、なんとかアドバイスをいただきながら再生できるように頑張りたいと思っております。よろしくお願いします。

    1. 久しぶりにRaspiでradikoにチャレンジしてみましたが、上記の方法ではradikoは聞けなくなっていました。
      認証関係の変更だと思いますが、このスクリプトはFlashPlayerのストリーミングを使っていた記憶があるのでFlashPlayer終了の関係もあるかもしれません。
      https://radiko.jp/#!/info/2470
      debian系ではlibav-toolsライブラリもaptで入手できなくなっているようです
      私もよく分からず手探りで動かしていたので何が原因なのかよく分かりません^^;;;
      現在のRasbianでは標準のブラウザでそのままradikoが使えますので技術的な研究無しで宜しければ新し目のRasbianをインストールするとradikoは使えます。
      コマンドラインからradikoを聞きたい強者には物足りないかもしれません^^;;;

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください