iTunes での楽曲情報を BigQuery に流し込むスクリプトを Go で書いた

書いてみました！

## About
iTunes が保持している楽曲情報には、主に下記のようなものが含まれるのですが、

* 曲名・アルバム名・アーティスト名 etc.
* 再生回数・スキップ回数 etc.
* ファイルサイズ・ファイルロケーション etc.

これらを BigQuery に蓄積するとおもしろいかなぁと思い、

* iTunes が出力している楽曲情報ファイル `iTunes Music Library.xml` をパース・csvに出力
* 出力した csv ファイルを `Google Cloud Storage` にアップロード
* アップロードしたファイルを `Google BigQuery` にロード

...といったことを行うスクリプトを、いま流行りの Go で書いてみました。
ちょっとイキって、 `Goramoph` なんて名前を付けてしまいました。

利用するまでにちょっとした準備が必要なので、こちらにまとめます。（GitHub の README にも書いたのですが、無理して英語で書いてしまったのでわかりにくくなってしまったもので...）

## ソースコード
* https://github.com/a-know/goramoph
* PR歓迎です

## 準備
### Google Cloud SDK をダウンロード・インストール・認証する
* https://cloud.google.com/sdk/
    * こちらもどうぞ http://qiita.com/yuko/items/1c4ee5b081c5b6a3ac8a
    * `zsh` をお使いの場合、http://tsukaby.com/tech_blog/archives/482 もご参考まで。
    * `gcloud` コマンドが使用可能になっていればOKです
* 最低限、下記の権限についての承認が必要です
    * `Google Cloud Storage`
    * `Google BigQuery`

### `Goramoph` 用の Google Cloud プロジェクトを作成する
* https://console.developers.google.com/ にアクセスし、サインインしてください
* `Create Project` ボタンを押し、プロジェクトを作成します
    * プロジェクト名は任意の文字列を指定して下さい
    * プロジェクトIDには、ユニークな文字列を指定して下さい (ex. `a-know-goramoph` )
* `Google Cloud Storage`, `Google BigQuery` を使用するため、課金設定が必要です。
* `gcloud` コマンドを用いて、作成したプロジェクトを設定します
    * `$ gcloud config set project <project-id>`
    * ex. `$ gcloud config set project a-know-goramoph`

### `Goramoph` を clone する
* `$ git clone git@github.com:a-know/goramoph.git`
    * `go get` したものでも問題ないかどうかは確認できていません、すみません
* これで準備完了です

## 使用方法
* 基本的には `$ go run goramoph.go /path/to/iTunes Music Library.xml` を実行すればOKです
    * 通常、`iTunes Music Library.xml` は "ミュージック" などのフォルダ内の iTunes 関連フォルダにて管理されています

```
$ go run goramoph.go ~/Downloads/iTunes\ Music\ Library.xml

Starting goramoph.
xml parsing...done
exporting csv...done
getting Google Cloud Project name...project_name: a-know-goramoph_test
checking bucket...bucket has not created yet, now creating...bucket create success
uploading csv...done
checking dataset...dataset has not created yet, now creating...dataset create success
checking table...this playdata has not load yet, now loading...load to table success
remove csv file on Cloud Storage...done

completed.
```

* `iTunes Music Library.xml` の最終更新日を元に csvファイル・BigQuery テーブルの作成を行います
    * なので、`Guard` とかと組み合わせると幸せになれるかもしれません :)


## スクリーンショット
* 例えば `SELECT Artist, Count(PlayCount) as count FROM [a_know_goramoph_ds.20141108135449] GROUP BY Artist order by count desc` というような SQL を BigQuery に投げることで、"アーティスト毎の再生回数" が取得できたりします

![スクリーンショット 2014-11-26 23.27.09.png](https://qiita-image-store.s3.amazonaws.com/0/32612/00823a72-9c74-c900-8ec1-5749affe3e1e.png)


↑こんなかんじです

* 複数のテーブルを跨った SQL を投げたりすれば、"期間における再生回数順で楽曲をリストアップ" とかもできると思います

## `Goramoph` の挙動
1. `iTunes Music Library.xml` をパースします。
2. パースした結果を csv ファイルとして、`./csv` に出力します。
    * csv ファイル名は、`iTunes Music Library.xml` の最終更新日を利用します。
3. csvファイルを `Google Cloud Storage` にアップロードします。
    * バケット名は `<project-id>-csv` です
4. csvファイルの内容を `Google BigQuery` の データセット・テーブルにロードします。
    * データセット名は `<project-id>_ds` です
    * テーブル名は `<last-modify-date>` です
5. `Google Cloud Storage` にアップロードしたファイルを削除します
    * ローカルのファイルは削除せずそのままです

## 注意点など
* `Google Cloud Storage`, `Google BigQuery` との連携は、`gcloud` を外部コマンド呼び出しすることで実現しています
    * ゆくゆくは外部コマンドに頼らない形にしていければと思っています
* `Google Cloud Storage`, `Google BigQuery` は課金設定が必要なサービスです
    * 課金については、ご利用の前に十分にご確認下さい。
    * `Goramoph` を利用したことによる課金額に関しては一切関知致しませんので、ご了承下さい。

## 今後の予定
* 以前作成した下記のようなソフトウェア・サービスがあるのですが、いつかは `Goramoph` をそれらに繋げたいな〜っと思っています。
    * [sa-boom client](http://blog.a-know.me/entry/20990331/1291811055)
        * JavaFX で作成
    * [sa-boom!!](http://sa-boom.appspot.com/)
        * `Google App Engine / Java` で作成