AGStation(β)

作品制作年:2021年

タグ:DockerNode.jsNuxt.js

work image

超A&Gの録画について

超A&G は文化放送が放送している、アニメラジオ専門のインターネットラジオです。
超A&G自体は暗号化処理がされておらず、FFmpeg等を用いて録画することが可能なのですが、どうもうまく録画することができません。それはおかしいだろうと思い、m3u8ファイルを解析してみたところ、ファイル内に記載されているリンクが全て相対パスになっていることが原因でした。ではそのm3u8ファイルに記載されるリンクを全て絶対パスに書き換えてくれるスクリプトを作ってしまおうと思い立ち、AGStation(β)を制作するきっかけとなりました。ネットで探してみたところ、超A&Gを録画できる無料ツールが見当たりませんでした。

仕組み


AGStationのバックエンドが、m3u8ファイル取得時のみFFmpegのプロキシとして動作します。AGStationが代理で超A&Gサーバにアクセスしてm3u8ファイルを取得します。その後、取得したファイル内のリンクを絶対パスに書き換えてFFmpegに返却します。FFmpegは書き換えられたm3u8をもとに超A&Gサーバから動画ファイル群を直接取得して録画します。これでFFmpegからコマンドを用いて録画することが可能になります。暗号化処理等がなされているわけではないので、複雑な処理が一切ありません。
しかし、せっかくなのだから録画しやすいGUI環境を整えてしまおうということで、WEBフロントエンド等の実装を行いました。

フロントエンド

かんたんにサクッと作りたかったので、当時持ち合わせていたスキルセットの中でNuxt.jsを用いました。また、CSSフレームワークであるBuefyのテンプレートを用いてスタイリングしています。
番組表からの録画予約・録画キャンセル・録画済み番組の確認 の操作を行うことができます。

バックエンド

もともとプロキシをNode.jsで作っていたので、そのままNode.jsでバックエンドを作成しました。ライブラリとしてExpressを用いています。index.tsの単一ファイルで300行弱記述しているのでリファクタリングの余地があります。また、エンドポイントとその役割を簡単に確認できるようにSwaggerが導入されています。録画予約情報を記録するためにMySQLをDBとして利用しており、TypeORMを用いて操作しています。もちろんWEBフロントエンドを利用せずにFFmpegから直接m3u8ファイルを要求することも可能です。

Docker

作成後、GitHub上で配布したかったため、Dockerで簡単に環境構築ができるように整えました。利用者は、makeコマンドを用いて make install を実行するだけでFFmpegのインストールからAGStation(β)の導入まで全てが完了します。


関連リンク

作品のGitHub:https://github.com/takonasu/AG_Station