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


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

こんなの

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

現行システム構成図

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

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

新システム構成図

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

メディア芸術データベース ←これもHTMLだけのデータ提供とかいう中世ジャップランド仕様だし。。血税使ってこれかよ。。

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

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

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

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

ShangriLa Anime API V1 仕様書

取り扱うデータ

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

エンドポイント

認証

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の中での順番[1〜4] 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のTwitterアカウントが1年半ぐらいほぼ問題なく24時間稼働しているので信頼性はそれがベースです。
少なくともツイッターのアカウント数のグラフ化は続けるためその間はマスターデータは更新されます。

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

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

ソースコード

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

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