ブログと関係ないですが、昨日から堀北真希さん主演ドラマ「ミス・パイロット」が始まりました(^^)/システム屋らしく緊急対応で観れないっていう残念な事態になりましたが…とほほ(-_-;
まあ、録画したので、後日楽しみます。フジテレビの公式サイトはこちら↓
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ページを表示
せっかくなので「ミスパイロット」で検索して
適当な動画を選びます。
ジャケット着る姿が超りりしい (*´Д`)ハァハァ
ダウンロードボタンを押すと、前回と同様に動画のダウンロードされます。
で、ダウンロード完了と同時にChromeが起動して自動再生します。
二度目の (*´Д`)ハァハァ。
こんだけ(^^;
履歴ページ遷移
画面にコンボボックスを設けてページ遷移の履歴を一覧表示するようにしました。
適当に色々たどった状態でコンボボックスを開くと
以下のような感じで履歴が出ます。
横が長すぎて不格好(^^;
今はWebEngineから取得できるHistoryのリストをそのままコンボボックスにぶっこむ雑な処理をしてるためです。
HistoryのEntryクラスを継承してtoStringをオーバーライドすればいいのかなと思ったら、Entryクラスがfinalでした;ここら辺はもう少し綺麗にしたいところ。
で、とりあえず選択イベントで履歴URLのページへ遷移するようになってます。
コード
前回のをベースに以下のような感じです。
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;
ダウンロードボタン押下時のイベント.
@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();
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());
}
}
コンボボックス選択時のイベント.
@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();
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おもしろいなぁ。