常体で文章書くの疲れたので、これからは敬体にします。
やったこと
- ネット配信(今回は文化放送の超A&G+)のラジオを自動で録画
- 録画が終わったら、自動でGoogle Play Musicにアップロード
以上により、深夜にリアルタイムで放送を聞けなくても、翌日にGoogle Play Musicで録画を聞きながら通学・通勤できるようになります。
最近はニコニコ動画にアーカイブをアップロードしてくれる番組も増えましたが、いちいちニコニコ動画にアクセスするのは面倒だし、普段使いのプレイヤーで聴けるととても便利です。
実は録画・アップロードの仕組みはずいぶん前に作ったものなのですが、自宅サーバからAWSに載せ替えるついでに記事にしておこうと思い立ち、今回のエントリを書きました。
準備
今回は以下の環境で実現しました。
Linuxサーバ
Python 2.7.12
- pip 9.0.1
Ruby 2.3.1p112
rtmpdump 2.4
ffmpeg 3.2.4
Watcher github.com
手順
EC2サーバ、Python/pip、Ruby環境の構築手順は割愛します。
各バージョンが合っていれば、問題なく動作すると思います。
今回の流れとしては、Rubyスクリプトによってrtmpdump
でダウンロードしたコンテンツをffmpeg
でエンコードし、PythonスクリプトでGoogle Play Musicへアップロード、という感じです。
rtmpdump/ffmpeg インストール
rtmpdump
は、ストリーミング配信されているコンテンツをダウンロードするコマンドです。
また、ffmpeg
は、動画・音声・画像等をエンコードするツールです。
rtmpdump
はapt
でインストールできます。
$ sudo apt install -y rtmpdump
ffmpeg
はapt
からインストールできないので、自前でビルドします。
参考: Ubuntu 14.04 で最新の ffmpeg を簡単かつクリーンにインストールする方法
録画スクリプト(Ruby)
Gistでこんなスクリプトを見つけたので、自分用に修正して使っています。
save AGQR radio programs. · GitHub
これをサーバ内の任意の場所にcloneします。
$ git clone https://gist.github.com/fcf7d283b9aa641694bed757b7e1b3cf.git ~/record_agqr
schedule.yaml
schedule.yaml
で録画したい番組を指定できます。
フォーマットは以下のとおりです。
- title: [番組タイトル(任意)] wday: [曜日] time: [開始時間] length: [放送時間]
火曜日 25:00~25:30 放送の『洲崎西』を録画したければ、
- title: suzakinishi wday: 火 time: '25:00' length: 30
という感じです。
agqr.rb
スクリプト内で2箇所だけ、環境によって書き換える必要がある(かもしれない)箇所があります。
10~11行
rtmpdump = '/usr/bin/rtmpdump' ffmpeg = '/usr/bin/ffmpeg'
インストールしたrtmpdump
とffmpeg
のPATHを指定しています。PATHはwhich
コマンドで調べることができます。
$ which rtmpdump $ which ffmpeg
出力されたPATHがスクリプトと違うものであれば、適宜書き換えます。
このスクリプトをcron
で叩きます。
$ crontab -e 29,59 * * * * ruby /home/ubuntu/record-agqr/agqr.rb
スクリプトは録画1分前に起動し待機させておかなければならないので、番組が始まる0分/30分から録画をするために、毎時間29分/59分に起動させます。
スクリプトが起動した時間がschedule.yaml
で指定した番組が始まる1分前だった場合、録画を始める仕組みになっています。
録画が成功すると、スクリプトと同階層のflv
、mp3
というフォルダに、動画と音声ファイルがそれぞれ保存されます。
gmusicapiインストール/セットアップ
gmusicapi
は、PythonからGoogle Play MusicのAPIを叩くライブラリです。
開発は数年前に止まっていますが、問題なく動きます。
pip
をつかってインストールします。
$ sudo pip install gmusicapi
次は、Google Play Musicにアクセスするためのセットアップ作業です。
>>> from gmusicapi import Musicmanager >>> mm = Musicmanager() >>> mm.perform_oauth()
以下のようなメッセージが出力されるので、
Visit the following url: https://accounts.google.com/o/oauth2/v2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fmusicmanager...... Follow the prompts, then paste the auth code here and hit enter:
2行目のURLにブラウザからアクセスすると、認証画面が表示されます。
ログイン後に「このコードをコピーし、アプリケーションに切り替えて貼り付けてください。」という文言とともに文字列が表示されるので、上記メッセージの3行目末尾にそのまま貼り付けると、認証が完了します。
そのままログインしてみます。
>>> mm.login()
True
True
と表示されたら、認証は成功しています。
ちなみに、認証情報は$HOME/.local/share/gmusicapi/oauth.cred
に保存されています。
テストとして、ここにあったテスト用MP3ファイルをアップロードしてみます。
wget
でファイルをダウンロードし、
$ wget https://archive.org/download/testmp3testfile/mpthreetest.mp3
再度ログインした後、upload()
メソッドでアップロードします。
>>> from gmusicapi import Musicmanager >>> mm.login() >>> mm.upload("mpthreetest.mp3")
ブラウザやスマホのクライアントからライブラリを見ると、タイトル"Test of MP3 File"というファイルがアップロードされていると思います。
以上でgmusicapiの準備は完了です。
Python スクリプトでmp3ファイルをアップロードするテスト
こちらのファイルを適当な場所にcloneします。
$ git clone https://gist.github.com/29727675aec6ea1e1251a93d16179b7b.git
パラメータに渡されたファイルをアップロードするだけの、簡単なプログラムです。
使い方はこんな感じです。
$ python upload-music.py mpthreetest.mp3
スクリプトを見れば分かりますが、mp3
, m4a
, wma
, flac
, ogg
, m4p
形式の音声ファイルに対応しています。
Watcherでファイル作成を監視
Watcher
は、ファイルの変更や移動をトリガーに、コマンドを実行してくれるPythonスクリプトです。
incron
というツールも似たような動作をするのですが、こちらはディレクトリを再帰的に監視できないので、それが可能なWatcher
を使うことにしました。
python-pyinotify
が必要なので、pip
でインストールします。
$ sudo pip install python-pyinotify
スクリプトを適当な場所にcloneし、watcher.ini
を編集します。
$ git clone https://github.com/szepeviktor/Watcher-splitbrain.git ~/Watcher
watcher.ini
[job1] watch=/home/ubuntu/record-agqr/mp3 events=move_to recursive=true autoadd=true command=python /home/ubuntu/upload-music.py
watch
に監視するディレクトリを指定します。
events
で、どういうアクションの際にコマンドを実行するかを指定します。
今回はmp3
フォルダにファイルが追加されたときにアップロードスクリプトを走らせたいので、上記のような設定になります。
また、command
には、どんなコマンドを実行するかを指定します。
先ほどcloneしてきたupload-music.py
を叩いています。
そして、Watcherを起動します。
$ python watcher.py -c watcher.ini start
これでディレクトリの監視を始めてくれます。
デーモンみたいな感じで、あとは放置していればよいと思ったのですが、しばらくすると勝手に停止しているようなので、こちらもcron
で一定時間ごとに起動し直すよう指定しました。
$ crontab -e 0 0 * * * python /home/ubuntu/Watcher/watcher.py -c /home/ubuntu/Watcher/watcher.ini start
おわりに
以上の作業で、最初に書いた録画 → エンコード → アップロードの流れを自動化できました。
ほとんどありものを流用したので、あまり苦労したところはありませんでした。
調べたところ、RubyにもGoogle Play Musicを叩けるGemがあるようなので、いつか全てRubyで書き直せたらいいなと思います。