家にいるときは朝からラジオを聞くことが多いので、目覚まし代わりにラジオを再生するようにしたいと思います。時間を指定してラジオをつけようと思うと数千円出して新しい機器を購入したりアプリを入れたりということが選択肢としてありますが、こちらの記事によるといろいろ苦労もあるようです。
→「ラジオで爽やかに目覚めたい! だけなのに、けっこう大変だった話。ソニーの電球スピーカー&ラジオ」
そこで、自分の家にはUbuntuを入れているインテルのNUCがあることを思い出し、cronを使ってradiko.jpからラジオを再生すればいいと考えました。
(以下はChromeを使うことを前提にしています。)
Seleniumでradiko.jpにアクセス
こちらの記事のようにCUIからradiko.jpのコンテンツ操作する方法は結構あるようです。
→「CUIなサーバーだけでradikoを聞きたい!」
ただradiko.jp内のリソースに直接触れる感じになるのが若干気が引けたというのと、より簡単な方法で実行したいという気持ちがあったので、UIテストのときに使われるSeleniumを用いてradiko.jpの再生ボタンを押すという方法を選択しました。
Seleniumの準備
Seleniumはこちらを参考にしました。
→「PythonでSeleniumを使ってスクレイピング (基礎)」
ドライバ取得
上記の参考記事に従い、seleniumのインストールと使っているOSやブラウザのバージョンにあったドライバの取得をします。
e.g.
wget https://chromedriver.storage.googleapis.com/2.40/chromedriver_mac64.zip
unzip chromedriver_mac64.zipwget
Selenium インストール
pip install selenium
Seleniumでラジオを再生
# !/usr/bin/env python
# -*- coding: utf-8 -*-
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
class Radio(object):
def __init__(self, driver_path, url, options=None):
self.driver = webdriver.Chrome(driver_path, chrome_options=options)
self.driver.get(url)
def play_or_stop(self):
self._play_button.click()
def exit(self):
self.driver.quit()
@property
def _play_button(self):
return self.driver.find_element_by_class_name('btn--primary')
def __enter__(self):
self.play_or_stop()
return self
def __exit__(self, exc_type, exc_value, traceback):
self.exit()
def main():
options = Options()
options.add_argument('--headless')
with Radio('/path/to/driver', 'http://radiko.jp/#!/live/TBS', options):
sleep(360)
if __name__ == '__main__':
main()
詳しい説明は省きますが、ポイントは再生画面の再生ボタンを特定してclick()
を実行していることです。また、スクリプトが終了した時点でwebdriver.Chrome
のオブジェクトが破棄され、ブラウザが閉じてしまうのでsleep(360)
として一時間ラジオが鳴っている状態にしています。--headless
はChromeの画面を表示せずに実行するオプションで、後述する理由により追加しています。
実装: https://github.com/itkr/my-radio
cronの設定
実行するPythonやドライバのパスに注意しながら普通にcronを設定します。cron自体の説明は省略します。
Headless Chrome を使う理由
Ubuntuで実行した際、cronからだと--headless
オプションを付けないとうまく起動してくれませんでした。また、Macではブラウザの表示はされましたが音が出ない場合がありました。(原因は追えていません)
コンピューターを休止させておいきたい場合
ずっと動かしているコンピューターならいいのですが、スリープや休止状態にしている場合cronがうまく動かない場合があります。そこでrtcwake
というコマンドで復帰する時間を操作できるようです。参考→「【備忘録】毎日自動的に休止→起動する(CentOS 6.6)」(Ubuntuでも使えました)
余談
タイトルは毎朝聞いている「伊集院光とらじおと」をちょっとだけ意識しました。