mikutterをいじりたおす 第6回

動画を投稿します。第1回はこちら

動画投稿実装

第5回までで、画像を投稿することができるようになった。ついでだから、動画も投稿したい。冷静に考えて公式クライアントじゃないと動画投稿できないのは不便だし、他に動画投稿できるクライアントを知らない。何でだ。

実装フロウ

  1. 動画投稿をとにかくやってみる
  2. サムネイルを作る

画像投稿の際に作ったものをたくさん流用するので、今回は実装少なめ。

動画を投稿する

いきなりゴールみたいなタイトル。とりあえずファイル名をソースコードに直打ちして動画の投稿自体ができるかどうかだけ試してみよう。

画像投稿の時はmikutterコンソールからやったのだが、動画の場合はサクッとできるシロモノではないので、ソースにコードをゴリゴリ書いてからテストすることになる。

動画投稿のAPI自体は画像投稿と同じなのだが、今回はmedia/upload chunkedを使う。動画を全部まるごと投稿するのは無理なので、ちょびちょびアップロードする、という感じだ。どうやるかはUploading Mediaを見ればイトヒキイワシでもわかる。

そのまえに、media/uploadをたくさん使うのでちょっと分割した。何度も同じことを書くのは美しくないので以下のようにしておいた。post_with_picturesの中ではこれを呼び出すようにするとよい。

さて、前回はpost_with_pictures関数を作ったので、今回はpost_with_video関数にしよう。流れとしては

  1. INIT送る
  2. APPENDを2MBごとに送る
  3. FINALIZE送る
  4. statuses/update送る

という形。それぞれをDeferredのnextで分割したことでわかりやすくなった。今までやってきたことを全部あわせただけなので難しくない。2MBは適当に決めた。3MBよりは小さいほうがいいんだと思う。

つぎに、投稿の関数を書き換えて様子を見る。

に書き換える。post_with_videoをDeferredで実装したからこそなせる技だ。これで画像なしツイートをすると動画付きツイートが投稿されるはず。重い動画だと時間が掛かるがご愛嬌。

GUIの実装

一旦うえの実装は戻してGUIの実装をしよう。といっても画像と同じように動画が追加できるようになればいい。ただ、「動画を投稿するときは同時に画像が投稿できない」という制限を守るような実装をしなければいけない。あとは@picturesをパット見で動画であることがわかるようにHashのなかに:is_videoというキーを入れておきたい。この辺を実装していこう。

まずは条件で弾くところから。

次は@picturesの配列に入れるHashにis_videoのキーを入れておく。

さて次はサムネイルを作る。調べてみると、avconvというコマンドを使えばよさそうだとわかる(参考)。とりあえずapt-get install libav-toolsをしてavconvをインストールし、サムネイルが出力されるかやってみよう(ffmpegが使えるならそちらでもよい)。

ここで標準出力を使っているが、標準出力であればファイルに書き出すことなくプログラムからサムネイルが作れるのでこれを使った。出力ファイル名を-にすると標準出力に出るというのは暗黙のルール。

さて、test.jpegに正しいJPEGファイルが作られたことを確認したらこれを実装しよう。このへんを見ると、PixbufLoaderを使えばメモリからPixbufが作れるらしい。PixbufLoader.new→last_write→pixbuf取得の流れでよいか。

このままPixbufを作ると実サイズで画像がボタンの上に表示されてしまうので、あとでPixbufのscale関数でPixbufを小さくする。この辺をすべて実装するとこんな感じ。

post_itの実装

これでもう動画は正しく@picturesに追加できたので、あとはpost_itで振り分けるだけだ。@picturesに要素があって、1つめの要素の:is_videoがtrueなら動画投稿に回すようにしよう。

post_with_videoの中でさきほどファイル名を適当に直打ちしていたので、ここを@pictures[0][:path]に書き換える。

さらにpost_itを以下のようにif文で分けることで動画が投稿できるようになるはずだ。

動画投稿、完成!

補足

Thread.new{…}.next{…}と実行した時、nextブロックはメインスレッドで動くようです。よくできてますね。知りませんでした。Thread::currentを出力してやると動きがわかりやすいと思います。

次回予告

次回は動画を再生します。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です