ぺんちゃん日記

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

【AutoHotkey】Radiko タイムフリー番組ページを開いて再生ボタンをクリックして過去の番組を聴く。

f:id:yasushiito:20190403184928p:plain

これまでの経緯。

前回の作業で、AutoHotkeyを利用してブラウザ( Microsoft Edge) を使って Radiko のライブ再生を 始められるようにしました。
Windows のタスクスケジューラから起動すれば、決まった時間に決まった番組を聞くことができます。

これで実現できたのはリアルタイムでの再生まで。
暇な時間帯に心に刺さる番組があった時しかカバーできません。

Radiko タイムフリーでより充実した時間が。

Radiko タイムフリーは過去一週間ぶんの放送を楽しめるサービスです。
URL で放送局と一週間以内の日時を指定すれば、その時間に流れたラジオ放送を聴くことができます。

そこで、聞きたい番組がない時間帯に 再生してしまおうと。
例えば月曜夜9時半からやっている番組を土曜夜8時半の時間帯で聞いてしまう。

毎晩が充実しそうですね。

設計アンド実装。

今回は放送日時をシフトするだけとします。
本来なら番組表を見て聞きたかった番組を何らかの形で予約すると、空いた時間に聞くことができるようにしたいのですが、さすがにいきなりそんな要求高い仕様で実装できません。
先ほどの例のように、月曜夜9時半の放送を日曜夜8時半に毎週シフトさせて再生するようにします。
つまんないなと思っても途中で次の番組に移ったりなどは到底できません。
毎週決まった時間に決まった番組を聞くだけ。
この AutoHotkey スクリプトを起動するためのショートカットを、時間帯をずらしたい番組の数だけ用意します。
それをタスクスケジューラで時間になったら放送再生のスクリプトを実行する形となります。


前回に事前調査した通りタイムフリーで番組を再生するための URL は次のようなフォーマットになりますね。

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

前回拵えたプログラムに第2、第3パラメータを用意して、番組の放送曜日と時間をを渡せば、今日から時間をさかのぼって最近の 放送ページを開くようにしましょう。

関数のインターフェースはこんな感じです。

radikoplay(channel, onairtime="", wday=""){

myahk/radikoplay.ahk at master · yasushiito/myahk

第2パラメータの放送時間が設定されていればタイムフリー、されていなければライブ視聴とします。
ページが開いたら再生ボタンをクリックしますが、ライブ再生とタイムフリー再生ではボタンのデザインが違うので、画像認識に使うサンプル画像を採取します。
また、タイムフリーでは再生を始める前に注意メッセージが表示されます。
OK ボタンのクリックで応答しないと再生が始まりません。
タイムフリー再生に対応するために、画像認識に使う OK ボタンのサンプルも採取します。

    url := "http://radiko.jp/#!/"
    if onairtime =
    {
        ;ライブページの URL と再生ボタンのサンプル画像ファイル名を用意する。
        url := url . "live/" . channel
        btnplay := "images\radikoplay.bmp"
    }
    Else
    {
        ;タイムフリーで過去の番組を聞きたい場合
        ;放送曜日と放送時間から前回放送日時を算出する。
        onairdate := getLastDateByWday(A_Now, wday)
        FormatTime, onairdate, %onairdate%, yyyyMMdd
        ;タイムシフトページの URL と再生ボタンのサンプルとタイムフリーに関する注意メッセージの OK ボタンのサンプル画像ファイル名を用意する。
        url := url . "ts/" . channel . "/" . onairdate . onairtime
        btnplay := "images\radikotsplay.bmp"
        btnok := "images\radikotsok.bmp"
    }

myahk/radikoplay.ahk at master · yasushiito/myahk



ボタンクリック処理では、 OK ボタンのサンプル画像が設定されている場合だけ、 OK ボタンを探してクリックします。
OK ボタンのサンプル画像の存在チェックも忘れずにします。

        CoordMode,Pixel,Relative
        WinGetPos, , , Width, Height, A
        ;再生ボタンを探す。
        ImageSearch, x, y, 0, 0, Width, Height,*30 %btnplay%
        if ErrorLevel = 0
        {
            ;ボタンが見つかったので移動してクリック。
            MouseMove, x, y, 2
            MouseClick, Left
            ;タイムツリーの時はメッセージが表示されるので OK ボタンをクリックしなければならない。
            if btnok
            {
                ;OK ボタンのサンプル画像ファイルの存在を確認しておく。
                if FileExist(btnok)
                {
                    Sleep 1000
                    ;okボタンを探す。
                    ImageSearch, x, y, 0, 0, Width, Height,*30 %btnok%
                    if ErrorLevel = 0
                    {
                        MouseMove, x, y, 2
                        MouseClick, Left
                    }

                }
            }
            ;プレイヤーが起動してフォーカスを奪われる。
            ;ページの URL が取得できなくなるので入力フォーカスをページに戻す。
            Send,{Tab}
        }

myahk/radikoplay.ahk at master · yasushiito/myahk


出来上がったスクリプトの全体はこんな感じです。
最新版なので引用した内容とは違うことがあります。


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

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