radikoの録音ツールをGoで書いた

この記事は、Go (その3) Advent Calendar 2016 の12日目の記事です。

## radigo
radikoの録音用のツールをGoで書きました。
[https://github.com/yyoshiki41/radigo](https://github.com/yyoshiki41/radigo)
> Record radiko 📻 

radikoのAPIのライブラリも書きました。
[https://github.com/yyoshiki41/go-radiko](https://github.com/yyoshiki41/go-radiko)
> The unofficial radiko.jp APIs Client Library for Go.

※ 現在(2016年12月)、radikoが公式でAPI公開を行っているわけではありません。

### radiko とは
[radiko.jp](http://radiko.jp/) で、インターネットでラジオが聞けるやつです。
今年(2016年)の10月より、タイムフリーという機能がスタートして、
過去1週間分の放送を遡って聴けるようになりました。

[radigo](https://github.com/yyoshiki41/radigo) では、

- リアルタイムプログラムの録音
- タイムフリープログラムの録音
- エリアフリー(ラジコプレミアム会員用の機能)での録音

に対応しています。
[README](https://github.com/yyoshiki41/radigo/blob/master/README.md)にも書いてますが、簡単な使い方だけ。

## 機能

### Installation

```bash
$ go get github.com/yyoshiki41/radigo/cmd/radigo/...
```

### Usage

```bash
$ radigo help
usage: radigo [--version] [--help] <command> [<args>]

Available commands are:
    area           Get available station ids
    browse         Browse radiko.jp
    browse-live    Browse radiko.jp live
    rec            Record a radiko program
    rec-live       Record a live program
```

### Commands

#### ■ area

現在の地域で聴けるラジオ局の一覧。

```bash
$ radigo area
Area ID: JP13
+------------------+----------------+
|       NAME       |   STATION ID   |
+------------------+----------------+
| TBSラジオ         | TBS            |
| ニッポン放送       | LFR            |
| InterFM897       | INT            |
| TOKYO FM         | FMT            |
| J-WAVE           | FMJ            |
| bayfm78          | BAYFM78        |
| NACK5            | NACK5          |
| ＦＭヨコハマ       | YFM            |
+------------------+----------------+
```

#### ■ rec

タイムフリー機能を使っての録音。
ラジオ局のIDと時間を指定すると、aacファイルで出力されます。
（他に、mp3もオプションで指定できます。）

```bash
$ radigo rec -id=LFR -s=20161126010000
Now downloading..
+------------+---------------------------------+
| STATION ID |              TITLE              |
+------------+---------------------------------+
| LFR        |　　  オードリーのオールナイトニッポン |
+------------+---------------------------------+
Completed!
/tmp/radigo/output/20161126010000-LFR.aac
```

#### ■ rec-live

リアルタイムで録音。
ラジオ局のIDと録音時間を指定すると、録音が開始されます。

```bash
$ radigo rec-live -id=LFR -t=3600
Now downloading..
+------------+---------------+
| STATION ID | DURATION(SEC) |
+------------+---------------+
| LFR        |          3600 |
+------------+---------------+
Completed!
/tmp/radigo/output/20161205083547-LFR.aac
```

#### ■ browse / browse-live

ブラウザでradiko.jpのページを開きます。
ブラウザにURLを入れてクリックして遷移しなくて良いので、
ヘビーリスナーにはちょっと嬉しい機能です。

```bash
# リアルタイムのページが開く
$ radigo browse-live -id=LFR
# タイムフリーのページが開く
$ radigo browse -id=LFR -s=20161126010000
```

#### ■ オプション

エリアフリー機能を使いたい場合、
環境変数でラジコプレミアムのmail/passwordを指定すると使えます。

- `RADIKO_MAIL`
- `RADIKO_PASSWORD`

## 実装

あまりGo自体の詳細には触れませんが、、

radikoのクライアントライブラリは、上で書いた自作のもの。
[https://github.com/yyoshiki41/go-radiko](https://github.com/yyoshiki41/go-radiko)
大方のAPIはサポートしています。
(Authのリクエスト方式や配信プロトコルを地道にトレースしました。)

CLIライブラリには、[mitchellh/cli](https://github.com/mitchellh/cli) を使いました。

ファイル出力自体は、外部コマンド(ffmpegやrtmpdump)を `os/exec` で呼ぶだけなので、さほど難しくありません。
パイプ処理だけ少し戸惑いましたが、stack overflowを参考にしました。
_[How to pipe several commands in Go?](http://stackoverflow.com/questions/10781516/how-to-pipe-several-commands-in-go)_

## 感想

便利に使ってます。
機能追加の要望やプルリクは、いつでもお待ちしております！
また、個人的な視聴の範囲を超える利用はご遠慮ください m(＿ ＿)m