<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: video code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Mon, 06 Oct 2008 16:31:36 GMT</pubDate>
    <description>DZone Snippets: video code</description>
    <item>
      <title>Stream live video from the N800</title>
      <link>http://snippets.dzone.com/posts/show/6193</link>
      <description>Source: &lt;a href="http://wiki.maemo.org/Streaming_video_from_built-in_webcam"&gt;Streaming video from built-in webcam - maemo wiki&lt;/a&gt; [maemo.org&lt;br /&gt;&lt;br /&gt;Here's the script which encodes the video and executes on the N800 ...&lt;br /&gt;&lt;br /&gt;file: rtpstreamer.sh&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;VPORT=5434&lt;br /&gt;APORT=5432&lt;br /&gt;HOST=${1:-192.168.1.103}&lt;br /&gt;gst-launch-0.10 v4l2src ! \&lt;br /&gt;video/x-raw-yuv,width=176,height=144,framerate=\(fraction\)15/1 ! \&lt;br /&gt;hantro4200enc stream-type=1 profile-and-level=1001 ! \&lt;br /&gt;video/x-h263,framerate=\(fraction\)15/1 ! rtph263ppay mtu=1438 ! \&lt;br /&gt;udpsink host=$HOST port=$VPORT dsppcmsrc ! queue ! \&lt;br /&gt;audio/x-raw-int,channels=1,rate=8000 ! mulawenc ! rtppcmupay mtu=1438 ! \&lt;br /&gt;udpsink host=$HOST port=$APORT &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;... and now the client config file to view the video&lt;br /&gt;&lt;br /&gt;file: /tmp/n800.sdp&lt;br /&gt;&lt;code&gt;&lt;br /&gt;v=0&lt;br /&gt;o=- 37 614155991 IN IP4 127.0.0.0&lt;br /&gt;s=QuickTime&lt;br /&gt;t=0 0&lt;br /&gt;a=range:npt=now-&lt;br /&gt;m=audio 5432 RTP/AVP 0&lt;br /&gt;c=IN IP4 192.168.1.108&lt;br /&gt;b=AS:63&lt;br /&gt;m=video 5434 RTP/AVP 96&lt;br /&gt;c=IN IP4 192.168.1.108&lt;br /&gt;a=rtpmap:96 H263-2000/90000&lt;br /&gt;a=fmtp:96&lt;br /&gt;a=cliprect:0,0,144,176&lt;br /&gt;a=framesize:96 176-144&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;IP addresses used: N800 = 192.168.1.108; Ubuntu = 192.168.1.103&lt;br /&gt;&lt;br /&gt;To view the video stream Video Lan Client (VLC) was used on Ubuntu. Here's how to play the stream ...&lt;br /&gt;&lt;code&gt;vlc /tmp/n800.sdp&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here's a snapshot of the &lt;a href="http://twitxr.com/image/105766/"&gt;streaming video on Ubuntu&lt;/a&gt; [twitxr.com] taken from my mobile phone.&lt;br /&gt;&lt;br /&gt;Resources: &lt;br /&gt;- &lt;a href="http://www.videolan.org/doc/streaming-howto/en/ch02.html"&gt;Chapter 2.  Easy streaming&lt;/a&gt; [videolan.org]&lt;br /&gt;- &lt;a href="http://www.videolan.org/doc/streaming-howto/en/ch06.html"&gt;Chapter 6.  Receive and save a stream&lt;/a&gt; [videolan.org]&lt;br /&gt;</description>
      <pubDate>Sat, 04 Oct 2008 10:48:52 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/6193</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Embed an OGG video on a web page</title>
      <link>http://snippets.dzone.com/posts/show/5844</link>
      <description>This code was copied from an HTML page from &lt;a href="http://people.xiph.org/~maikmerten/demos/arctic_giant.html"&gt;Superman: The Arctic Giant&lt;/a&gt; [xiph.org]&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;video id="testvideo" style="display:none"&gt;&lt;/video&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script language="JavaScript"&gt;&lt;br /&gt;var vlcActiveX = false;&lt;br /&gt;var vlcPlugin = false;&lt;br /&gt;var videoElement = false;&lt;br /&gt;var oggPlugin = false;&lt;br /&gt;var javaEnabled = false;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script language="vbScript"&gt;&lt;br /&gt;on error resume next&lt;br /&gt;vlcActiveX = (IsObject(CreateObject("VideoLAN.VLCPlugin.2")))&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script language="JavaScript"&gt;&lt;br /&gt;&lt;br /&gt;function embedVideoElement(location, width, height) {&lt;br /&gt;  document.write("&lt;video style=\"width:" + width + ";height:" + height + ";\" src='" + location + "' id='video_element'&gt;&lt;/video&gt;&lt;br&gt;");&lt;br /&gt;  document.write("&lt;input type='button' value='play' onClick='document.getElementById(\"video_element\").play()'&gt;");&lt;br /&gt;  document.write("&lt;input type='button' value='stop' onClick='document.getElementById(\"video_element\").pause(); document.getElementById(\"video_element\").start = 0;'&gt;");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function embedOggPlugin(location, width, height) {&lt;br /&gt;  document.write("&lt;object type='application/ogg' width='"+width+"' height='"+height+"' data='" + location + "'&gt;&lt;/object&gt;");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function embedVlcPlugin(location, width, height) {&lt;br /&gt;  document.write("&lt;object type='application/x-vlc-plugin' id='vlc_element' width='"+width+"' height='"+height+"' data='" + location + "'&gt;&lt;/object&gt;&lt;br&gt;");&lt;br /&gt;  document.write("&lt;input type='button' value='play' onClick='document.getElementById(\"vlc_element\").play()'&gt;");&lt;br /&gt;  document.write("&lt;input type='button' value='stop' onClick='document.getElementById(\"vlc_element\").stop()'&gt;");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function embedVlcActiveX(location,width,height) {&lt;br /&gt;  document.write("&lt;object classid='clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921' codebase='http://downloads.videolan.org/pub/videolan/vlc/latest/win32/axvlc.cab#Version=0,8,6,0' width='"+width+"' height='"+height+"' id='vlc_element'&gt;");&lt;br /&gt;  document.write("&lt;param name='MRL' value='" + location +"'&gt;");&lt;br /&gt;  document.write("&lt;/object&gt;&lt;br&gt;");&lt;br /&gt;  document.write("&lt;input type='button' value='play' onClick='document.getElementById(\"vlc_element\").playlist.play()'&gt;");&lt;br /&gt;  document.write("&lt;input type='button' value='stop' onClick='document.getElementById(\"vlc_element\").playlist.stop()'&gt;");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function embedCortado(location,width,height) {&lt;br /&gt;  document.write("&lt;applet code='com.fluendo.player.Cortado.class' archive='cortado.jar' width='"+width+"' height='"+height+"'&gt;");&lt;br /&gt;  document.write("&lt;param name='url' value='" + location + "'&gt;");&lt;br /&gt;  document.write("&lt;/applet&gt;");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(document.getElementsByTagName("video").length &gt; 0) {&lt;br /&gt;  var myvideo = document.getElementById("testvideo");&lt;br /&gt;  if(myvideo.play) {&lt;br /&gt;    videoElement = true;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var searchedMimeTypes = false;&lt;br /&gt;var foundJavaMimeType = false;&lt;br /&gt;&lt;br /&gt;if(navigator.mimeTypes &amp;&amp; navigator.mimeTypes.length &gt; 0) {&lt;br /&gt;&lt;br /&gt;  searchedMimeTypes = true;&lt;br /&gt;&lt;br /&gt;  for (var i = 0; i &lt; navigator.mimeTypes.length; i++) {&lt;br /&gt;    if(navigator.mimeTypes[i].type.indexOf("application/ogg") &gt; -1) {&lt;br /&gt;      oggPlugin = true;&lt;br /&gt;    }&lt;br /&gt;    if(navigator.mimeTypes[i].type.indexOf("application/x-vlc-plugin") &gt; -1) {&lt;br /&gt;      vlcPlugin = true;&lt;br /&gt;    }	&lt;br /&gt;    if(navigator.mimeTypes[i].type.indexOf("application/x-java-applet") &gt; -1) {&lt;br /&gt;      foundJavaMimeType = true;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var nativePlayback = vlcActiveX || vlcPlugin || videoElement || oggPlugin;&lt;br /&gt; &lt;br /&gt;if(searchedMimeTypes) {&lt;br /&gt;  javaEnabled = navigator.javaEnabled() &amp;&amp; foundJavaMimeType;&lt;br /&gt;} else {&lt;br /&gt;  javaEnabled = navigator.javaEnabled();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var file = "arctic_giant.ogg";&lt;br /&gt;var width = 512;&lt;br /&gt;var height = 384;&lt;br /&gt;&lt;br /&gt;if(videoElement) {&lt;br /&gt;  embedVideoElement(file,width,height);&lt;br /&gt;} else if(vlcPlugin) {&lt;br /&gt;  embedVlcPlugin(file,width,height);&lt;br /&gt;} else if(vlcActiveX) {&lt;br /&gt;  embedVlcActiveX(file,width,height);&lt;br /&gt;} else if(oggPlugin) {&lt;br /&gt;  embedOggPlugin(file,width,height);&lt;br /&gt;} else if(javaEnabled) {&lt;br /&gt;  embedCortado(file,width,height);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;See also another example of embedded OGG video with information about &lt;a href="http://en.wikipedia.org/wiki/Saint_Lucia"&gt;Saint Lucia&lt;/a&gt; [wikipedia.org]</description>
      <pubDate>Wed, 30 Jul 2008 14:36:44 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5844</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Convert AVI to Theora Ogg</title>
      <link>http://snippets.dzone.com/posts/show/5843</link>
      <description>Source: &lt;a href="http://commons.wikimedia.org/wiki/Help:Converting_video#ffmpeg2theora"&gt;Help:Converting video - Wikimedia Commons | ffmpeg2theora&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Don't forget to apt-get install ffmpeg2theora&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ffmpeg2theora nuxified.avi&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Note the OGG file size was only 7.2KB compared to the AVI file size 22.5KB (produced from the post &lt;a href="http://snippets.dzone.com/posts/show/5842"&gt;'Convert an animation into a video with ffmpeg'&lt;/a&gt; [dzone.com])</description>
      <pubDate>Wed, 30 Jul 2008 14:20:31 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5843</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Convert an animation into a video with ffmpeg</title>
      <link>http://snippets.dzone.com/posts/show/5842</link>
      <description>source: &lt;a href="http://www.nuxified.org/article/create_video_animations_with_inkscape_imagemagick_and_ffmpeg"&gt;Create video animations with Inkscape, ImageMagick and FFmpeg | Nuxified GNU/Linux Help Forums&lt;/a&gt; [nuxified.org]&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ffmpeg -r 12 -i nuxified%05d.png -y -an nuxified.avi&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;PNG preserves the information in vector graphics while still keeping the file size low.  I tried the above script with JPG and the AVI file size was 54.9KB, I tried the same thing with PNG and the AVI file size was only 22.5KB.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt; - &lt;a href="http://www.pymolwiki.org/index.php/Making_Movies#Mencoder.2FMplayer"&gt;Making Movies - PyMolWiki&lt;/a&gt; [pymolwiki.org]&lt;br /&gt; - &lt;a href="http://lists.mplayerhq.hu/pipermail/mencoder-users/2005-December/002413.html"&gt;[MEncoder-users] Trouble when making a movie from *.png files&lt;/a&gt; [mplayerhq.hu]&lt;br /&gt; - &lt;a href="http://en.wikipedia.org/wiki/Ffmpeg"&gt;FFmpeg&lt;/a&gt; [wikipedia.org]&lt;br /&gt; - &lt;a href="http://en.wikipedia.org/wiki/MEncoder"&gt;MEncoder&lt;/a&gt; [wikipedia.org]&lt;br /&gt; - &lt;a href="http://dawes.wordpress.com/2007/12/04/animating-png-files/"&gt;Animating PNG files &#171; The Daily Photon&lt;/a&gt; [wordpress.com]</description>
      <pubDate>Wed, 30 Jul 2008 13:59:59 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5842</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>I can't be bothered going downstairs to watch the daily show</title>
      <link>http://snippets.dzone.com/posts/show/4794</link>
      <description>scraper.rb - scrapes metadata from thedailyshow.com.&lt;br /&gt;Just run it - creates videos/index.yml&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/ruby&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'leecher'&lt;br /&gt;require 'open-uri'&lt;br /&gt;require 'hpricot'&lt;br /&gt;&lt;br /&gt;class Scraper&lt;br /&gt;	SEARCH_PAGE="http://www.thedailyshow.com/tds_files/includes/search/search_results.jhtml"&lt;br /&gt;	def scrape_day(site, date, force=false)&lt;br /&gt;		return if site.skip.include?(date) and not force&lt;br /&gt;		url = sprintf("#{SEARCH_PAGE}?searchterm=%02d-%02d-%04d",date.month,date.day,date.year)&lt;br /&gt;		puts "Fetching #{url}" if $DEBUG&lt;br /&gt;&lt;br /&gt;		data = open(url) {|f| f.read }&lt;br /&gt;		h = Hpricot(data)&lt;br /&gt;&lt;br /&gt;		# can't use a real xpath - they all use an _id_ istead of a class&lt;br /&gt;		results = (h/"div").find_all {|x| x['id'] == "videoListItem_1" }&lt;br /&gt;		results.each {|result|&lt;br /&gt;			url = result.at("a[1]")['href']&lt;br /&gt;			vid = if url =~ /videoId=(\d+)/&lt;br /&gt;				$1.to_i&lt;br /&gt;			else&lt;br /&gt;				raise "Failed to parse link #{url}"&lt;br /&gt;			end&lt;br /&gt;&lt;br /&gt;			title = ((result/"a")[1]/"text()").to_s&lt;br /&gt;			date = Date.parse((result/"a[@onclick][1]/text()").to_s)&lt;br /&gt;&lt;br /&gt;			descr = result/"div.video_description"&lt;br /&gt;			description = (descr/"div[1]/text()").to_s&lt;br /&gt;			tags = (descr/".tags/a/text()").map {|x| unescape(x.to_s) }&lt;br /&gt;			&lt;br /&gt;			vid = Video.new(site, vid, date, unescape(title), unescape(description), tags)&lt;br /&gt;			puts vid&lt;br /&gt;		}&lt;br /&gt;	&lt;br /&gt;		results.length&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def unescape(t)&lt;br /&gt;		t.gsub(/&amp;([^;]{1,5});/) {|ent|&lt;br /&gt;			case $1&lt;br /&gt;				when /^#(\d+)$/&lt;br /&gt;					[$1.to_i].pack('C')&lt;br /&gt;				when /^#x([0-9a-zA-Z]+)$/&lt;br /&gt;					[$1].pack('H2')&lt;br /&gt;				when 'amp'&lt;br /&gt;					'&amp;'&lt;br /&gt;				when 'gt'&lt;br /&gt;					'&gt;'&lt;br /&gt;				when 'quot'&lt;br /&gt;					'"'&lt;br /&gt;				when 'apos'&lt;br /&gt;					"'"&lt;br /&gt;				when 'lt'&lt;br /&gt;					'&lt;'&lt;br /&gt;				else&lt;br /&gt;					$stderr.puts "Unknown entity #{$1.inspect}"&lt;br /&gt;					'?'&lt;br /&gt;			end&lt;br /&gt;		}&lt;br /&gt;	end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;if __FILE__ == $0&lt;br /&gt;	Site.load&lt;br /&gt;	tds = Site.sites.find {|s| s.short_name == "tds" }&lt;br /&gt;	tds ||= Site.new("The Daily Show","tds")&lt;br /&gt;&lt;br /&gt;	day = Date.today&lt;br /&gt;	start = Date.new(1999)&lt;br /&gt;&lt;br /&gt;	counter=0&lt;br /&gt;&lt;br /&gt;	s = Scraper.new&lt;br /&gt;	while day &gt;= start&lt;br /&gt;		results = s.scrape_day(tds, day)&lt;br /&gt;		puts "#{results} results for #{day}" if results # else skipped&lt;br /&gt;&lt;br /&gt;		# Mark days as done once we've scraped them a month after air&lt;br /&gt;		if (Date.today - day) &gt; 30 and not results.nil?&lt;br /&gt;			tds.skip!(day)&lt;br /&gt;		end&lt;br /&gt;&lt;br /&gt;		day -= 1&lt;br /&gt;		unless results.nil? or results.zero?&lt;br /&gt;			Site.save if (counter += 1)%10 == 0&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;	Site.save&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;leecher.rb - downloads/searches/plays videos&lt;br /&gt;./leecher.rb [download/list/play] [searchterm ... ]&lt;br /&gt;Search terms can be &lt;br /&gt;  date: 2007 or 2007-10 or 2007-10-01&lt;br /&gt;  tag: interview&lt;br /&gt;  id: 31723&lt;br /&gt;  already downloaded?: downloaded or !downloaded&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/ruby&lt;br /&gt;&lt;br /&gt;MEDIA_PLAYER = %w{mplayer -fs}&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'open-uri'&lt;br /&gt;require 'rexml/document'&lt;br /&gt;require 'rexml/xpath'&lt;br /&gt;require 'fileutils'&lt;br /&gt;require 'yaml'&lt;br /&gt;require 'rio'&lt;br /&gt;require 'set'&lt;br /&gt;&lt;br /&gt;class Site&lt;br /&gt;	class &lt;&lt; self&lt;br /&gt;		attr_reader :base&lt;br /&gt;		attr_reader :alternates&lt;br /&gt;		attr_reader :sites&lt;br /&gt;		&lt;br /&gt;		def init&lt;br /&gt;			unless self.base or self.sites&lt;br /&gt;				@base = "./videos"&lt;br /&gt;				@alternates = []&lt;br /&gt;				@sites = []&lt;br /&gt;			end&lt;br /&gt;		end&lt;br /&gt;&lt;br /&gt;		def load(stream=nil)&lt;br /&gt;			if stream&lt;br /&gt;				stuff = YAML::load(stream)&lt;br /&gt;				@base = stuff['base'] || "./videos"&lt;br /&gt;				@sites = stuff['sites'] || []&lt;br /&gt;				@alternates = stuff['alternates'] || []&lt;br /&gt;			else&lt;br /&gt;				init&lt;br /&gt;				begin&lt;br /&gt;					File.open(File.join(base,'index.yml')) {|f|&lt;br /&gt;						load(f)&lt;br /&gt;					}&lt;br /&gt;				rescue Errno::ENOENT&lt;br /&gt;					$stderr.puts "Warning, no database found, starting a new one"&lt;br /&gt;				end&lt;br /&gt;			end&lt;br /&gt;		end&lt;br /&gt;		&lt;br /&gt;		def save(stream=nil)&lt;br /&gt;			if stream&lt;br /&gt;				YAML::dump({'base' =&gt; base, 'sites' =&gt; sites, 'alternates' =&gt; 'alternates'},stream)&lt;br /&gt;			else&lt;br /&gt;				File.open(File.join(base,'index.yml_'),'w') {|f|&lt;br /&gt;					save(f)&lt;br /&gt;				}&lt;br /&gt;				FileUtils.mv(File.join(base,'index.yml_'),File.join(base,'index.yml'))&lt;br /&gt;			end&lt;br /&gt;		end&lt;br /&gt;&lt;br /&gt;		def each(&amp;block)&lt;br /&gt;			sites.each(&amp;block)&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def initialize(name, short_name=name)&lt;br /&gt;		Site.init&lt;br /&gt;		@videos = {}&lt;br /&gt;		@name, @short_name = name, short_name&lt;br /&gt;		@skip = Set.new&lt;br /&gt;		Site.sites &lt;&lt; self&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	attr_reader :videos&lt;br /&gt;	attr_reader :name&lt;br /&gt;	attr_reader :short_name&lt;br /&gt;	attr_reader :skip&lt;br /&gt;&lt;br /&gt;	def directory&lt;br /&gt;		File.join(Site.base, short_name)&lt;br /&gt;	end&lt;br /&gt;	def directory_alternates&lt;br /&gt;		Site.alternates.map {|d| File.join(d, short_name) }&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def ensure_dir_exists!&lt;br /&gt;		FileUtils.mkpath(directory)&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def &lt;&lt;(vid)&lt;br /&gt;		self.videos[vid.id] = vid&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def skip!(date)&lt;br /&gt;		self.skip &lt;&lt; date&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def [](id)&lt;br /&gt;		self.videos[id]&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def to_s&lt;br /&gt;		name&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def each &lt;br /&gt;		self.videos.each {|k,v| yield v }	&lt;br /&gt;	end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Video&lt;br /&gt;	attr_reader :tags&lt;br /&gt;	attr_reader :site&lt;br /&gt;	attr_reader :id&lt;br /&gt;	attr_reader :date&lt;br /&gt;	attr_reader :title&lt;br /&gt;	attr_reader :description&lt;br /&gt;&lt;br /&gt;	def initialize(site, id, date=nil, title = nil, description=nil, tags=[]) &lt;br /&gt; 		@site = site&lt;br /&gt;		@id = id&lt;br /&gt;		@title = title&lt;br /&gt;		@tags = tags&lt;br /&gt;		@date = date&lt;br /&gt;		@description = description&lt;br /&gt;&lt;br /&gt;		site &lt;&lt; self&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def filename&lt;br /&gt;		site.directory_alternates.map{|x| &lt;br /&gt;			File.join(x,"#{id}.flv")&lt;br /&gt;		}.find {|f| &lt;br /&gt;			File.exists?(f) &lt;br /&gt;		} || File.join(site.directory, "#{id}.flv")&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def downloaded?&lt;br /&gt;		File.exists?(filename)&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def download&lt;br /&gt;		download! unless downloaded?&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	SHARED_DATA = "http://www.comedycentral.com/sitewide/video_player/shared/data"&lt;br /&gt;	def download!&lt;br /&gt;		site.ensure_dir_exists!&lt;br /&gt;		url = download_url()&lt;br /&gt;		begin&lt;br /&gt;			rio(url) &gt; rio(filename)&lt;br /&gt;			File.size(filename)&lt;br /&gt;		rescue Exception =&gt; x&lt;br /&gt;			begin&lt;br /&gt;				File.delete(filename)&lt;br /&gt;			rescue Exception&lt;br /&gt;			end&lt;br /&gt;			raise x&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def to_s &lt;br /&gt;		sprintf("[%1s %7d - %s - %s - %20s]",(downloaded?? 'D' : ' '), id, date, site, title) &lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def download_url&lt;br /&gt;		manifest = open("#{SHARED_DATA}/flv_xml_gen.jhtml?ml_video=#{id}&amp;hiLoPref=hi") {|f| f.read }&lt;br /&gt;		doc = REXML::Document.new(manifest)&lt;br /&gt;		REXML::XPath.first(doc, "/package/video/item/src/text()").to_s&lt;br /&gt;	end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Filter&lt;br /&gt;	class &lt;&lt; self&lt;br /&gt;		def method_missing(sym,*args,&amp;block)&lt;br /&gt;			if sym.to_s =~ /^by/&lt;br /&gt;				new.send(sym,*args,&amp;block)&lt;br /&gt;			else&lt;br /&gt;				super&lt;br /&gt;			end&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def initialize(parent=nil,&amp;block)&lt;br /&gt;		@parent = parent&lt;br /&gt;		@test = block&lt;br /&gt;	end&lt;br /&gt;	&lt;br /&gt;	def [](video)&lt;br /&gt;		case video&lt;br /&gt;			when Video&lt;br /&gt;				video if (@test.nil? or @test[video]) and (@parent.nil? or @parent[video])&lt;br /&gt;			when Site&lt;br /&gt;				if block_given?&lt;br /&gt;					video.each {|v| yield v if self[v] }&lt;br /&gt;				else&lt;br /&gt;					video.find_all {|v| self[v] }&lt;br /&gt;				end&lt;br /&gt;			else&lt;br /&gt;				raise ArgumentError&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def each(&amp;block)&lt;br /&gt;		Site.each {|show| self.send(:[], show, &amp;block) }&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def filter(&amp;block)&lt;br /&gt;		Filter.new(self,&amp;block)&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by_downloaded(dl=true)&lt;br /&gt;		filter {|v| v.downloaded? == !!dl }&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by_date(y, m=nil, d=nil)&lt;br /&gt;		if m.nil? and d.nil?&lt;br /&gt;			filter {|v| v.date and v.date.year == y }&lt;br /&gt;		elsif d.nil?&lt;br /&gt;			filter {|v| v.date and v.date.year == y and v.date.month == m }&lt;br /&gt;		else&lt;br /&gt;			filter {|v| v.date and v.date.year == y and v.date.month == m and v.date.day == d }&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by_id(vid)&lt;br /&gt;		filter {|v| v.id == vid }&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by_tag(tag)&lt;br /&gt;		filter {|v| v.tags.include? tag }&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by_text(text) &lt;br /&gt;		filter {|v| &lt;br /&gt;			v.title &amp;&amp; v.title.downcase.include?(text.downcase) or &lt;br /&gt;			v.description &amp;&amp; v.description.downcase.include?(text.downcase) or&lt;br /&gt;			v.tags.include? text&lt;br /&gt;		}&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by(arg)&lt;br /&gt;		arg = arg.to_s&lt;br /&gt;		case arg&lt;br /&gt;			when 'downloaded'&lt;br /&gt;				by_downloaded(true)&lt;br /&gt;			when '!downloaded'&lt;br /&gt;				by_downloaded(false)&lt;br /&gt;			when /^(\d{4})$/&lt;br /&gt;				by_date($1.to_i)&lt;br /&gt;			when /^(\d{4})-(\d{1,2})$/&lt;br /&gt;				by_date($1.to_i, $2.to_i)&lt;br /&gt;			when /^(\d{4})-(\d{1,2})-(\d{1,2})$/&lt;br /&gt;				by_date($1.to_i, $2.to_i, $3.to_i)&lt;br /&gt;			when /^\d{5,}$/&lt;br /&gt;				by_id(arg.to_i)&lt;br /&gt;			else&lt;br /&gt;				by_text(arg)&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;if __FILE__ == $0&lt;br /&gt;	command = ARGV.shift or raise "Usage: leecher &lt;download/list&gt; [filters...]"&lt;br /&gt;	action = case command.downcase&lt;br /&gt;		when 'download'&lt;br /&gt;			proc {|v| &lt;br /&gt;				puts "Fetching #{v}" unless v.downloaded?&lt;br /&gt;				begin&lt;br /&gt;					v.download&lt;br /&gt;				rescue OpenURI::HTTPError =&gt; x&lt;br /&gt;					$stderr.puts "Download failed, skipping: #{x}"&lt;br /&gt;				rescue Errno::ENOENT =&gt; xm&lt;br /&gt;					$stderr.puts "Download failed, skipping: #{x}"&lt;br /&gt;				end&lt;br /&gt;			}&lt;br /&gt;		when 'list'&lt;br /&gt;			proc {|v|&lt;br /&gt;				puts "#{v} #{v.tags.join(', ')}"&lt;br /&gt;			}&lt;br /&gt;		when 'play'&lt;br /&gt;			proc {|v|&lt;br /&gt;				puts v&lt;br /&gt;				system(*MEDIA_PLAYER, v.filename)&lt;br /&gt;			}&lt;br /&gt;		else&lt;br /&gt;			raise "Unknown command #{command}"&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	filter = ARGV.inject(Filter.new) {|f, arg| f.by(arg)}&lt;br /&gt;&lt;br /&gt;	Site.load&lt;br /&gt;	filter.each(&amp;action)&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;</description>
      <pubDate>Sun, 18 Nov 2007 06:44:14 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4794</guid>
      <author>tunah (Sam McCall)</author>
    </item>
    <item>
      <title>Convert a video file to an audio file (.mp4 to .mp3)</title>
      <link>http://snippets.dzone.com/posts/show/4649</link>
      <description>Convert an mp4 file to avi, then to mp3 (including mixing the stereo down to mono). This code was executed from the command-line on Ubuntu 7.04.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mencoder video.mp4 -ovc lavc -vf scale=123:100 -oac lavc -o video.avi&lt;br /&gt;ffmpeg -i video.avi -ac 1 audio1.mp3 &lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 13 Oct 2007 10:37:27 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4649</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Bash - 3gpToMpeg</title>
      <link>http://snippets.dzone.com/posts/show/2958</link>
      <description>&lt;code&gt;&lt;br /&gt;mencoder video.3gp -o video.mpg -oac pcm -ovc lavc -lavcopts vcodec=mjpeg:mbd=1:vbitrate=1800&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 03 Nov 2006 03:26:13 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2958</guid>
      <author>whitetiger ()</author>
    </item>
    <item>
      <title>Java - JMF Simple Filter</title>
      <link>http://snippets.dzone.com/posts/show/2940</link>
      <description>&lt;code&gt;&lt;br /&gt;import java.awt.Dimension;&lt;br /&gt;&lt;br /&gt;import javax.media.Buffer;&lt;br /&gt;import javax.media.Effect;&lt;br /&gt;import javax.media.Format;&lt;br /&gt;import javax.media.ResourceUnavailableException;&lt;br /&gt;import javax.media.format.RGBFormat;&lt;br /&gt;&lt;br /&gt;public class SimpleFilter implements Effect&lt;br /&gt;{&lt;br /&gt;	protected Format inputFormat = null;&lt;br /&gt;	protected Format outputFormat = null;&lt;br /&gt;	&lt;br /&gt;	protected Format[] inputFormats = null;&lt;br /&gt;	protected Format[] outputFormats = null;&lt;br /&gt;	&lt;br /&gt;	public AngelMotionCodec()&lt;br /&gt;	{&lt;br /&gt;		inputFormats = new Format[]{ new RGBFormat(null, Format.NOT_SPECIFIED, Format.byteArray, Format.NOT_SPECIFIED, 24, 3, 2, 1, 3, Format.NOT_SPECIFIED, Format.TRUE, Format.NOT_SPECIFIED) };&lt;br /&gt;		outputFormats = new Format[]{ new RGBFormat(null, Format.NOT_SPECIFIED, Format.byteArray, Format.NOT_SPECIFIED, 24, 3, 2, 1, 3, Format.NOT_SPECIFIED, Format.TRUE, Format.NOT_SPECIFIED) };&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	/****** Codec ******/&lt;br /&gt;	public Format[] getSupportedInputFormats()&lt;br /&gt;	{&lt;br /&gt;		return inputFormats;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public Format[] getSupportedOutputFormats(Format input)&lt;br /&gt;	{&lt;br /&gt;		if(input != null)&lt;br /&gt;		{&lt;br /&gt;			if(matches(input, inputFormats) != null)&lt;br /&gt;				return new Format[]{ outputFormats[0].intersects(input) };&lt;br /&gt;			else&lt;br /&gt;				return new Format[0];&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		return outputFormats;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public int process(Buffer input, Buffer output)&lt;br /&gt;	{&lt;br /&gt;		// Swap tra input &amp; output&lt;br /&gt;		Object tmp = input.getData();&lt;br /&gt;		&lt;br /&gt;		input.setData(output.getData());&lt;br /&gt;		output.setData(tmp);&lt;br /&gt;		&lt;br /&gt;		return BUFFER_PROCESSED_OK;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public Format setInputFormat(Format input)&lt;br /&gt;	{&lt;br /&gt;		inputFormat = input;&lt;br /&gt;		&lt;br /&gt;		return input;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public Format setOutputFormat(Format output)&lt;br /&gt;	{&lt;br /&gt;		if(output != null || matches(output, outputFormats) != null)&lt;br /&gt;		{&lt;br /&gt;			RGBFormat inRGB = (RGBFormat) output;&lt;br /&gt;			&lt;br /&gt;			Dimension size = inRGB.getSize();&lt;br /&gt;			int maxDataLength = inRGB.getMaxDataLength();&lt;br /&gt;			int lineStride = inRGB.getLineStride();&lt;br /&gt;			int flipped = inRGB.getFlipped();&lt;br /&gt;			&lt;br /&gt;			if(size == null)&lt;br /&gt;				return null;&lt;br /&gt;			&lt;br /&gt;			if(maxDataLength &lt; size.width*size.height*3)&lt;br /&gt;				maxDataLength = size.width*size.height*3;&lt;br /&gt;			&lt;br /&gt;			if(lineStride &lt; size.width*3)&lt;br /&gt;				lineStride = size.width*3;&lt;br /&gt;			&lt;br /&gt;			if(flipped != Format.FALSE)&lt;br /&gt;				flipped = Format.FALSE;&lt;br /&gt;			&lt;br /&gt;			outputFormat = outputFormats[0].intersects(new RGBFormat(size, maxDataLength, inRGB.getDataType(), inRGB.getFrameRate(), inRGB.getBitsPerPixel(), inRGB.getRedMask(), inRGB.getGreenMask(), inRGB.getBlueMask(), inRGB.getPixelStride(), lineStride, flipped, inRGB.getEndian()));&lt;br /&gt;			&lt;br /&gt;			return outputFormat;&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;	/****** Codec ******/&lt;br /&gt;&lt;br /&gt;	/****** PlugIn ******/&lt;br /&gt;	public void close()&lt;br /&gt;	{&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public String getName()&lt;br /&gt;	{&lt;br /&gt;		return "Simple-Filter";&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public void open() throws ResourceUnavailableException&lt;br /&gt;	{&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public void reset()&lt;br /&gt;	{&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;	/****** PlugIn ******/&lt;br /&gt;&lt;br /&gt;	/****** Controls ******/&lt;br /&gt;	public Object getControl(String controlType)&lt;br /&gt;	{&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public Object[] getControls()&lt;br /&gt;	{&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;	/****** Controls ******/&lt;br /&gt;	&lt;br /&gt;	/****** Utility ******/&lt;br /&gt;	private Format matches(Format in, Format[] out)&lt;br /&gt;	{&lt;br /&gt;		if(in != null &amp;&amp; out != null)&lt;br /&gt;		{&lt;br /&gt;			for(int i=0, cnt=out.length; i&lt;cnt; i++)&lt;br /&gt;			{&lt;br /&gt;				if(in.matches(out[i]))&lt;br /&gt;					return out[i];&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;	/****** Utility ******/&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 01 Nov 2006 06:00:23 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2940</guid>
      <author>whitetiger ()</author>
    </item>
    <item>
      <title>Java - Example Very Simple Player (JMF)</title>
      <link>http://snippets.dzone.com/posts/show/2912</link>
      <description>// Main Class&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package org.jmf.example;&lt;br /&gt;&lt;br /&gt;import javax.swing.JDialog;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;import javax.swing.UIManager;&lt;br /&gt;import javax.swing.UnsupportedLookAndFeelException;&lt;br /&gt;import javax.swing.plaf.metal.MetalLookAndFeel;&lt;br /&gt;&lt;br /&gt;public class ExampleJMF&lt;br /&gt;{&lt;br /&gt;	public static void main(String[] args)&lt;br /&gt;	{&lt;br /&gt;		JFrame.setDefaultLookAndFeelDecorated(true); &lt;br /&gt;		JDialog.setDefaultLookAndFeelDecorated(true);&lt;br /&gt;		&lt;br /&gt;		try&lt;br /&gt;		{&lt;br /&gt;			UIManager.setLookAndFeel(new MetalLookAndFeel());&lt;br /&gt;		}&lt;br /&gt;		catch(UnsupportedLookAndFeelException e)&lt;br /&gt;		{&lt;br /&gt;			e.printStackTrace();&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		new exampleFrame();&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;// Frame Class&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package org.jmf.example;&lt;br /&gt;&lt;br /&gt;import java.awt.Toolkit;&lt;br /&gt;import java.awt.event.WindowAdapter;&lt;br /&gt;import java.awt.event.WindowEvent;&lt;br /&gt;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;&lt;br /&gt;public class exampleFrame extends JFrame&lt;br /&gt;{&lt;br /&gt;	private static final long serialVersionUID = 1L;&lt;br /&gt;	&lt;br /&gt;	public exampleFrame()&lt;br /&gt;	{&lt;br /&gt;		super("JMF - Example...");&lt;br /&gt;		&lt;br /&gt;		setSize(400, 300);&lt;br /&gt;		setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - getWidth())/2, (Toolkit.getDefaultToolkit().getScreenSize().height - getHeight())/2);&lt;br /&gt;		&lt;br /&gt;		addWindowListener(new WindowAdapter()&lt;br /&gt;		{&lt;br /&gt;			public void windowClosing(WindowEvent evt)&lt;br /&gt;			{&lt;br /&gt;				System.exit(0);&lt;br /&gt;			}&lt;br /&gt;		});&lt;br /&gt;		&lt;br /&gt;		setContentPane(new examplePanel());&lt;br /&gt;		setVisible(true);&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;// Panel Class&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package org.jmf.example;&lt;br /&gt;&lt;br /&gt;import java.awt.Component;&lt;br /&gt;import java.awt.Graphics;&lt;br /&gt;import java.awt.event.ActionEvent;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.net.MalformedURLException;&lt;br /&gt;import java.net.URL;&lt;br /&gt;&lt;br /&gt;import javax.media.ControllerEvent;&lt;br /&gt;import javax.media.ControllerListener;&lt;br /&gt;import javax.media.Manager;&lt;br /&gt;import javax.media.NoPlayerException;&lt;br /&gt;import javax.media.Player;&lt;br /&gt;import javax.media.RealizeCompleteEvent;&lt;br /&gt;import javax.swing.JPanel;&lt;br /&gt;&lt;br /&gt;public class examplePanel extends JPanel implements ActionListener, ControllerListener&lt;br /&gt;{&lt;br /&gt;	private static final long serialVersionUID = 1L;&lt;br /&gt;	&lt;br /&gt;	private Component visualComponent;&lt;br /&gt;	private Player player;&lt;br /&gt;	&lt;br /&gt;	public examplePanel()&lt;br /&gt;	{&lt;br /&gt;		try&lt;br /&gt;		{&lt;br /&gt;			player = Manager.createPlayer(new URL("file:///tmp/a.mpg"));&lt;br /&gt;			player.addControllerListener(this);&lt;br /&gt;			&lt;br /&gt;			player.start();&lt;br /&gt;		}&lt;br /&gt;		catch(NoPlayerException e)&lt;br /&gt;		{&lt;br /&gt;			e.printStackTrace();&lt;br /&gt;		}&lt;br /&gt;		catch(MalformedURLException e)&lt;br /&gt;		{&lt;br /&gt;			e.printStackTrace();&lt;br /&gt;		}&lt;br /&gt;		catch(IOException e)&lt;br /&gt;		{&lt;br /&gt;			e.printStackTrace();&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void paintComponent(Graphics g)&lt;br /&gt;	{&lt;br /&gt;		super.paintComponent(g);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public void actionPerformed(ActionEvent e)&lt;br /&gt;	{&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public void controllerUpdate(ControllerEvent c)&lt;br /&gt;	{&lt;br /&gt;		if(player == null)&lt;br /&gt;			return;&lt;br /&gt;		&lt;br /&gt;		if(c instanceof RealizeCompleteEvent)&lt;br /&gt;		{&lt;br /&gt;			if((visualComponent = player.getVisualComponent()) != null)&lt;br /&gt;				add(visualComponent);&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 27 Oct 2006 15:53:37 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2912</guid>
      <author>whitetiger ()</author>
    </item>
    <item>
      <title>Load a page after video finishes playing</title>
      <link>http://snippets.dzone.com/posts/show/2709</link>
      <description>You can do this using Windows Media Player, adding javascript to the page to handle the playStateChange event to detect when the video finishes playing. (Should work with any video type that Windows Media Player supports.)&lt;br /&gt;&lt;br /&gt;http://www.mioplanet.com/rsc/embed_mediaplayer.htm&lt;br /&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmplay10/mmp_sdk/playerplaystatechange.asp&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;SCRIPT LANGUAGE="JScript"  FOR="Player" EVENT="playStateChange(NewState)"&gt;&lt;br /&gt;&lt;br /&gt;// Test for the player current state, display a message for each.&lt;br /&gt;switch (NewState){&lt;br /&gt;    case 1:&lt;br /&gt;        window.href="xxx.htm";&lt;br /&gt;        break;&lt;br /&gt;}&lt;br /&gt;&lt;/SCRIPT&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 25 Sep 2006 12:04:23 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2709</guid>
      <author>uchafu (Robert Douglas)</author>
    </item>
  </channel>
</rss>
