/*
* This file is part of VLCJ.
*
* VLCJ is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* VLCJ is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with VLCJ. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2009, 2010, 2011, 2012, 2013, 2014 Caprica Software Limited.
*/
package uk.co.caprica.vlcj.test.script;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import uk.co.caprica.vlcj.Info;
import uk.co.caprica.vlcj.player.Equalizer;
import uk.co.caprica.vlcj.player.MediaPlayer;
import uk.co.caprica.vlcj.player.MediaPlayerEventAdapter;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.test.VlcjTest;
/**
* A test to show how to integrate J2SE scripting.
* <p>
* There is nothing special in this test that is required for vlcj as compared to
* any other J2SE scripting example - other than vlcj objects are made available
* to the scripting engine.
* <p>
* This test application can be used to perform ad-hoc tests on vlcj components
* if there is no dedicated test example.
* <p>
* Only the selected text is executed, and to execute you press CTRL+ENTER after
* you have made your selection.
* <p>
* Some examples are provided in the input window, but you are free to edit this
* to execute any code.
* <p>
* You can clear the output window with CTRL+DELETE when it is focused.
*/
public class ScriptTest extends VlcjTest {
private final JFrame mainFrame;
private final JTextArea scriptTextArea;
private final JTextArea outputTextArea;
private final JFrame eventFrame;
private final JTextArea eventTextArea;
private final ScriptEngineManager scriptEngineManager;
private final ScriptEngine scriptEngine;
private final MediaPlayerFactory mediaPlayerFactory;
private final MediaPlayer mediaPlayer;
private final Equalizer equalizer;
private final Map<String, Equalizer> presets;
public static void main(String[] args) throws ScriptException {
new ScriptTest().start();
}
public ScriptTest() {
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
Font font = new Font("Monospaced", Font.PLAIN, 12);
scriptTextArea = new JTextArea();
scriptTextArea.setFont(font);
outputTextArea = new JTextArea();
outputTextArea.setFont(font);
outputTextArea.setEditable(false);
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
JScrollPane scriptScrollPane = new JScrollPane(scriptTextArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
splitPane.setTopComponent(scriptScrollPane);
JScrollPane outputScrollPane = new JScrollPane(outputTextArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
splitPane.setBottomComponent(outputScrollPane);
contentPane.add(splitPane, BorderLayout.CENTER);
splitPane.setDividerLocation(700);
mainFrame = new JFrame("vlcj scripting");
mainFrame.setSize(1600, 1000);
mainFrame.setContentPane(contentPane);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel eventContentPane = new JPanel();
eventContentPane.setLayout(new BorderLayout());
eventTextArea = new JTextArea();
eventTextArea.setFont(font);
eventTextArea.setEditable(false);
JScrollPane eventScrollPane = new JScrollPane(eventTextArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
eventContentPane.add(eventScrollPane, BorderLayout.CENTER);
eventFrame = new JFrame("vlcj events");
eventFrame.setLocation(900, 100);
eventFrame.setSize(600, 200);
eventFrame.setContentPane(eventContentPane);
eventFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
scriptEngineManager = new ScriptEngineManager();
scriptEngine = scriptEngineManager.getEngineByMimeType("application/javascript");
mediaPlayerFactory = new MediaPlayerFactory();
mediaPlayer = mediaPlayerFactory.newHeadlessMediaPlayer();
mediaPlayer.addMediaPlayerEventListener(new MediaPlayerEventHandler());
if(mediaPlayerFactory.isEqualizerAvailable()) {
equalizer = mediaPlayerFactory.newEqualizer();
presets = mediaPlayerFactory.getAllPresetEqualizers();
}
else {
equalizer = null;
presets = null;
}
scriptEngine.put("vlcj", Info.getInstance().version());
scriptEngine.put("mediaPlayerFactory", mediaPlayerFactory);
scriptEngine.put("mediaPlayer", mediaPlayer);
if(mediaPlayerFactory.isEqualizerAvailable()) {
scriptEngine.put("equalizer", equalizer);
scriptEngine.put("presets", presets);
}
// Add some examples (not exhaustive by any means)
scriptTextArea.append("vlcj\n");
scriptTextArea.append("\n");
scriptTextArea.append("mediaPlayerFactory.version()\n");
scriptTextArea.append("mediaPlayerFactory.changeset()\n");
scriptTextArea.append("mediaPlayerFactory.compiler()\n");
scriptTextArea.append("mediaPlayerFactory.getAudioFilters()\n");
scriptTextArea.append("mediaPlayerFactory.getVideoFilters()\n");
scriptTextArea.append("mediaPlayerFactory.getAudioOutputs()\n");
scriptTextArea.append("mediaPlayerFactory.isEqualizerAvailable()\n");
if(mediaPlayerFactory.isEqualizerAvailable()) {
scriptTextArea.append("mediaPlayerFactory.getEqualizerPresetNames()\n");
scriptTextArea.append("mediaPlayerFactory.getAllPresetEqualizers()\n");
}
scriptTextArea.append("\n");
scriptTextArea.append("mediaPlayer.playMedia(\"<filename>\", null)\n");
scriptTextArea.append("mediaPlayer.startMedia(\"<filename>\", null)\n");
scriptTextArea.append("mediaPlayer.play()\n");
scriptTextArea.append("mediaPlayer.setPosition(0.2)\n");
scriptTextArea.append("mediaPlayer.setTime(30)\n");
scriptTextArea.append("mediaPlayer.pause()\n");
scriptTextArea.append("mediaPlayer.stop()\n");
scriptTextArea.append("mediaPlayer.start()\n");
scriptTextArea.append("mediaPlayer.getMediaDetails()\n");
scriptTextArea.append("mediaPlayer.getVideoDimension()\n");
scriptTextArea.append("mediaPlayer.getLength()\n");
scriptTextArea.append("mediaPlayer.getChapterCount()\n");
scriptTextArea.append("mediaPlayer.getChapter()\n");
scriptTextArea.append("mediaPlayer.setChapter(<n>)\n");
scriptTextArea.append("mediaPlayer.previousChapter()\n");
scriptTextArea.append("mediaPlayer.nextChapter()\n");
scriptTextArea.append("mediaPlayer.setVolume(<n>)\n");
scriptTextArea.append("mediaPlayer.getVolume()\n");
scriptTextArea.append("mediaPlayer.mute(true)\n");
scriptTextArea.append("mediaPlayer.mute(false)\n");
scriptTextArea.append("mediaPlayer.isMute()\n");
scriptTextArea.append("\n");
if(mediaPlayerFactory.isEqualizerAvailable()) {
scriptTextArea.append("mediaPlayer.enableAudioFilter(\"equalizer\",true)\n");
scriptTextArea.append("mediaPlayer.enableAudioFilter(\"equalizer\",false)\n");
scriptTextArea.append("\n");
scriptTextArea.append("mediaPlayer.getEqualizer()\n");
scriptTextArea.append("mediaPlayer.setEqualizer(null)\n");
scriptTextArea.append("mediaPlayer.setEqualizer(equalizer)\n");
for(String name : mediaPlayerFactory.getEqualizerPresetNames()) {
scriptTextArea.append(String.format("mediaPlayer.setEqualizer(presets.get(\"%s\"))\n", name));
}
scriptTextArea.append("\n");
scriptTextArea.append("equalizer\n");
scriptTextArea.append("equalizer.setPreamp(10.0)\n");
for(int i = 0; i < equalizer.getBandCount(); i ++ ) {
scriptTextArea.append(String.format("equalizer.setAmp(%d,15.0)%n", i));
}
scriptTextArea.append("\n");
}
scriptTextArea.append("mediaPlayer.getTrackInfo()\n");
scriptTextArea.append("mediaPlayer.getTitleCount()\n");
scriptTextArea.append("mediaPlayer.getVideoTrackCount()\n");
scriptTextArea.append("mediaPlayer.getAudioTrackCount()\n");
scriptTextArea.append("mediaPlayer.getSpuCount()\n");
scriptTextArea.append("mediaPlayer.getTitleDescriptions()\n");
scriptTextArea.append("mediaPlayer.getVideoDescriptions()\n");
scriptTextArea.append("mediaPlayer.getAudioDescriptions()\n");
scriptTextArea.append("mediaPlayer.getSpuDescriptions()\n");
scriptTextArea.append("mediaPlayer.getChapterDescriptions(1)\n");
scriptTextArea.append("mediaPlayer.getChapterDescriptions()\n");
scriptTextArea.append("mediaPlayer.getAllChapterDescriptions()\n");
scriptTextArea.append("mediaPlayer.getTitle()\n");
scriptTextArea.append("mediaPlayer.setTitle(1)\n");
scriptTextArea.append("mediaPlayer.getVideoTrack()\n");
scriptTextArea.append("mediaPlayer.setVideoTrack(1)\n");
scriptTextArea.append("mediaPlayer.getAudioTrack()\n");
scriptTextArea.append("mediaPlayer.setAudioTrack(1)\n");
scriptTextArea.append("mediaPlayer.getSpu()\n");
scriptTextArea.append("mediaPlayer.setSpu(1)\n");
scriptTextArea.append("\n");
scriptTextArea.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_ENTER && (evt.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0) {
String selected = scriptTextArea.getSelectedText();
if(selected == null) {
return;
}
try {
outputTextArea.append(selected);
outputTextArea.append("\n");
Object result = scriptEngine.eval(selected);
if(result instanceof Iterable) {
Iterable<?> it = (Iterable<?>)result;
for(Object obj : it) {
outputTextArea.append("-> ");
outputTextArea.append(String.valueOf(obj));
outputTextArea.append("\n");
}
}
else if(result instanceof Map) {
@SuppressWarnings("unchecked")
Map<Object,Object> map = (Map<Object,Object>)result;
for(Map.Entry<Object, Object> entry : map.entrySet()) {
outputTextArea.append("-> ");
outputTextArea.append(String.format("%30s ---> %s%n", entry.getKey(), entry.getValue()));
}
}
else {
outputTextArea.append("-> ");
outputTextArea.append(String.valueOf(result));
outputTextArea.append("\n");
}
outputTextArea.append("\n");
outputTextArea.setCaretPosition(outputTextArea.getText().length() - 1);
}
catch(ScriptException ex) {
outputTextArea.append("-> ");
outputTextArea.append(ex.getMessage());
outputTextArea.append("\n");
ex.printStackTrace();
}
}
}
});
outputTextArea.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_DELETE && (evt.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0) {
outputTextArea.setText("");
}
}
});
eventTextArea.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_DELETE && (evt.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0) {
eventTextArea.setText("");
}
}
});
}
private void start() {
mainFrame.setVisible(true);
eventFrame.setVisible(true);
}
private final class MediaPlayerEventHandler extends MediaPlayerEventAdapter {
private final DateFormat df = new SimpleDateFormat("HH:mm:ss.sss");
@Override
public void opening(MediaPlayer mediaPlayer) {
event("opening");
}
@Override
public void buffering(MediaPlayer mediaPlayer, float newCache) {
event(String.format("buffering %.0f", newCache));
}
@Override
public void playing(MediaPlayer mediaPlayer) {
event("playing");
}
@Override
public void paused(MediaPlayer mediaPlayer) {
event("paused");
}
@Override
public void stopped(MediaPlayer mediaPlayer) {
event("stopped");
}
@Override
public void finished(MediaPlayer mediaPlayer) {
event("finished");
}
@Override
public void error(MediaPlayer mediaPlayer) {
event("error");
}
@Override
public void newMedia(MediaPlayer mediaPlayer) {
event("newMedia");
}
private void event(String msg) {
eventTextArea.append(df.format(new Date()));
eventTextArea.append(" ");
eventTextArea.append(msg);
eventTextArea.append("\n");
eventTextArea.setCaretPosition(eventTextArea.getText().length() - 1);
}
}
}