CoreTweetで30秒を超える動画をTwitterにアップロードしてみる

Twitter の Media API が更新され、公式クライアント以外からでも最大140秒の動画がアップロードできるようになりました。

ここでは、.NET用のTwitter APIライブラリCoreTweetにて当該の操作が可能だったため2016年6月23日正午時点での情報を綴ります。おそらく今後すぐにこの操作はもっと楽になると思われるので、ご注意ください。

APIの仕様

まず、アップロード可能な動画に関する情報は従来通りUploading Media | Twitter Developersに掲載されています。今回の仕様変更により一部の制限が以前より緩和されています。

APIを叩く手順は以前と比べて1段階追加されました。
日本語で@mpyw氏によりQiitaにまとめられています。
TwitterAPIのアップロード系エンドポイントまとめ (140秒動画対応) – Qiita

以前と比較するとおおまかには

Before:

  1. INIT
  2. APPEND
  3. FINALIZE

After:

  1. INIT (media_category指定必須)
  2. APPEND
  3. FINALIZE
  4. STATUS

と言った感じです。
以前はFINALIZEでファイナライズが完了するまで待っていましたが、今回より「FINALIZEはファイナライズ開始」、「STATUSが官僚を示すまで待つ(state: “in_progress”ではなくなるまで)」という手順に分割されました。

※なお、この手順では動画アップロードに失敗した際(140秒を超える場合など)については対応出来ていません。おそらくどこかで……最悪ツイート送信ではエラーが出るので

CoreTweetで試す

現在の最新リリースされているCoreTweetはSTATUSコマンドに対応していません。が、既にSTATUSコマンドに対応しているブランチ、uploadstatusが存在するのでこれを利用します。
なお、このブランチのバイナリはNightly Buildとしては配布されていないため、自分でチェックアウトしてビルドする必要があります。ビルドの方法についてはCoreTweetのREADMEをご覧ください。

同日のアップデート
(0.6.4)より非同期アップロードがサポートされました。

☆ Tokenオブジェクトを既にtokenとして用意してることを前提としたコードを示します。

まず、従来のものを以下とします。

Wikiに書かれてるコードをAsyncにしただけの単純なコードですね。

これに今回の変更を適用すると、例えば次のようなコードになります。

変更点は2点。まず、INITコマンドに渡すパラメータとしてmedia_category = "tweet_video"を追加しました。この値がないと非同期アップロードとならないので注意。

また、処理が終了するまでSTATUSコマンドを叩く必要があるのでMedia.UploadStatusCommandAsyncをポーリングします。processing_info.stateがin_progressでなくなるまで、processing_info.check_after_secs秒(原状固定値5?)寝かせながら。
なお、この際processing_info.progress_percentにファイナライズの進行状況(%)が入っています。

stateは、“pending” -> “in_progress” -> [“failed” | “succeeded”]の順に値を持つようですが、pendingまで無限ループにするとエラーが起こっているのにずっとpending といった状況がみられるようなので(またそれ以外のFINALIZE開始後の場合にpendingになっているのを確認できないため)ループ条件からは除外しています。
failed時はそれ用の分岐を作って例外を投げてもいいかもしれません。この際エラーが含まれるはずですが、どうやら非常にざっくりすぎるようなので無視しました。

なお、場合によりTwitterAPIでよくみかけるエラーの形が変えることもあるらしい。

エラー時はそのまま突き進んでもStatuses.UpdateAsyncで従来通りの例外を吐くので、合わせてtry-catchしておけばいいかと思います。

以上がCoreTweetで最大140秒の動画をアップロードする場合です。

なお、今後おそらくもっと手軽にこのアクションが出来るようになろうと思われるのでご期待ください。(上記のコードが使えなくなるかもしれません。)

なお、Twitterは140秒以上の動画だって上げれてしまう模様……

ちなみに、いわゆる公式キーを使用した場合、140秒を超える(確認済みでは5分)動画もアップロード出来るようでした。

わけがわからないよ……

6/23 のアップデートによりUploadChunkedは非同期アップロード時に自動的にSTATUSコマンドを叩くようになりました。また、failed時にはMediaProcessingExceptionを投げます。

コメントを残す