moOde audio streamlink + radiko

前回作成したstreamlink仕様のradiko playerをmoOde audioで試してみました。 取り敢えず動作確認は出来たものの今まで使っていたradikoスクリプトが動かなくなってしまいました!!! 遅かれ早かれ移行することになると思うのでstreamlink仕様にsimul.pyその他関連する箇所を急遽修正してみました。

Warning

現在稼働中のradikoスクリプトの環境にstreamlinkを導入するとradikoスクリプトは動かなくなる可能性があります。 現在の環境を壊したくない場合は導入しないようにして下さい。

auth1_fms

radiko streamlink player確認後、radikoスクリプト実行

$ ./radiko.sh -p FMT
[stop] failed auth1 process (/var/tmp/auth1_fms_11798)

$ ll /var/tmp
-rw-r--r-- 1 pi pi      0 12月  3 17:12 auth1_fms_11798
-rw-r--r-- 1 pi pi 198393  7月 29 16:24 authkey.png
-rw-r--r-- 1 pi pi 685413 10月  7  2016 player.swf

認証に失敗しているようです???

radiko streamlink player

補足
このプログラムは実験、確認用です。
moOde audioでradikoを再生するにはpulse audioを設定、pulse audioをスタートした状態でないと音量100%で出力します。
常用するには適切にpulse audioをコントロールするようプログラムを変更する必要があります。

moOde audioでは環境は整っているのでstreamlinkをインストールするだけでOK

raspberry pi zero + streamlink + ffplay 再生まで20秒弱 ギリギリ我慢できる範囲内です。
Pi4からも再生可なのでいいことにします。

simul.py

プレーヤーはffplay

# default player
#player = "mpv"
player = "'ffplay -nodisp'"

実行はradiko.shからstreamlink(194行目附近)

#subprocess.run(bin_dir + "radiko.sh -p " + proc + " 1>/dev/null 2>/dev/null &", shell=True)
subprocess.run("~/.local/bin/streamlink -p " + player + " http://radiko.jp/#!/live/" + proc + " best &", shell=True)

ON AIR radiko(368行目附近)

# on station radiko
#command = ("ps ax | grep rtmpdump | grep -v grep | awk '{print substr($5,1)}'")
command = ("ps ax | grep radiko.jp | grep -v grep | awk '{print $(NF-1)}' | awk 'NR==1' | cut -c 8-13")

(373行目附近)

#if proc == 'rtmpdump': # Radiko
if proc == 'radiko':

(376行目附近)

#command = ("ps ax | grep rtmpdump | grep -v grep | awk '{print substr($9,1)}' | tr -d /_definst_")
command = ("ps ax | grep radiko.jp | grep -v grep | awk '{print $(NF-1)}' | awk 'NR==1' | cut -c 26-")

参考 simul.py

radiko logo画像

/var/www/html/pulse.php

//$station = shell_exec("ps ax | grep rtmpdump | grep -v grep | awk '{print substr($9,1)}' | tr -d /_definst_");
$station = shell_exec("ps ax | grep radiko.jp | grep -v grep | awk '{print $(NF-1)}' | awk 'NR==1' | cut -c 26-");

参考 pulse.php

Pi zeroでは再生開始が遅いのがネック
再生自体は問題ない
ちょっと予定より早くなってしまいましたが脱Flashできました。

 

Raspberry Pi Streamlinkでradiko再生

CLIで実行する従来のradikoスクリプトはFlashを利用しておりAdobeのサポート終了に伴ってradikoの対応もいずれは廃止の方向に向かうものと思われます。
Streamlinkはストリーミング動画をコマンドラインで実行するpythonユーティリティです。radikoも対応しています。
コマンドラインから実行できるもうひとつの環境として試して見ます。

インストール

https://streamlink.github.io/index.html
Streamlinkはpluginでサイトに対応しています。現時点のRaspiOS(debian系)のパッケージは古いのでradikoに対応していません。
Streamlinkサイト Installation PyPI package and source codeの項からpipでインストール
インストールはシステムにインストールする方法とユーザーにインストールする方法があります
(ユーザーを選択)

$ pip3 install --upgrade --user streamlink

実行ファイルは~/.local/binに置かれます。パスを通しておくといいでしょう。

プレーヤーはvlcがインストールされています(Pi4) その他mpvをインストール

# apt install mpv

ffmpeg,youtube-dlは依存でインストールされます。youtube-dlは古いのでremoveする
radikoは以上でOK RTMPプロトコルのサイトはrtmpdumpをインストール

radiko

$ streamlink -p mpv http://radiko.jp/#!/live/FMT best
bash: !/live/FMT: event not found

ターミナルから直接radikoのurlを実行するとshellはhistoryを参照するようです(/#!/)
上記のコマンドをスクリプトにする
~/radiko-streamlink.sh

#!/bin/sh
~/.local/bin/streamlink -p mpv http://radiko.jp/#!/live/FMT best
# ffplay
# ~/.local/bin/streamlink -p 'ffplay -nodisp' http://radiko.jp/#!/live/FMT best

ffplayはffmpegに含まれる再生プレーヤー(音声のみはoption -nodisp)

スクリプト実行

$ chmod 755 radiko-streamlink.sh
$ ./radiko-streamlink.sh


簡単ですね! 面倒な作業無しに再生可能です。CLIスクリプトも作れそうです。
プレーヤーはvlc,mpv,ffplayで再生可
mplayerではradikoは動作しませんでした。

録音

#!/bin/sh
~/.local/bin/streamlink http://radiko.jp/#!/live/FMT best -o fmt.m4a


$ mediainfo fmt.m4a
AAC LC SBR

abema.tv

https://abema.tv/
お気に入りのプレーヤーで視聴 urlは取得する

$ streamlink -p vlc https://abema.tv/url best

download

$ streamlink https://abema.tv/url best -o hoge.ts

Radiko Streamlink Player

以前作成したpython radiko playerをstreamlink仕様にしてみました。

参考 radiko-streamlink.py
(保存すると日本語正常に表示すると思います)
player選択は# — default settings —
の項で切り替え可

起動当初は時折ブツブツ言っていたのですが時間経過ともに安定してきました。
再生開始はmpv10秒位、ffplay5秒位掛かっています。(Pi4)
Raspi zeroも再生可能ですが20〜30秒位掛かります。
Pi3クラスであれば問題なく運用可能と思います。

Raspberry Pi 4 RK61キーボード crontab

RK61キーボードを使い始めて約2週間ほど経ちました。
Bluetooth ON-OFFスイッチによる再接続は約10秒、sleepからの復帰は約1〜2秒
RK61製品仕様ではスタンバイ時間360時間、連続使用時間10時間
キーボード操作が無ければ1分でバックライト消灯、5分でスタンバイ、10分でディープスリープ
ディープスリープに入るとxmodmapやxkbcompで読み込んだ設定はクリアされてしまいます。
そこでスタンバイモードにとどめておくよう(バッテリーの持ちも問題無いだろうと予想)cronで廻してみることにしました。

20201126 追記

下記設定後キーボードまたはマウスからXにアクセスがあるうちはcrontabによって設定を継続できるのですがマウス、キーボード共全くアクセスが無くなった場合20分前後でキーボードはSleepに入ってしまうようです。
現状ではSleepを完全に止めることは難しいのでcrontabの設定を1分として廻すことにしました。
Sleepから目覚めたら1分以内に設定が適用されます(xx:00秒に実行)マニュアル操作と併用することで妥協することにします。
バッテリーの持ちについてはここ数日使ってみた限りでは特に消耗していることは無いようです。引き続き様子を見ることにします。

.Xkeymap

xmodmapとxkbcompは変わらず併用しています。
キーは前回の2箇所に加えてもう2箇所変更(使用頻度、好みで)
キー(\|) パイプを優先(backslash bar)
キー(‘”) ダブルクォーテーション優先

key <AC10> {         [           colon,       semicolon ] };
key <AC11> {         [        quotedbl,       apostrophe] };
key <BKSL> {         [        bar,            backslash ] };
key <AB10> {         [          question,         slash ] };

archlinux X KeyBoard extension
を参考にデフォルトのwarning解消、及び不要と思われる設定を削除

$ xkbcomp ~/.Xkeymap $DISPLAY


必要な箇所を削除したりするとErrorになります
取り敢えず記述に間違いが無ければ何事もなくコマンド終了
デフォルトのwarningは不要な記述が残っている

変更は上記4箇所 参考.Xkeymap
マルチメディアキー、キーパッドなど無いキーは削除
取り敢えずファイルサイズ59Kから42Kまで減らしました。

crontab

~/.Xkeymapが用意できたところでcrontabに登録(実行部は1行)

$ crontab -e
*/5 * * * * env DISPLAY=:0 /usr/bin/xmodmap ~/.Xmodmap && /bin/sleep 0.1 && env DISPLAY=:0 /usr/bin/xkbcomp ~/.Xkeymap :0

10分で廻すとdeep sleepに突入してしまいます(5分に設定)
cronからXコマンド(Xアプリケーション)を実行するには環境変数DISPLAYを指定します
xkbcompの引数にも明示的にDISPLAY番号を指定(:0)

$ echo $DISPLAY
:0

初回起動時はキーボードがdeep sleepに入っているため何かキーを叩いて起こしてやる必要があります。
cronの実行を待つかこれまで通りアプリケーションメニューやxbindkeysで設定したキーで有効になります。
バッテリーの持ち時間についてはもう少し様子を見る必要が有りますが起動時以外はUSBレシーバー接続タイプの無線キーボード並に快適になりました。

メカニカル式キーボードはミスタッチも少なくあとは上達を待つばかりです(ここが問題)

Raspberry Pi 4 RK61キーボード Fnキー

RK61キーボードは60% 61keyと標準以外のキーはFnキーを活用することになります。
Fnキーは右隅に1個でキーによってはタイプしにくい箇所が出てしまいます。
そこでFnキーを左側にも増設することで左右どちらからでも打ちやすい方から入力してみたいと思います。
Fnキーを増設と言っても単にスイッチ(接点)を追加するだけですが!

Fnキー

Fnキー単独では何も信号を送りません。ほかのキーと組み合わせることによって特定のキーコードを送出します。
どのキーと組み合わせるかはキーボード独自の回路、プログラム次第になります。
Fnキーに特定のscan codeが無いためXorgからほかのキーにFnキー動作を割り当てることも出来ません。
Fnキースイッチを左側にも増やすためには現在のFnキーからパラで接続すれば良いことになります。

Fnキースイッチ増設


ケースは4本のネジで簡単に取り外せます。
裏蓋に800mAhのバッテリーが見えます。おそらく1450mAhタイプも取り付け可能と思われます。
細いリード線でFnキーにハンダ付け
裏蓋に2mmの穴開け


最初タクトスイッチを取り付けてみましたが動作は可能ですが押す方向またボタンサイズが小さく操作はいまいち
タクトスイッチは寿命、信頼性でも劣ると思います。


気を取り直して次は手持ちのジャンク品からマイクロスイッチを選択してみました。
OMRON K2-S アクチェーター部は押し釦、低荷重動作型
生産終了品ですが同等品はあると思います。


ハンダ付けして両面テープで貼り付け
突起部が押し釦 低荷重動作型のため押し圧はかなり低め キーボードの半分くらいの感覚
釦を押すとFnキーが光ります(キーボード設定次第)
釦手前は親指の待機場所に丁度いい


裏蓋側


多少慣れが必要ですが左Fnキーを使うことでほとんどのキーが自然に入力が可能になりました。
見た目不細工だがこれは有りだと思う。

xbindkeys

Raspberry Pi4の~/.xbindkeysrcにShift + Enterを追加登録
vncservserでxtermの起動に使っている場合は注意(当サイトはAlt + x)

"xmodmap ~/.Xmodmap && sleep 0.1 && xkbcomp ~/.Xkeymap $DISPLAY"
  m:0x1 + c:111
    Shift + Up
"xmodmap ~/.Xmodmap && sleep 0.1 && xkbcomp ~/.Xkeymap $DISPLAY"
  m:0x1 + c:36
    Shift + Return

キーボードを使う時はターミナル上でパパンとEnterキーを連打
反応があったらShift + Enter(ここは癖にする)
通常sleep状態から1〜2秒で目覚めます。

デフォルトキーボード

Bluetoothスイッチは24時間ONのまま現在10日位ですがバッテリーはOK
青軸のスイッチ音はうるさいと言えるほどタイプ出来ないので問題なし 
小気味よくカシャカシャしています
コンパクトなRK61キーボードは当サイトのデフォルトキーボードとして活躍してくれそうです。

手元に白い保護フィルムの貼ったアルミ板端材があったので急遽カバーを作成
0.5mm以下のアルミ板はカッター、ハサミなどで比較的簡単に加工できます。
白いキーボードに黒いスイッチは違和感が有りますがだいぶ見栄えは改善したと思います。

Raspberry Pi 4 RK61 xmodmap XKB(X KeyBoard extension)

メカニカルキーボードRK61を使い始めて1週間ほどになります。
なんとか少し慣れてきて常時運用する目処が立ってきました。
それでもやはりいづい、気になるキーがいくつかあります。

XKB(X KeyBoard extension)

xmodmap – ArchWiki
X KeyBoard extension – ArchWiki
xmodmapとXKB(X KeyBoard extension)は独立したツールとあります。
xmodmapで設定した内容はXKBからも設定可能のようですがなかなかわかりにくい、サクッとはいかないようです。
前回のCapsLock設定はそのままxmodmapから実行、簡単に修正出来そうなキー2箇所をXKBから実行してみました。

slash,question(/?)キー
/?キーはUP(↑)と兼用になっています。デフォルトはUP(↑)
Fn + EnterでUP(↑)と/?がトグルします。
デフォルトUP(↑)時は右Shift + (/?)で? Fn + (/?)で/ の動作
当サイトではHistoryを多用します。デフォルトUP(↑)でいいのですが右Shift + (/?)で/ の動作にしたい

semicolon,colon(;:)キー
セミコロン、コロンキーは優先がセミコロン Shift + がコロン
コロンを多用するのでコロンを優先したい

xkbcomp

現在の設定をファイルに出力

$ xkbcomp $DISPLAY output.xkb

出力したファイルをコピー(ファイル名は任意)

$ cp output.xkb .Xkeymap

Xサーバーにアップロード

$ xkbcomp .Xkeymap $DISPLAY


Warningが表示されますがデフォルト設定を再アップロードしただけなので見なかったことにします。

.Xkeymap編集
デフォルト(数値は行番号)

1280     key <AC10> {         [         semicolon,         colon ] };
1315     key <AB10> {         [         slash,          question ] };

項目の順位を入れ替えて保存

1280     key <AC10> {         [          colon,        semicolon ] };
1315     key <AB10> {         [          question,         slash ] };

再度アップロード

$ xkbcomp .Xkeymap $DISPLAY

上記の設定が有効になります。

xmodmap XKBを有効にする

xmodmap XKBとも起動時及びキーボードのsleepからの復帰時は設定が有効になっていません。

マウスから実行(以前作成したアプリケーションメニューに登録)

# Button902 xmodmap xkbcomp
def x902():
    subprocess.run("xmodmap /home/pi/.Xmodmap", shell=True)
    time.sleep(0.1)
    subprocess.run("xkbcomp /home/pi/.Xkeymap $DISPLAY", shell=True)
icon902 = PhotoImage(file=dir+'xmodmap.png')
button902 = ttk.Button(frame1,image=icon902,command=x902)
button902.grid(row=1,column=2)

キーボードから実行(~/.xbindkeysrcに登録)
キーは左Shift + (/?↑)

"xmodmap ~/.Xmodmap && sleep 0.1 && xkbcomp ~/.Xkeymap $DISPLAY"
  m:0x1 + c:111
  Shift + Up

xbindkeys

# apt install xbindkeys

RaspberrypiOS desktop環境では自動で起動しているはずです。
キーを登録したら

$ killall xbindkeys
$ xbindkeys

キーの取得は

$ xbindkeys -k

Raspberry Pi4(64bit)では一旦日本語レイアウトで設定したキーボード(RK61)でキーを取得(値)しないと認識しませんでした。
訂正 USキーボードで問題なく取得できます。(既に登録済みのキーは正常な値を取得しないという落ちでした)
以前Pi3(k270)で使っていた値はキーがマッチしていればそのまま使えます。
vncserverも同様にxbindkeysをインストール設定、vnc-clientのRaspberry Pi4からコントロールが可能(必要なキーはvncserverに記載)
vncserver側で使用するキーとRaspberry Pi4自身で使用するキーは明確に分ける必要があります。


Bluetooth接続は10秒近く掛かることがあります。
取り敢えずキーボードも最低限の設定が出来てきました。
XKBについてはボチボチ調べようと思います。

Top