mattak's blog

人生を1ミリ進める

声優の名前から出演アニメを出すAPIをつくろう

IRCで声優名から出演アニメをだしたい.

format

  1. キャラクター名から声優名を出す.

    !cv 戦場ヶ原ひたぎ => 斉藤千和

  2. 声優名からキャラクター名(出演アニメ)を出す.

    !cv 洲崎綾 => 星白 閑 (シドニアの騎士) => 北白川 たまこ (たまこまーけっと)

キャラクター名はできれば今期前期のものに限る. (or 新しい順)

APIの方針

  • DBをもつ
  • 独自にデータを追加修正できる
  • 基本データはwiki, 番組表API, syobocalなどから取得する
  • Openである
  • 利用制限がない
  • データはtextのみ、上限100MBほどを期待する.

いくつかホスティングに利用するサービスをピックアップする.

とりあえず、現状での学習コストと実装工数が少なそうなherokuで試して、 データがあふれるようならばバックエンドを他のサービスに切り替える感じだろうか.

APIの設計

httpでアクセス可能なopen apiを用意する。 その上で、CLIクライアントを作成する。

番組一覧

/program

[
   { program_id: "", title: "", from: "", ... }
   ...
]

/program/<program_id>

{
    program_id: "112233",
    title: "ジョジョの奇妙な冒険 第3部 -スターダストクルセイダース-",
    from: "2014-04-04",
    characters: [ // XXX: same as /character/<character_id>
      { character_id: "44556677", "name": "空条 承太郎", "voice": "小野大輔" },
      ...
    ]
    staffs: [ // XXX: same as /staff/<staff_id>
      { staff_id: 22446677", name: "津田尚克", role: "ディレクター" }
      ...
    ]
}

/program/<program_id>/characters

[
    { character_id: "44556677", "name": "空条 承太郎", "voice": "小野大輔" },
    ...
]

/program/<program_id>/staffs

[
    { staff_id: 22446677", name: "津田尚克", roles: ["ディレクター"] }
    ...
]

キャラクター情報

/character

[
    { character_id: "44556677", name: "空条 承太郎", voice: "小野大輔", program_id: "11223344" }
    ...
]

/character/<character_id>

{
    character_id: "44556677",
    name: "空条 承太郎",
    voice: "小野大輔",
    program_id: "11223344"
}

声優情報

/actor

 [
     { actor_id: "", name: "", ... }
 ]

/actor/<actor_id>

{
    actor_id: "778899",
    name: "小野大輔",
    birth: "1978-05-04",
    characters: [ // XXX: same as /character/<character_id>
        { character_id: "", program_id: "", name: "", voice: "", ... },
        ...
    ],
    programs: [ // XXX: same as /program/<program_id>
        { program_id: "", ...}
        ...
    ]
}

スタッフ情報

/staff

[
    { staff_id: "22446677", name: "津田尚克", role: "ディレクター" }
    ...
]

/staff/<staff_id>

[
     { staff_id: "", name: "", ... }
     ...
]

railsつかう

なんだかんだでrails触ったことなかったのでこの際に勉強する. - https://devcenter.heroku.com/articles/getting-started-with-rails4

$ gem i rails
$ rails -v
Rails 4.1.0
$ rails new character-voice --database=mysql
$ cd character-voice
$ rails generate controller root
$ bin/rake db:create db:migrate
$ rails server
$ open http://localhost:3000/

とりあえず、表示できた。

slim と rspecを導入

参考: http://qiita.com/mist_dev/items/a1992ca24cc73c1e5154

Gemfile

+# slim
+gem 'slim-rails'
+
+group :test do
+  gem 'rspec'
+  gem 'rspec-rails'
+end

test

テストデータベース作成

$ bundle exec rake db:create db:migrate RAILS_ENV=test

テスト

$ bundle exec rake test

MVC作成

programを作成

$ rails generate scaffold program title:string from:date

seedを追加.

Program.create(title: '僕らはみんな河合荘', from: Date.new(2014, 4, 3))
Program.create(title: '悪魔のリドル', from: Date.new(2014, 4, 3))

サーバーを再起動.

$ rake db:create db:migrate
$ rails server

アクセス.

characterもついか。 テーブルを関連付けする。

app/models/program.rb

class Program < ActiveRecord::Base
  has_many :characters
end

app/views/programs/index.json.jbuilder

json.extract! program, :id, :title, :from, :characters

テーブルの関連付け

下記を参考.

中間テーブルに属性があったので、has_and_many_belongs_toはりようしなかった。

スクレイピング

wikipediaから情報を抜こうと思う.

casperjsをつかってみる。