Twitter4J

Twitter4JのExtendedMediaEntity廃止について

More than 1 year has passed since last update.

概要

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の仕様変更により、この構成が破綻しつつある。

  1. [2016年3月] DirectMessageの動画対応時に(extended_entities.media ではなく)entities.mediavideo_info が追加された
  2. [2016年9月] 140文字拡張対応で、Streamingの140文字超ツイートに extended_tweet が追加されたが、GIF動画・動画・複数画像は (extended_tweet.extended_entities ではなく) extended_tweet.entities に載るようになった

以下、それぞれ詳しくみていく。

問題点1. DMの動画対応時に entities.mediavideo_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_textextended_tweet.entitiesStatus.text などにマージする形にしたが、media については MediaEntity としてマージされるようになった。

従って、下記2点の問題が生まれた。

解決策

2つの PR に分けて行う。

現状、support "video_info" for direct messages by takke · Pull Request #234 · yusuke/twitter4j のPRで DirectMessage の video_info 対応を行っていますが、これを破棄し、下記の2段階で修正を行う。

  1. MediaEntityExtendedMediaEntity 相当にする
  2. ExtendedMediaEntity を廃止する
    • extended_entities.mediaentities.media すなわち MediaEntity に merge する
    • 問題点2(A) が解決する
    • PR #250 で修正した。