ネットラジオを自動で録画して自動でGoogle Play Musicにアップロードする方法

常体で文章書くの疲れたので、これからは敬体にします。

やったこと

  • ネット配信(今回は文化放送の超A&G+)のラジオを自動で録画
  • 録画が終わったら、自動でGoogle Play Musicにアップロード

以上により、深夜にリアルタイムで放送を聞けなくても、翌日にGoogle Play Musicで録画を聞きながら通学・通勤できるようになります。
最近はニコニコ動画アーカイブをアップロードしてくれる番組も増えましたが、いちいちニコニコ動画にアクセスするのは面倒だし、普段使いのプレイヤーで聴けるととても便利です。
実は録画・アップロードの仕組みはずいぶん前に作ったものなのですが、自宅サーバからAWSに載せ替えるついでに記事にしておこうと思い立ち、今回のエントリを書きました。

準備

今回は以下の環境で実現しました。

手順

EC2サーバ、Python/pip、Ruby環境の構築手順は割愛します。
各バージョンが合っていれば、問題なく動作すると思います。

今回の流れとしては、Rubyスクリプトによってrtmpdumpでダウンロードしたコンテンツをffmpegエンコードし、PythonスクリプトGoogle Play Musicへアップロード、という感じです。

rtmpdump/ffmpeg インストール

rtmpdumpは、ストリーミング配信されているコンテンツをダウンロードするコマンドです。
また、ffmpegは、動画・音声・画像等をエンコードするツールです。

rtmpdumpaptでインストールできます。

$ sudo apt install -y rtmpdump

ffmpegaptからインストールできないので、自前でビルドします。

参考: 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'

インストールしたrtmpdumpffmpegの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分前だった場合、録画を始める仕組みになっています。

録画が成功すると、スクリプトと同階層のflvmp3というフォルダに、動画と音声ファイルがそれぞれ保存されます。

gmusicapiインストール/セットアップ

gmusicapiは、PythonからGoogle Play MusicAPIを叩くライブラリです。

開発は数年前に止まっていますが、問題なく動きます。

pipをつかってインストールします。

$ sudo pip install gmusicapi

次は、Google Play Musicにアクセスするためのセットアップ作業です。

Pythonインタプリタを起動し、以下の通り入力します。

>>> 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ファイルをアップロードするテスト

upload-gmusic.py · GitHub

こちらのファイルを適当な場所にcloneします。

$ git clone https://gist.github.com/29727675aec6ea1e1251a93d16179b7b.git

パラメータに渡されたファイルをアップロードするだけの、簡単なプログラムです。
使い方はこんな感じです。

$ python upload-music.py mpthreetest.mp3

スクリプトを見れば分かりますが、mp3, m4a, wma, flac, ogg, m4p形式の音声ファイルに対応しています。

Watcherでファイル作成を監視

Watcherは、ファイルの変更や移動をトリガーに、コマンドを実行してくれるPythonスクリプトです。

github.com

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で書き直せたらいいなと思います。