Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

JavaFXでYouTubeのダウンローダ的なサンプルを作ってみる ~動画の自動再生と履歴ページ遷移~

ブログと関係ないですが、昨日から堀北真希さん主演ドラマ「ミス・パイロット」が始まりました(^^)/システム屋らしく緊急対応で観れないっていう残念な事態になりましたが…とほほ(-_-;

まあ、録画したので、後日楽しみます。フジテレビの公式サイトはこちら↓
http://www.fujitv.co.jp/misspilot/index.html

……

宣伝はさておき、今日は先日サンプルで作ったJavaFXのYouTubeダウンローダ的なサンプルを少し改造しました。作ったときのブログはこちら↓
JavaFXでYouTubeのダウンローダ的なサンプルを作ってみる

すごいショボイですが、以下2つトライしました。

  • ダウンロードが終わったら動画を自動再生する
  • サイトの履歴を表示して、選択した履歴を表示できるようにする

ダウンロードが終わったら動画を自動再生する

本当は落としたファイルをJavaFXのMediaViewで観れるようにしてみよう!とか思ったのですが、SceneBuilderにMediaViewがない(^^;そういうものなのかな。

あと、YouTubeで落とした動画もWEBM形式というのに(最近?)なっているので、MediaViewが使えても再生できるかわからなかったので、とりあえずベタにChromeのexeを叩いて実行する、という方法でやりました。

Javaからexe叩く方法は以下サイトを参考にさせて頂きました。
ひしだまさんのサイト 外部プロセス起動

実行結果はこんな感じ。

起動するとYouTubeページを表示

f:id:kikutaro777:20131016192734j:plain

せっかくなので「ミスパイロット」で検索して

f:id:kikutaro777:20131016192822j:plain

適当な動画を選びます。
ジャケット着る姿が超りりしい (*´Д`)ハァハァ

f:id:kikutaro777:20131016192846j:plain

ダウンロードボタンを押すと、前回と同様に動画のダウンロードされます。

f:id:kikutaro777:20131016192947j:plain

で、ダウンロード完了と同時にChromeが起動して自動再生します。
二度目の (*´Д`)ハァハァ。

f:id:kikutaro777:20131016193010j:plain

こんだけ(^^;

履歴ページ遷移

画面にコンボボックスを設けてページ遷移の履歴を一覧表示するようにしました。

適当に色々たどった状態でコンボボックスを開くと

f:id:kikutaro777:20131016193204j:plain

以下のような感じで履歴が出ます。

f:id:kikutaro777:20131016193230j:plain

横が長すぎて不格好(^^;
今はWebEngineから取得できるHistoryのリストをそのままコンボボックスにぶっこむ雑な処理をしてるためです。
HistoryのEntryクラスを継承してtoStringをオーバーライドすればいいのかなと思ったら、Entryクラスがfinalでした;ここら辺はもう少し綺麗にしたいところ。

で、とりあえず選択イベントで履歴URLのページへ遷移するようになってます。

f:id:kikutaro777:20131016193843j:plain

コード

前回のをベースに以下のような感じです。

Chromeの実行はProcessBuilderでexeファイルを叩いてるだけ(^^;
履歴もWebEngineのHistoryにListChangeListenerをつけて履歴が変わるタイミングでコンボボックスの中身を入れ替えてるだけです。

package maki.makimakidownloader;

import com.github.axet.vget.VGet;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.ListChangeListener;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebHistory.Entry;
import javafx.scene.web.WebView;

public class MakiMakiDownloaderController implements Initializable {

    private static final String DL_DIR = "D:\\movie\\horikita";
    
    private static final String CHROME_EXE = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe";
    
    @FXML
    private WebView webView;
    
    @FXML
    private ComboBox historyComboBox;
    
    private WebEngine webEngine;
    
    /**
     * ダウンロードボタン押下時のイベント.
     * 
     * 動画をダウンロードして、Chromeでビューする。
     * 
     * @param event 
     */
    @FXML
    private void handleBtnDownloadAction(ActionEvent event) {     
        try {
            //動画のダウンロード
            URL downloadUrl = new URL(webEngine.getLocation());
            VGet vget = new VGet(downloadUrl, new File(DL_DIR));
            vget.download();

            //ダウンロードしたファイル(webm形式)をChromeで実行する
            ProcessBuilder processBuilder 
                    = new ProcessBuilder(CHROME_EXE, "\"" + vget.getTarget().getAbsoluteFile() +"\"");
            Process process = processBuilder.start();
            
            //実行結果の判定
            int ret = process.waitFor();
            if(ret == 0){
                System.out.println("正常終了しました。");
            }else{
                System.out.println("異常終了しました。コードは" + ret);
            }
        } catch (IOException | InterruptedException ex) {
            System.out.println(ex.getMessage());
        }
    }
    
    /**
     * コンボボックス選択時のイベント.
     * 
     * 選択された履歴のURLに遷移する。
     * 
     * @param event 
     */
    public void selectHistoryComboBox(ActionEvent event){
        if(historyComboBox.getValue() instanceof Entry){
            Entry selectedEntry = (Entry) historyComboBox.getValue();
            webEngine.load(selectedEntry.getUrl());
        }
    }
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        webEngine = webView.getEngine();
        
        //YouTubeのサイトを表示
        webEngine.load("http://www.youtube.com/?gl=JP&hl=ja");
        
        //サイト履歴が変わる度にコンボボックスの値を更新する
        webEngine.getHistory().getEntries().addListener(new ListChangeListener<Entry>(){

            @Override
            public void onChanged(ListChangeListener.Change<? extends Entry> change) {
                change.next();
                historyComboBox.getItems().clear();
                historyComboBox.getItems().addAll(webEngine.getHistory().getEntries());
            }
            
        });
    }
}

JavaFXおもしろいなぁ。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村