Author: vjrj Date: 2009-04-24 04:28:18 +0200 (Fri, 24 Apr 2009) New Revision: 1100 Added: trunk/src/main/java/org/ourproject/kune/app/public/others/cortado.jar trunk/src/test/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ trunk/src/test/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaDescriptorTest.java Modified: trunk/TODO trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/download/FileDownloadUtils.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaDescriptor.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaRegistry.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/abstractmedia/InsertMediaAbstractPanel.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/abstractmedia/MediaUtils.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ext/InsertMediaExtPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java trunk/src/main/resources/kune.properties Log: Incomplete - task Audio/Video contents player. External videos easy embeding support (from youtube, google video, ... entering only the url) Modified: trunk/TODO =================================================================== --- trunk/TODO 2009-04-22 14:36:46 UTC (rev 1099) +++ trunk/TODO 2009-04-24 02:28:18 UTC (rev 1100) @@ -11,6 +11,11 @@ Use org-mode in emacs to easy manage this file * SHORT-TERM (URGENT) +** maven-gwt problem (using another plugin from codehaus) + mvn com.totsp.gwt:maven-googlewebtoolkit2-plugin:compile + and so on. + More info: + http://code.google.com/p/gwt-maven/wiki/M2FAQ ** vjrj use xwiki maven repo http://maven.xwiki.org/releases/com/xpn/xwiki/platform/xwiki-web-wysiwyg/1.8... ** vjrj <v> better RTE @@ -157,8 +162,14 @@ see: svn checkout svn://anonsvn.it.su.se/su-smack su-smack ** TODO <v> study different embeded video solutions - for ogg :: http://www.flumotion.net/cortado/ - - for mp3+flv :: flowplayer - - for avi :: ?? + http://www.flumotion.net/cortado/ + https://code.fluendo.com/flumotion/trac/browser/cortado/trunk/README + http://en.flossmanuals.net/TheoraCookbook/Cortado + - for mp3+flv :: flowplayer + - for avi :: some links: + http://www.w3schools.com/media/media_browservideos.asp + http://www.solitude.dk/archives/embedquicktime/ + http://www.solitude.dk/archives/embedquicktime/jquery.embedquicktime-source.... ** TODO <d> Inform to translators when original content changes ** TODO <v> Restarting server don't affect client session Now there are problems if client was started before server, when server restart (session persist) Added: trunk/src/main/java/org/ourproject/kune/app/public/others/cortado.jar =================================================================== (Binary files differ) Property changes on: trunk/src/main/java/org/ourproject/kune/app/public/others/cortado.jar ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java 2009-04-22 14:36:46 UTC (rev 1099) +++ trunk/src/main/java/org/ourproject/kune/platf/client/dto/BasicMimeTypeDTO.java 2009-04-24 02:28:18 UTC (rev 1100) @@ -57,6 +57,11 @@ return type; } + public boolean isAvi() { + return type != null && subtype != null && type.equals("video") + && (subtype.equals("x-msvideo") || subtype.equals("msvideo")); + } + public boolean isFlv() { return type != null && subtype != null && type.equals("video") && (subtype.equals("flv") || subtype.equals("x-flv")); Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/download/FileDownloadUtils.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/download/FileDownloadUtils.java 2009-04-22 14:36:46 UTC (rev 1099) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/download/FileDownloadUtils.java 2009-04-24 02:28:18 UTC (rev 1100) @@ -80,7 +80,10 @@ url.add(new UrlParam(FileConstants.DOWNLOAD, download)); } if (useHash) { - url.add(new UrlParam(FileConstants.HASH, session.getUserHash())); + String hash = session.getUserHash(); + if (hash != null) { + url.add(new UrlParam(FileConstants.HASH, hash)); + } } return url.toString(); } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaDescriptor.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaDescriptor.java 2009-04-22 14:36:46 UTC (rev 1099) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaDescriptor.java 2009-04-24 02:28:18 UTC (rev 1100) @@ -2,30 +2,46 @@ public class ExternalMediaDescriptor { + public static final String URL = "###URL###"; + public static final String HEIGHT = "###HEIGHT###"; + public static final String WIDTH = "###WIDTH###"; + private final String name; private final String siteurl; private final String detectRegex; private final String idRegex; private final String embedTemplate; + private int width; + private int height; public ExternalMediaDescriptor(final String name, final String siteurl, final String detectRegex, - final String idRegex, final String embedTemplate) { + final String idRegex, final String embedTemplate, final int defWidth, final int defHeight) { this.name = name; this.siteurl = siteurl; this.detectRegex = detectRegex; this.idRegex = idRegex; this.embedTemplate = embedTemplate; + width = defWidth; + height = defHeight; } public String getEmbed(final String url) { - String id = url.replaceFirst(idRegex, "kk"); - return embedTemplate.replaceFirst("\\[%d\\]", id); + String id = getId(url); + String result = embedTemplate.replaceAll(URL, id); + result = result.replaceAll(HEIGHT, "" + height); + result = result.replaceAll(WIDTH, "" + width); + return result; } - public boolean is(final String url) { - return url.matches(detectRegex); + public int getHeight() { + return height; } + public String getId(final String url) { + String id = url.replaceFirst(idRegex, "$1"); + return id; + } + public String getName() { return name; } @@ -33,4 +49,20 @@ public String getSiteurl() { return siteurl; } + + public int getWidth() { + return width; + } + + public boolean is(final String url) { + return url.matches(detectRegex); + } + + public void setHeight(final int height) { + this.height = height; + } + + public void setWidth(final int width) { + this.width = width; + } } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaRegistry.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaRegistry.java 2009-04-22 14:36:46 UTC (rev 1099) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaRegistry.java 2009-04-24 02:28:18 UTC (rev 1100) @@ -7,7 +7,8 @@ private static final long serialVersionUID = 1L; - public static final ExternalMediaDescriptor NO_MEDIA = new ExternalMediaDescriptor(null, null, null, null, null); + public static final ExternalMediaDescriptor NO_MEDIA = new ExternalMediaDescriptor(null, null, null, null, null, 0, + 0); public ExternalMediaDescriptor get(final String url) { for (ExternalMediaDescriptor media : this) { Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/abstractmedia/InsertMediaAbstractPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/abstractmedia/InsertMediaAbstractPanel.java 2009-04-22 14:36:46 UTC (rev 1099) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/abstractmedia/InsertMediaAbstractPanel.java 2009-04-24 02:28:18 UTC (rev 1100) @@ -52,6 +52,6 @@ } public void setIntro(final String text) { - intro.setHtml(text); + intro.setHtml(text + "<br/>"); } } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/abstractmedia/MediaUtils.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/abstractmedia/MediaUtils.java 2009-04-22 14:36:46 UTC (rev 1099) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/abstractmedia/MediaUtils.java 2009-04-24 02:28:18 UTC (rev 1100) @@ -17,6 +17,11 @@ this.downloadUtils = downloadUtils; } + public String getAviEmbed(final StateToken token) { + return session.getInitData().getAviEmbedObject().replace(DOC_URL_TAG, + session.getSiteUrl() + downloadUtils.getUrl(token)); + } + public String getFlvEmbed(final StateToken token) { return session.getInitData().getFlvEmbedObject().replace(DOC_URL_TAG, session.getSiteUrl() + downloadUtils.getUrl(token)); Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ext/InsertMediaExtPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ext/InsertMediaExtPresenter.java 2009-04-22 14:36:46 UTC (rev 1099) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ext/InsertMediaExtPresenter.java 2009-04-24 02:28:18 UTC (rev 1100) @@ -17,8 +17,27 @@ super(insertMediaDialog); this.externalMediaRegistry = externalMediaRegistry; - externalMediaRegistry.add(new ExternalMediaDescriptor("youtube", "http://youtube.com", - "http://[a-z]*.youtube.com/watch?v=.*", "FIXME", "<embed [%d]>")); + externalMediaRegistry.add(new ExternalMediaDescriptor( + "youtube", + "http://youtube.com", + ".*youtube.*", + ".*youtube.com/watch.*[\\?&]v=(.*)", + "<object width=\"###WIDTH###\" height=\"###HEIGHT###\"><param name=\"movie\" value=\"http://youtube.com/v/###URL###\" /><param name=\"wmode\" value=\"opaque\" /><embed src=\"http://youtube.com/v/###URL###\" type=\"application/x-shockwave-flash\" width=\"###WIDTH###\" height=\"###HEIGHT###\" wmode=\"opaque\"></embed></object>", + 480, 385)); + externalMediaRegistry.add(new ExternalMediaDescriptor( + "blip.tv", + "http://blip.tv", + ".*blip\\.tv.*", + ".*blip.tv/file/([0-9]+).*", + "<embed src=\"http://blip.tv/play/###URL###\" type=\"application/x-shockwave-flash\" width=\"###WIDTH###\" height=\"###HEIGHT###\" allowscriptaccess=\"always\" allowfullscreen=\"true\" wmode=\"opaque\" ></embed>", + 480, 385)); + externalMediaRegistry.add(new ExternalMediaDescriptor( + "google video", + "http://video.google.com/", + ".*video\\.google.*", + ".*video\\.google\\.com/videoplay.*docid=([0-9]+).*", + "<embed id=\"VideoPlayback\" src=\"http://video.google.com/googleplayer.swf?docid=###URL###&hl=es&fs=true\" style=\"width:###WIDTH###;height:###HEIGHT###\" allowFullScreen=\"true\" allowScriptAccess=\"always\" type=\"application/x-shockwave-flash\" wmode=\"opaque\" > </embed>", + 400, 326)); } public void init(final InsertMediaExtView view) { Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java 2009-04-22 14:36:46 UTC (rev 1099) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java 2009-04-24 02:28:18 UTC (rev 1100) @@ -94,6 +94,8 @@ view.setContent(mediaUtils.get().getOggEmbed(token), false); } else if (mimeType.isFlv()) { view.setContent(mediaUtils.get().getFlvEmbed(token), false); + } else if (mimeType.isAvi()) { + view.setContent(mediaUtils.get().getAviEmbed(token), false); } else if (mimeType.isText()) { view.setContent(contentBody, true); } else { Modified: trunk/src/main/resources/kune.properties =================================================================== --- trunk/src/main/resources/kune.properties 2009-04-22 14:36:46 UTC (rev 1099) +++ trunk/src/main/resources/kune.properties 2009-04-24 02:28:18 UTC (rev 1100) @@ -54,7 +54,9 @@ # The code used to play local embeded videos/audios. Change this with other player/code (include a ###DOC_URL### tag) kune.media.flvembededobject = <object width="400" height="300" data="http://flowplayer.org/swf/flowplayer-3.1.0.swf" type="application/x-shockwave-flash"> <param name="movie" value="http://flowplayer.org/swf/flowplayer-3.1.0.swf" /> <param name="allowfullscreen" value="true" /> <param name="allowscriptaccess" value="always" /> <param name="flashvars" value='config={"clip":{"url":"###DOC_URL###", "autoPlay": false, "autoBuffering": false },"canvas":{"backgroundColor":"#CC6633"},"plugins":{"controls":{"time":true,"volume":false,"fullscreen":true}}}' /> <param name="wmode" value="opaque"> </object> kune.media.mp3embededobject = <object width="350" height="24" data="http://flowplayer.org/swf/flowplayer-3.1.0.swf" type="application/x-shockwave-flash"> <param name="movie" value="http://flowplayer.org/swf/flowplayer-3.1.0.swf" /> <param name="allowfullscreen" value="true" /> <param name="allowscriptaccess" value="always" /> <param name="flashvars" value='config={"clip":{"url":"###DOC_URL###", "autoPlay": false, "autoBuffering": false },"canvas":{"backgroundColor":"#CC6633"},"plugins":{"audio":{"url":"http://flowplayer.org/swf/flowplayer.audio.swf"},"controls":{"time":true,"volume":true,"fullscreen":false}}}' /> <param name="wmode" value="opaque"> </object> -kune.media.aviembededobject = <object > </object> -kune.media.oggembededobject = <applet code="com.fluendo.player.Cortado.class" archive="/kune/others/cortado-ovt-debug-0.2.2.jar" width="352" height="288"> <param name="url" value="###DOC_URL###"/> <param name="local" value="false"/> <param name="duration" value="232"/> <param name="keepAspect" value="true"/> <param name="video" value="true"/> <param name="audio" value="true"/> <param name="bufferSize" value="200"/> <param name="userId" value="user"/> <param name="password" value="test"/> </applet> -# http://www.flumotion.net/cortado/ -# https://code.fluendo.com/flumotion/trac/browser/cortado/trunk/README +kune.media.oggembededobject = <applet code="com.fluendo.player.Cortado.class" archive="/kune/others/cortado.jar" width="352" height="288"> <param name="url" value="###DOC_URL###"/> <param name="local" value="false"/> <param name="duration" value="232"/> <param name="keepAspect" value="true"/> <param name="video" value="true"/> <param name="audio" value="true"/> <param name="bufferSize" value="200"/> <param name="userId" value="user"/> <param name="password" value="test"/> </applet> +kune.media.aviembededobject = <object data="###DOC_URL###" type="video/msvideo" /> + +### More info about properties +# http://en.wikipedia.org/wiki/.properties +# http://java.sun.com/javase/6/docs/api/java/util/Properties.html#load(java.io...) Added: trunk/src/test/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaDescriptorTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaDescriptorTest.java 2009-04-22 14:36:46 UTC (rev 1099) +++ trunk/src/test/java/org/ourproject/kune/platf/client/ui/rte/insertmedia/ExternalMediaDescriptorTest.java 2009-04-24 02:28:18 UTC (rev 1100) @@ -0,0 +1,83 @@ +package org.ourproject.kune.platf.client.ui.rte.insertmedia; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Before; +import org.junit.Test; + +public class ExternalMediaDescriptorTest { + + private ExternalMediaDescriptor ytmedia; + private ExternalMediaDescriptor btmedia; + private ExternalMediaDescriptor gvmedia; + + @Before + public void before() { + ytmedia = new ExternalMediaDescriptor( + "youtube", + "http://youtube.com", + ".*youtube.*", + ".*youtube.com/watch.*[\\?&]v=(.*)", + "<object width=\"###WIDTH###\" height=\"###HEIGHT###\"><param name=\"movie\" value=\"http://youtube.com/v/###URL###\" /><param name=\"wmode\" value=\"transparent\" /><embed src=\"http://youtube.com/v/###URL###\" type=\"application/x-shockwave-flash\" width=\"###WIDTH###\" height=\"###HEIGHT###\" wmode=\"transparent\"></embed></object>", + 480, 385); + btmedia = new ExternalMediaDescriptor( + "blip.tv", + "http://blip.tv", + ".*blip\\.tv.*", + ".*blip.tv/file/([0-9]+).*", + "<embed src=\"http://blip.tv/play/###URL###\" type=\"application/x-shockwave-flash\" width=\"###WIDTH###\" height=\"###HEIGHT###\" allowscriptaccess=\"always\" allowfullscreen=\"true\"></embed>", + 480, 385); + gvmedia = new ExternalMediaDescriptor( + "google video", + "http://video.google.com/", + ".*video\\.google.*", + ".*video\\.google\\.com/videoplay.*docid=([0-9]+).*", + "<embed id=\"VideoPlayback\" src=\"http://video.google.com/googleplayer.swf?docid=###URL###&hl=es&fs=true\" style=\"width:###WIDTH###;height:###HEIGHT###\" allowFullScreen=\"true\" allowScriptAccess=\"always\" type=\"application/x-shockwave-flash\"> </embed>", + 400, 326); + + } + + @Test + public void getIds() { + assertEquals("v2aKo6la7J4", ytmedia.getId("http://www.youtube.com/watch?v=v2aKo6la7J4")); + assertEquals("v2aKo6la7J4", ytmedia.getId("http://de.youtube.com/watch?v=v2aKo6la7J4")); + assertEquals("v2aKo6la7J4", ytmedia.getId("http://www.youtube.com/watch?gl=ES&hl=es&v=v2aKo6la7J4")); + assertEquals("v2aKo6la7J4", ytmedia.getId("http://youtube.com/watch?gl=ES&hl=es&v=v2aKo6la7J4")); + + assertEquals("1646241", btmedia.getId("http://vjrj.blip.tv/file/1646241/")); + assertEquals("1646241", + btmedia.getId("http://blip.tv/file/1646241?utm_source=featured_ep&utm_medium=featured_ep")); + assertEquals("1646241", btmedia.getId("http://blip.tv/file/1646241")); + + assertEquals( + "7360794370207355739", + gvmedia.getId("http://video.google.com/videoplay?ei=VBPxSbXDLob2-Aabu9B-&q=chomsky&docid=73...")); + assertEquals( + "7360794370207355739", + gvmedia.getId("http://video.google.com/videoplay?docid=7360794370207355739&ei=VBPxSbXDLob2-...")); + assertEquals("7360794370207355739", + gvmedia.getId("http://video.google.com/videoplay?docid=7360794370207355739")); + } + + @Test + public void testGeEmb() { + String result = ytmedia.getEmbed("http://www.youtube.com/watch?v=v2aKo6la7J4"); + assertFalse(result.matches(ExternalMediaDescriptor.HEIGHT)); + assertFalse(result.matches(ExternalMediaDescriptor.WIDTH)); + assertFalse(result.matches(ExternalMediaDescriptor.URL)); + assertTrue(result.matches(".*v2aKo6la7J4.*")); + } + + @Test + public void testMatch() { + assertTrue(ytmedia.is("sdfklasdfayoutubekasdf")); + } + + @Test + public void testNoMatch() { + assertFalse(ytmedia.is("sdfklasdfakasdf")); + } + +}