ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

【AutoHotkey】 Radiko のライブページを開いて再生ボタンを押してもらう。

f:id:yasushiito:20190403184928p:plain

これまでの経緯。

Radiko アプリのタイマーや自動再生の機能があまりにも行けていないので Windows PC からタスクスケジューラを用いて決まった時間に番組を再生して枕元の Bluetooth スピーカーに音声を飛ばそうとしています。

PC 版の Radiko アプリはエリアフリーに対応していないので、再生はブラウザから Web ページで行うこととします。
いろいろ残念に行けてないです。

radiko の web ページを調べてみる。

radiko の web ページで番組を聞くときは URL を次のように 指定します。

http://radiko.jp/#!/live/放送局のチャンネル名

放送局のチャンネル名の部分は NHK とか TBS みたいにアルファベット3文字くらいに省略されたやつであることが多いです。
大文字小文字を区別するのでラジコのウェブサイトから確認してから指定してくださいね。
この URL のページを開けば、現在放送されている番組が開きます。
例えば TBS ラジオは以下の URL です。
http://radiko.jp/#!/live/TBS


ここで最大の問題。
番組のページが開くだけで放送の再生を始まりません。
再生ボタンをクリックするとページの下の方にプレイヤーが開いて再生が始まります。
ここでプレイヤーと言っているのは次の画像のようなコンポーネントです。
f:id:yasushiito:20191008184044p:plain
ブラウザでページを開くだけでは番組を聞けないことは注意してください。

さらに厄介なのが再生ボタンが入力フォーカスを持てないこと。
f:id:yasushiito:20191009092403p:plain
tab キーによる入力フォーカスの移動を行っても再生ボタンにはフォーカスは回ってこなくて素通りします。
再生を始めるにはマウスでクリックする以外にありません。
キーボード操作がきかないということはAutoHotkeyによるショートカットキー操作で再生を始めることができません。
以前はそれで諦めたのですが、現在では画像認識を使ってボタンを探して移動+クリックできる技を身につけています。
画像認識は表示環境が少し変わるだけでも動かなくなってしまうデリケートな処理なので利用を最小限に抑えたいですが、こんな時は役に立ちます。

実装する。

実際のスクリプトは、以前に作った Facebook メッセンジャーの入力ボックスにコピペするスクリプトを流用します。
最初は Google Chrome で開くように作ったのですが、音声の出力先を PC のスピーカーから Bluetooth スピーカーに切り替えるスクリプトを用意するのが面倒だったので Microsoft Edge で開くことにしました。
普段はお蔵入りしている Microsoft EdgeRadiko 専用のアプリとしてしまえば、音声の出力先を Bluetooth デバイスに固定できるし、再生を停止したい時はウィンドウごと抹殺すれば良いので簡単です。

出来上がったスクリプトはこちら。
関数になっているので第一引数に放送局の略称を渡してください。
放送局が指定されていない場合は、 edge を閉じるだけで再生を行わない、つまり停止となります。

関数を呼び出すスクリプトはこちら。
コマンドラインから実行してオプションで放送局を指定します。

再生ボタンの画像を採取します。
このボタンの左上ギリギリの部分をマウスクリックするので大きめに画像を採取してしまうとクリックをミスります。
f:id:yasushiito:20191009095147j:plain


たぶんコマンドラインを開くのは面倒でしょうからショートカットを作成すると便利です。
オプションを与えてショートカットから起動するのは昔やりましたね。
放送局ごとの再生ショートカットと停止ショートカットを作成しておきます。


実装には現れなかったところについて。

実装する際に戸惑った点をいくつか。


うっかり複数のタブで番組を開いてしまうと、開いた番組全ての音声が流れてきてしまいます。
チャンネルを切り替えたい時は確実に再生中のページを探してタブを閉じなければなりません。
自分が PC の前に張り付いて操作できる状態なら不要なページを閉じるくらいは。
なんとでもなるのですが、ベッドに寝転がった状態から他人に操作してもらおうと思うと しんどいですね。
スクリプトの実行エラーが起きた時などは面倒なことになるので少しでも構造をシンプルにしたかったのでした。


ブラウザをラジオ専用にした上で予告なしに閉じるなんて乱暴なことはやりたくない方は普段お使いのブラウザから URL を取得して Radiko のページを探してくださいね。
ただし、その時は URL の判定に注意してください。
ブラウザに表示されているliveページの URL とは違うものが帰ってきます。例えば#!/liveのあたりがap/になってたりします。
帰ってくるのはプレイヤーがストリーミングしている音声ファイルのURL です。
再生ボタンを押した瞬間に、プレイヤーが開いて, ページのフォーカスがそちらに移ります。
すると URL を取得しても音声データの URL が入ってきます。

一度 tab キーを送信してしまえば、番組のページにフォーカスが帰ってきてブラウザの表示通りの URL を取得できるようになります。
現在のところはそのやり方で確認できましたが、ページのデザインが変わると動かなくなる恐れはあります。

タイムフリーで過去の番組を聞きたい時は次のようなフォーマットで URL を指定します。

http://radiko.jp/#!/ts/放送局のチャンネル名/日時


日時の部分は年月日時分秒をyyyymmddhhmmssのフォーマットで指定します。
時間は番組の放送開始時間ピッタリに合わせなくても良いです。
と言うか、ここで指定した時間に放送されたところから再生が始まります。
例えば時分秒の部分で192000と指定した時は、番組が19時ぴったりから始まるとしても、20分あたりから再生が始まります。
友達に聞いてほしい部分をシェアするために用意されている機能ですから当然途中再生も出来るですよね。

タイムシフトで再生する時には、注意メッセージが表示されることがあります。
f:id:yasushiito:20191009092501p:plain

もちろん OK ボタンをクリックしなければ再生は始まりません。
状況によってはこのメッセージが出ないこともあります。
自動操作するならどちらの状況にも対応できるようにしておきましょう。

見れば一発で分かりますが、タイムフリーでは再生ボタンは赤いです。
画像認識の際には赤のボタンも標本を採取しておく必要があります。




ここまでできれば、後はタスクスケジューラで再生開始スクリプト決まった時間に起動するように組み込むだけです。
タスクスケジューラの管理が面倒なのは内緒です。


この記事に登場するAutohotkey スクリプトについて

この記事の中で私が作成したプログラムは、全て自由に使うことができます。
詳しくはこちら