【5.14.0で対応済】Twitter gem 5.13.0 ではまだ Twitter の Video API に対応していないため GitHub のブランチを使って bundle install（暫定対応）

# 5.14.0リリース（2015/2/14追記）
>VERSIONS: 5.14.0 - February 14, 2015 (73.5 KB)
[twitter | RubyGems.org | your community gem host](https://rubygems.org/gems/twitter/versions/5.14.0)


>###5.14.0
* Add `Twitter::Media::Video`, `Twitter::Media::VideoInfo`, and `Twitter::Media::Variant`
* Add `Twitter::Media::AnimatedGif` media entity

>[twitter/CHANGELOG.md at master · sferik/twitter](https://github.com/sferik/twitter/blob/master/CHANGELOG.md)

ということで git 指定の `bundle install` を行わなくても、通常通り `gem install twitter` で OK です。

# Videos on Twitter 始動
ツイッター公式 blog の記事に 1/27 に公開されたように、30秒以内の動画をツイート出来るようになりました。
[Twitterの新機能：グループダイレクトメッセージと動画の投稿 | Twitter Blogs](https://blog.twitter.com/ja/2015/0127video)

# ビデオ入りツイートの例
上記記事にも引用されている、今年のアカデミー賞の司会者ニール・パトリック・ハリス（[@ActuallyNPH](https://twitter.com/ActuallyNPH)）のツイート

<blockquote class="twitter-tweet" lang="en"><p>Check out my Twitter video <a href="https://twitter.com/hashtag/Oscar?src=hash">#Oscar</a> exclusive! I gots me a scoop! <a href="http://t.co/SGQ3oJHDqZ">pic.twitter.com/SGQ3oJHDqZ</a></p>&mdash; Neil Patrick Harris (@ActuallyNPH) <a href="https://twitter.com/ActuallyNPH/status/560049149836808192">January 27, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

を例にして、具体的に見てみましょう。

```rb
client.status(560049149836808192).attrs
#=> {
 :created_at=>"Tue Jan 27 12:18:17 +0000 2015",
 :id=>560049149836808192,
 :id_str=>"560049149836808192",
 :text=>
  "Check out my Twitter video #Oscar exclusive! I gots me a scoop! http://t.co/SGQ3oJHDqZ",
 :source=>
  "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>",
 :truncated=>false,
 :in_reply_to_status_id=>nil,
 :in_reply_to_status_id_str=>nil,
 :in_reply_to_user_id=>nil,
 :in_reply_to_user_id_str=>nil,
 :in_reply_to_screen_name=>nil,
 :user=>{ 略 }
 :geo=>nil,
 :coordinates=>nil,
 :place=>nil,
 :contributors=>nil,
 :retweet_count=>2382,
 :favorite_count=>7590,
 :entities=>
  {:hashtags=>[{:text=>"Oscar", :indices=>[27, 33]}],
   :symbols=>[],
   :user_mentions=>[],
   :urls=>[],
   :media=>
    [{:id=>560049056895209473,
      :id_str=>"560049056895209473",
      :indices=>[64, 86],
      :media_url=>
       "http://pbs.twimg.com/ext_tw_video_thumb/560049056895209473/pu/img/apUFQOR0KnjekwfP.jpg",
      :media_url_https=>
       "https://pbs.twimg.com/ext_tw_video_thumb/560049056895209473/pu/img/apUFQOR0KnjekwfP.jpg",
      :url=>"http://t.co/SGQ3oJHDqZ",
      :display_url=>"pic.twitter.com/SGQ3oJHDqZ",
      :expanded_url=>
       "http://twitter.com/ActuallyNPH/status/560049149836808192/video/1",
      :type=>"photo",
      :sizes=>
       {:small=>{:w=>340, :h=>340, :resize=>"fit"},
        :thumb=>{:w=>150, :h=>150, :resize=>"crop"},
        :medium=>{:w=>600, :h=>600, :resize=>"fit"},
        :large=>{:w=>720, :h=>720, :resize=>"fit"}}}]},
 :extended_entities=>
  {:media=>
    [{:id=>560049056895209473,
      :id_str=>"560049056895209473",
      :indices=>[64, 86],
      :media_url=>
       "http://pbs.twimg.com/ext_tw_video_thumb/560049056895209473/pu/img/apUFQOR0KnjekwfP.jpg",
      :media_url_https=>
       "https://pbs.twimg.com/ext_tw_video_thumb/560049056895209473/pu/img/apUFQOR0KnjekwfP.jpg",
      :url=>"http://t.co/SGQ3oJHDqZ",
      :display_url=>"pic.twitter.com/SGQ3oJHDqZ",
      :expanded_url=>
       "http://twitter.com/ActuallyNPH/status/560049149836808192/video/1",
      :type=>"video",
      :sizes=>
       {:small=>{:w=>340, :h=>340, :resize=>"fit"},
        :thumb=>{:w=>150, :h=>150, :resize=>"crop"},
        :medium=>{:w=>600, :h=>600, :resize=>"fit"},
        :large=>{:w=>720, :h=>720, :resize=>"fit"}},
      :video_info=>
       {:aspect_ratio=>[1, 1],
        :duration_millis=>30008,
        :variants=>
         [{:bitrate=>832000,
           :content_type=>"video/webm",
           :url=>
            "https://video.twimg.com/ext_tw_video/560049056895209473/pu/vid/480x480/gj_fzyk29R9dMPBY.webm"},
          {:bitrate=>832000,
           :content_type=>"video/mp4",
           :url=>
            "https://video.twimg.com/ext_tw_video/560049056895209473/pu/vid/480x480/gj_fzyk29R9dMPBY.mp4"},
          {:bitrate=>1280000,
           :content_type=>"video/mp4",
           :url=>
            "https://video.twimg.com/ext_tw_video/560049056895209473/pu/vid/720x720/S7F4BF2wKR2txCpA.mp4"},
          {:bitrate=>320000,
           :content_type=>"video/mp4",
           :url=>
            "https://video.twimg.com/ext_tw_video/560049056895209473/pu/vid/240x240/v5jqpUNnkaeuVZbx.mp4"},
          {:content_type=>"application/x-mpegURL",
           :url=>
            "https://video.twimg.com/ext_tw_video/560049056895209473/pu/pl/udxtIM8FytsAE4HQ.m3u8"}]}}]},
 :favorited=>false,
 :retweeted=>false,
 :possibly_sensitive=>false,
 :lang=>"en"}
```
ということで、 `entities` には互換のために `type`が `"photo"` で登録されサムネイル URL へのリンクが含まれており、実際の動画 URL は `extended_entities` の `video_info` 以下に記載されています。こちら側の `type` は当然ながら `"video"` になっています。
また、色々な形式の動画へのリンクが張られていることも分かりますね。

* WebM、サイズ480x480、ビットレート832Kbit/s
* MP4、サイズ480x480、ビットレート832Kbit/s
* MP4、サイズ720x720、ビットレート1.28Mbit/s
* MP4、サイズ240x240、ビットレート320Kbit/s
* M3U8（HLS/H264）（サイズ240x240、ビットレート320Kbit/s）

（なお、それぞれのビットレートは最大値だと思われます。）

# `Twitter::Tweet#media` を呼び出すとエラーになる
動画が含まれたツイートを対象にして、 `Twitter::Tweet#media` （正確には `Twitter::Entities#media`） に含まれるメソッドを呼び出すとエラー（ `NameError - uninitialized constant Twitter::Media::Video` ）になります。
Twitter gem 5.13.0 では、例えばツイートに含まれる写真の URL を取得しようとするメソッドを作った場合、ビデオが含まれるツイートに対してそのメソッドを使うとエラーが発生します（2/8 訂正）。
###2/8 訂正内容
上記行は
>例として、ビデオが含まれるツイートを対象として、それに含まれる写真の URL を取得しようとすると、 Twitter gem 5.13.0 ではエラーが発生します。

と書いていましたが、
> 1ツイートに写真と動画を混ぜて投稿することはできない
>[Twitterの30秒動画の撮影機能(video.twimg.com)のiphoneアプリでの現状の仕様まとめ - Qiita](http://qiita.com/AKB428/items/5d1db9cc932674bf9ced)

とのことなので訂正しました。
# 既に Video 対応したメソッドはプルリクされている
[sferik/twitter at 3566739b46ba75abc55cca8cd99e3b56b4d11d18](https://github.com/sferik/twitter/tree/3566739b46ba75abc55cca8cd99e3b56b4d11d18)
ので、これを使えばいいですね。
今回は、 Video 対応のプルリクに加えて作者が若干変更したもの
[sferik/twitter at 1ac62c40ab6a794d6974a36e2b8635aee167b326](https://github.com/sferik/twitter/tree/1ac62c40ab6a794d6974a36e2b8635aee167b326)
を使います。

# bundler を使う
bundler を使えば git を対象とした gem install を行えます。
>Specify that a git repository should use a particular ref, branch, or tag

>```
:git => 'https://github.com/rails/rails.git', :ref => '4aded'
:git => 'https://github.com/rails/rails.git', :branch => '2-3-stable'
:git => 'https://github.com/rails/rails.git', :tag => 'v2.3.5'
```

>Specifying a ref, branch, or tag for a git repository specified inline works exactly the same way

>```
gem 'nokogiri', :git => 'https://github.com/tenderlove/nokogiri.git', :ref => '0eec4'
```
[Bundler: The best way to manage a Ruby application's gems](http://bundler.io/git.html)

```rb:Gemfile
source "https://rubygems.org"

gem 'twitter', git: 'git@github.com:sferik/twitter.git', ref: '1ac62c40ab6a794d6974a36e2b8635aee167b326'
```
あとはご自身の必要な gem も Gemfile に登録しておいて下さい。

そして、 `bundle install` するのですが、今回は必ず `--path` オプションをつけて gem を置く場所を指定しておきましょう。

```bash
$ bundle install --path vender/bundle
Fetching git@github.com:sferik/twitter.git
Fetching gem metadata from https://rubygems.org/.........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
　：
Using twitter 5.13.0 from git@github.com:sferik/twitter.git (at 1ac62c4)
Using bundler 1.7.12
Your bundle is complete!
It was installed into ./vender/bundle
　：
```
これで `bundle exec` で実行すれば良いでしょう。

#最後に
`Twitter::Media::Video` に加えて `Twitter::Media::AnimatedGif` というものにも対応するため、近々 5.14.0 が出るはずです。
[uninitialized constant Twitter::Media::AnimatedGif · Issue #653 · sferik/twitter](https://github.com/sferik/twitter/issues/653)