Vine Playerの公開とVineの動画をAndroidで再生するお話

またアプリ作りました。
最近ジワジワユーザーが増えているVineの動画を閲覧するためのアプリです。


 私の周りでVineを使っている人はそんなにいませんが(というかVineで検索しても外人ばかり出てくる)、公式アカウントなどでアップロードする動画がこれだったりします。その度にVineアプリを起動するのも面倒なので(あれ重いよね)、もっと機能少なめでいいから再生だけできるようにしようというのがこのアプリの作ったきっかけです。
アプリはこちらから↓

Get it on Google Play

んで、このアプリの中で何やってるの、ということで、大体の説明をします。

まず、Vineの動画URLは"ttps://vine.co/v/***"という形が基本です(***は英数字の文字列)。そのURLを開くとVineの動画が見られるわけですが、そのページのソースを見ると、動画自体はただのMPEG4であることがわかります。
じゃあそのMPEG4の動画をストリーミング再生して、ついでに再生が終了したらまた先頭から再生してあげれば本家みたいにループするよね、ということで、やっていることはこれだけです。
実際にはDialogFragmentで動画を再生させている(これが一番面倒臭かった)のですが、別にそこはどうだっていいので、とりあえずVineのソースを取ってきてURLを取得し、動画を再生するところだけ書こうと思います。

HTMLソースを取得してURLを取り出す

public String getMediaURL(String shortenUrl){
    HttpClient httpClient = new DefaultHttpClient();
    HttpGet get = new HttpGet(shortenUrl);
    HttpResponse res = null;

    try {
        res = httpClient.execute(get);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
    try {
        String source = EntityUtils.toString(res.getEntity());
        if(source.contains("<title>Page not found")){
            return null;
        }
        if(shortenUrl.endsWith("postcard")||shortenUrl.endsWith("simple")){
            int pos = source.indexOf("<source src=\"");
            return "https:"+source.substring(pos+13,source.indexOf("\" type",pos));
        } else if (!shortenUrl.endsWith("embed")||!shortenUrl.endsWith("/")){
            int pos = source.indexOf("property=\"twitter:player:stream\"");
            return source.substring(source.indexOf("content=\"", pos)+9,source.indexOf("\">",pos));
        }
    } catch (ParseException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

やっていることはただソースを取得してURLのところだけ切り取っているだけなので、説明は省きます。

ビデオ再生

Uri video = Uri.parse(getMediaURL(shortenUrl));
VideoView videoView = (VideoView)findViewById(R.id.videoView1);
videoView.setVideoURI(video);
videoView.requestFocus();
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    public void onPrepared(MediaPlayer mp) {
        videoView.start();
    }
});
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
    @Override
    public void onCompletion(MediaPlayer mp) {
        videoView.seekTo(0);
        videoView.start();
    }
});

こちらはビデオを再生するところだけです。VideoView#setOnPreparedListener以下の処理はビデオの準備が整った時に呼び出されます。また、VideoView#setOnCompletionListener以下の処理はビデオの再生が完了した時に呼び出されます。
やっていることは大体こんな感じです。全然面倒ではないので、全国のTwitterクライアント製作者の方々は、Vine再生機能をつけて、他のアプリと差別化を図ってみてはいかがでしょうか。