How It’s Made: Youtube player in Java

Few of you asked, so here is how …

First of all, you need a way to search Youtube and get url of some video. And that is really simple since there is an official Google Data API for using some of the services Google offers, and there is an open source GData Java Client Library, and great tutorials and examples of how to use it.

So, for example, from a query for ‘Revolucion Movie Library’ you will get a List of VideoEntries. And from VideoEntry you can get stuff like video title, location, type, url, duration, thumbnails etc. Video location is a string like “http://www.youtube.com/v/9yi9EdbYaFc&…”. Remember that :)

Now we need to play that somehow …

If you have a right codec, youtube video can be played in probably any video player – try opening above url (that you remembered :)) in Windows Media Player. But there are problems, at least I had them. First, that seems now is gone (probably fixed in newer versions of WMP or Flash), you couldn’t interact with a video, so you couldn’t click ‘Play’. That can be resolved by appending “&autoplay=1” to url, but than you can’t stop it. And, there comes a second problem – you can’t even really stop it with “Stop” button in your player. I first written a wrapper around WMP so I can use it in Swing, but that did’t work quite well. Also I tried JMC, but it crashed from time to time.

Other solution is playing Youtube videos in web browser. And this way you can even use a chromeless player (“… by definition, a YouTube video with no controls”), and control it using JavaScript. And if we had JWebPane this would be excellent. But since it isn’t finished yet … there are alternatives: WebBrowser from JDIC project, WebBrowser from JDICplus, …, and JWebBrowser from the DJ project. In Revolucion Library I used latter. It’s an SWT-based implementation of web browser component and under Windows it uses Internet Explorer or Mozilla and Mozilla on other platforms. Features that I liked – you can call JavaScript function in current page from Java, and can send commands from html page to Java application. And it works pretty good.

So I made a simple html page with chromeless Youtube player and, among few others, it contains following JavaScript functions:

function onYouTubePlayerReady(playerId) {
  ytplayer = document.getElementById(“myytplayer”);
  …
  sendCommand(“loaded”);
  }

function loadNewVideo(id, startSeconds) {
  if (ytplayer) {
  ytplayer.loadVideoById(id, parseInt(startSeconds));
  }
  }

function closePlayer() {
  stop();
  clearVideo();
  sendCommand(‘close’);
  }
function sendCommand(command) {
  var s = ‘command://’ + encodeURIComponent(command);
  for(var i=1; ionYouTubePlayerReady function and it will send command to my YouTubePlayer component. WebBrowserListener receives the command and using the executeJavascript method calls the loadNewVideo function with videoId as a parameter. VideoId is a part of video url after “/v/” that you might remember from above :) When user clicks “close” button in the html page, closePlayer() function is called and command sent to application.

So, this is it. All in all, this is not the best solution, you must include SWT jar with your application, but it works for now.

I’m desperately waiting for JWebPane …

Added day later:

I forgot to mention WebKit4Java by Genuitec which is currently available for SWT, but there is also going to be a Swing version.

P.S. My english isn’t excellent so I’m sorry for grammatical and other mistakes I made.

Advertisements