概要
Twitter4JのExtendedMediaEntity
とは、extended_entities.media
を表現するオブジェクトで、これが2016年9月現在、Twitterの度重なる仕様変更でいろんな面で問題になっているので、問題点を整理し、解決策をまとめておく。
問題点
TwitterのGIF動画・複数画像対応時に Tweet の JSON (Twitter4JのStatusオブジェクト) に extended_entities.media
が追加された際に、新たに EntendedMediaEntity
を追加した(Multiple image support by takke · Pull Request #156 · yusuke/twitter4j)。
その後のTwitterの仕様変更により、この構成が破綻しつつある。
- [2016年3月] DirectMessageの動画対応時に(
extended_entities.media
ではなく)entities.media
にvideo_info
が追加された - [2016年9月] 140文字拡張対応で、Streamingの140文字超ツイートに
extended_tweet
が追加されたが、GIF動画・動画・複数画像は (extended_tweet.extended_entities
ではなく)extended_tweet.entities
に載るようになった
以下、それぞれ詳しくみていく。
問題点1. DMの動画対応時に entities.media
に video_info
が追加された
video_info
は現時点で ExtendedMediaEntity
がパースする実装になっているため DM の動画対応ができない。
そこで、support "video_info" for direct messages by takke · Pull Request #234 · yusuke/twitter4j のPRで video_info があれば ExtendedMediaEntity オブジェクトを作成するようにしているが、これはいささか奇妙な実装で、アプリ側で動画を判定する際に instanceof ExtendedMediaEntity
をチェックする必要があるなど、非常に使いづらい。
問題点2. Streamingの140文字超ツイートに extended_tweet.extended_entities
が含まれない
Streamingの140文字超ツイートには互換性を考慮して extended_tweet
が追加されたが、GIF動画・動画・複数画像は extended_tweet.extended_entities
ではなく extended_tweet.entities
に載るようになった。
互換性の観点から Support extended tweets by takke · Pull Request #247 · yusuke/twitter4j の PR では extended_tweet.full_text
や extended_tweet.entities
は Status.text
などにマージする形にしたが、media については MediaEntity
としてマージされるようになった。
従って、下記2点の問題が生まれた。
- (A) これまでアプリ側では画像や動画が必要な際に、
Status.getExtendedMediaEntities()
があればそれを、なければStatus.getMediaEntities()
を使っていたが、「Streamingの際はStatus.getMediaEntities()
を優先する」必要があるようになった。 - (B) さらに、GIF画像や動画の場合、
extended_tweet.entities.media
にvideo_info
が載るので DM と同様に動画対応できない。
解決策
2つの PR に分けて行う。
現状、support "video_info" for direct messages by takke · Pull Request #234 · yusuke/twitter4j のPRで DirectMessage の video_info
対応を行っていますが、これを破棄し、下記の2段階で修正を行う。
-
MediaEntity
をExtendedMediaEntity
相当にする- これで PR #234 は不要になる
- 問題点1 と 問題点2(B) が解決する
-
ExtendedMediaEntity
の実装をMediaEntity
に移すだけなのでextended_tweet
対応のPR で修正した。具体的にはコレ⇒ https://github.com/yusuke/twitter4j/pull/247/commits/0f37a6ab371bad40c3b984ebc252f168c1755b94
-
ExtendedMediaEntity
を廃止する-
extended_entities.media
はentities.media
すなわちMediaEntity
に merge する - 問題点2(A) が解決する
- PR #250 で修正した。
-