放映中のアニメ作品の情報を提供するAnime RESTful API サーバー作りました 

現在放映されているアニメ作品の公式アカウントのグラフ化をするanime_followerというTwitterボットを作っています。
https://twitter.com/anime_follower


![CERCRBdXIAERWfn.png-large.png](https://qiita-image-store.s3.amazonaws.com/0/36931/630c4d46-1b34-b2ac-c654-237a79f643de.png)

こんなの

システムの構成図は以下です

## 現行システム構成図


![OLD-sora.png](https://qiita-image-store.s3.amazonaws.com/0/36931/525d9090-3bac-655a-114b-19154c7db410.png)

アニメ作品を管理するデータベースとアプリケーションサーバーがペアとなって、メイン系統と待機系で別々の場所の物理サーバーで稼働しています。

でもこの構成って面倒なんですよね。
データベースの同期をとったりするのが面倒なのでREST化したかった。
なので、REST API化してデータベースは一本化することにしました。

## 新システム構成図

![sora.png](https://qiita-image-store.s3.amazonaws.com/0/36931/57e660bd-6f69-fb46-94b9-40c9ceb7db4e.png)

そもそも放送クールごとのアニメ作品のデータをちゃんと管理してREST APIで提供してくれるサービスがないんですよね。
テレビ番組系のAPIならあるんですが、公式URLとかTwitterアカウントとか監督名などのデータまで管理しているAPIはない。。
アニ◯イトとか、クールなんたらとかやってる某国がアニメなんたらIT協会とか作って提供してくれればいいんですが・・・。

[メディア芸術データベース](http://mediaarts-db.jp/)　←これもHTMLだけのデータ提供とかいう中世ジャップランド仕様だし。。血税使ってこれかよ。。

オタク作品系の体裁がととのった正確無比な情報って作れないから難しいのは確かにあるんですが。
データ間違ってたら責任誰がとるの問題とかあるし。。

## どの会社も作ってくれないのでAnime API作ってみた

つまるところ、今までDBでマスター管理してた部分をREST JSON化しただけです。
少なくとも自分が使うので一般APIとして公開してみます。

アニメ作品の情報とかそれぞれのオタク系のサービスのサイトでDBでマスター管理してると思うんですが本当無駄じゃないですかね。。。
なぜ作らなかった。。絶対そのうち黒船企業が作って日本企業（笑）なるいつものパターンな気がします。

## ShangriLa Anime API V1 仕様書

### 取り扱うデータ

2014年以降のアニメ作品
(※過去のも追加予定はあり)

### エンドポイント

http://api.moemoe.tokyo/anime/v1

### 認証

V1では認証を行いません。


### レートリミット

なし

### GET /anime/v1/master/cours

ShangriLa API Serverが持っているアニメ情報のクールごとの情報のリストを返却します。

#### Request Body

なし

#### Response Body

| Property     | Value               |description|Sample|
| :------------ | :------------------ |:------|:-------|
| cours_idの値 | Cours Object |cours_idはシステムで割り振ったクールごとのユニークなID(coursマスターのID)|1|

##### Cours Object

| Property     | Value               |description|Sample|
| :------------ | :------------------ |:------|:-------|
| id | Number  |cours_id|6|
| year| Number |該当する西暦(YYYY)|2015|
| cours| Number |yearの中での順番[１〜４]|2|


レスポンス例

```
 $curl http://api.moemoe.tokyo/anime/v1/master/cours | jq .

{
  "4": {
    "id": 4,
    "year": 2014,
    "cours": 4
  },
  "5": {
    "id": 5,
    "year": 2015,
    "cours": 1
  },
  "6": {
    "id": 6,
    "year": 2015,
    "cours": 2
  }
}
```


### GET /aime/v1/master/:year

:yearで指定されたYYYY年のアニメ1クールから4クールまでの情報をすべて返却します

#### Request Body

なし

#### Response Body

| Property     | Value               |description|Sample|
| :------------ | :------------------ |:--------|:-------|
| Array    |Base Object|データがない場合は空の配列|

##### Base Object

| Property     | Value               |description|Sample|
| :------------ | :------------------ |:--------|:-------|
| id    |Number|APIで管理するアニメ作品に割り当てられているユニークなID|125|
| title    |String|アニメ作品名|"冴えない彼女の育てかた"|


レスポンス例

```
curl http://api.moemoe.tokyo/anime/v1/master/2015 | jq .
[
  {
    "id": 124,
    "title": "幸腹グラフィティ"
  },
  {
    "id": 125,
    "title": "銃皇無尽のファフニール"
  },
  {
    "id": 126,
    "title": "冴えない彼女の育てかた"
  },
  {
    "id": 127,
    "title": "暗殺教室"
  },
  {
    "id": 129,
    "title": "探偵歌劇ミルキィホームズTD"
  }
]
```


### GET /anime/v1/master/:year/:n

:yearで指定されたYYYY年アニメの:nで指定されたクールの情報をすべて返します。

* /2015/1 だったら2015年1期(冬期) のアニメ作品情報を全て返却します。
* /2015/2 だったら2015年2期(春期) のアニメ作品情報を全て返却します。

#### Request Body

なし

#### Response Body


| Property     | Value               |description|Sample|
| :------------ | :------------------ |:--------|:-------|
| Array    |Base Object|データがない場合は空の配列||

##### Base Object

requiredに◯がないものは値なし(=データメンテナンスしていない)の場合があります。

またプロパティは追加される可能性があります。

| Property     |Value |Required|description|Sample|
| :------------|:-----|:-------|:----------|:-----|
| id           |Number|◯|APIで管理するアニメ作品に割り当てられているユニークなID|125|
| title        |String|◯|アニメ作品名|"冴えない彼女の育てかた"|
| title_short1 |String|-|アニメ作品名の略称1|"冴えカノ"|
| title_short2 |String|-|アニメ作品名の略称2||
| title_short3 |String|-|アニメ作品名の略称3||
| public_url   |String|◯|アニメ作品の公式URL|"http://www.saenai.tv/"|
| twitter_account|String|◯|ツイッターアカウント|"saenai_heroine"|
| twitter_hash_tag|String|◯|ツイッターハッシュタグ|"saekano"|
| cours_id     |Number|◯|coursマスターのID|5|
| created_at   |String|◯|データの作成日時|"2015-01-08 09:37:01.0"|
| updated_at   |String|◯|データの更新日時|"2015-01-08 09:37:01.0"|
| sex          |Number|-|男性向け=0, 女性向け=1|0|
| sequel       |Number|-|続編モノの場合は1以上の数値が入る|0|

レスポンス例

```
curl http://api.moemoe.tokyo/anime/v1/master/2015/2 | jq .
[
  {
    "title_short2": "",
    "twitter_account": "saenai_heroine",
    "public_url": "http://www.saenai.tv/",
    "title_short1": "冴えカノ",
    "sex": 0,
    "twitter_hash_tag": "saekano",
    "id": 126,
    "sequel": 0,
    "created_at": "2015-01-08 09:37:01.0",
    "cours_id": 5,
    "title": "冴えない彼女の育てかた",
    "title_short3": "",
    "updated_at": "2015-01-08 09:37:01.0"
  },
  {
    "title_short2": "",
    "twitter_account": "ansatsu_anime",
    "public_url": "",
    "title_short1": "暗殺教室",
    "sex": 0,
    "twitter_hash_tag": "暗殺教室",
    "id": 127,
    "sequel": 0,
    "created_at": "2015-01-08 09:38:00.0",
    "cours_id": 5,
    "title": "暗殺教室",
    "title_short3": "",
    "updated_at": "2015-01-08 09:38:00.0"
  },
]
```

## データの信頼性について

[anime_follower](https://twitter.com/anime_follower)のTwitterアカウントが1年半ぐらいほぼ問題なく24時間稼働しているので信頼性はそれがベースです。
少なくともツイッターのアカウント数のグラフ化は続けるためその間はマスターデータは更新されます。



## アニメ作品のデータの追加タイミング

対象のクールが始まる直前ぐらいにマスターは追加されます。
次は2015年6月末ぐらいに夏アニメのマスターが追加されます。


## ソースコード


サーバーのソース
https://github.com/Project-ShangriLa/sora-playframework-scala

## この記事以降に追加されたAPIのエンドポイント

https://github.com/Project-ShangriLa/sana_server