Author: solomax
Date: Fri May 17 15:20:48 2013
New Revision: 1483857

URL: http://svn.apache.org/r1483857
Log:
[OPENMEETINGS-626] Recordings converted for html5;
        recordings are playing in FF;

Modified:
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/BaseConverter.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/Application.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/user/record/RecordingsPanel.html
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/user/record/RecordingsPanel.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/OggRecordingResourceReference.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/BaseConverter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/BaseConverter.java?rev=1483857&r1=1483856&r2=1483857&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/BaseConverter.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/BaseConverter.java
 Fri May 17 15:20:48 2013
@@ -307,7 +307,7 @@ public abstract class BaseConverter {
        
        public void convertToMp4(FlvRecording r, List<ConverterProcessResult> 
returnLog) throws IOException {
                //TODO add faststart, move filepaths to helpers
-               File file = OmFileHelper.getRecording(r.getFileName());
+               File file = OmFileHelper.getRecording(r.getFileHash());
                if (!file.exists()) {
                        return;
                }

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/Application.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/Application.java?rev=1483857&r1=1483856&r2=1483857&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/Application.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/Application.java
 Fri May 17 15:20:48 2013
@@ -28,6 +28,8 @@ import org.apache.openmeetings.web.user.
 import org.apache.openmeetings.web.user.dashboard.RssWidgetDescriptor;
 import org.apache.openmeetings.web.user.dashboard.StartWidgetDescriptor;
 import org.apache.openmeetings.web.user.dashboard.WelcomeWidgetDescriptor;
+import org.apache.openmeetings.web.util.Mp4RecordingResourceReference;
+import org.apache.openmeetings.web.util.OggRecordingResourceReference;
 import org.apache.openmeetings.web.util.UserDashboardPersister;
 import org.apache.wicket.Page;
 import org.apache.wicket.RestartResponseException;
@@ -97,9 +99,8 @@ public class Application extends Authent
                
                mountPage("signin", getSignInPageClass());
                mountPage("notinited", NotInitedPage.class);
-               //TODO uncomment this and create faster solution for checking 
rights
-               //mountResource("/recordings/mp4/${id}", new 
Mp4RecordingResourceReference());
-               //mountResource("/recordings/ogg/${id}", new 
OggRecordingResourceReference());
+               mountResource("/recordings/mp4/${id}", new 
Mp4RecordingResourceReference());
+               mountResource("/recordings/ogg/${id}", new 
OggRecordingResourceReference());
 
                getRootRequestMapperAsCompound().add(new 
HomePageMapper(getHomePage()) {
                        @Override

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/user/record/RecordingsPanel.html
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/user/record/RecordingsPanel.html?rev=1483857&r1=1483856&r2=1483857&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/user/record/RecordingsPanel.html
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/user/record/RecordingsPanel.html
 Fri May 17 15:20:48 2013
@@ -76,10 +76,8 @@
                        </td>
                        <td class="video" wicket:id="video">
                                <div wicket:id="wait"></div>
-                               <div wicket:id="player" class="player">
-                                       <video controls>
-                                               <source wicket:id="mp4stream" 
type="video/mp4"/>
-                                               <source wicket:id="oggStream" 
type="video/ogg"/>
+                               <div class="player">
+                                       <video wicket:id="player">
                                                Your browser does not support 
HTML5 video. <!-- FIXME hardcoded -->
                                        </video>
                                </div>

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/user/record/RecordingsPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/user/record/RecordingsPanel.java?rev=1483857&r1=1483856&r2=1483857&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/user/record/RecordingsPanel.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/user/record/RecordingsPanel.java
 Fri May 17 15:20:48 2013
@@ -18,10 +18,7 @@
  */
 package org.apache.openmeetings.web.user.record;
 
-import static org.apache.openmeetings.utils.OmFileHelper.MP4_EXTENSION;
-import static org.apache.openmeetings.utils.OmFileHelper.OGG_EXTENSION;
 import static org.apache.openmeetings.utils.OmFileHelper.getMp4Recording;
-import static org.apache.openmeetings.utils.OmFileHelper.getOggRecording;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
@@ -37,8 +34,8 @@ import org.apache.openmeetings.persisten
 import org.apache.openmeetings.persistence.beans.flvrecord.FlvRecording;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.UserPanel;
-import org.apache.openmeetings.web.util.AjaxDownload;
-import org.apache.wicket.AttributeModifier;
+import org.apache.openmeetings.web.util.Mp4RecordingResourceReference;
+import org.apache.openmeetings.web.util.OggRecordingResourceReference;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -51,9 +48,10 @@ import org.apache.wicket.markup.html.bas
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.request.resource.ContentDisposition;
-import org.apache.wicket.util.resource.FileResourceStream;
-import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.model.util.ListModel;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.wicketstuff.html5.media.MediaSource;
+import org.wicketstuff.html5.media.video.Html5Video;
 
 public class RecordingsPanel extends UserPanel {
        private static final long serialVersionUID = 1321258690447136958L;
@@ -61,13 +59,11 @@ public class RecordingsPanel extends Use
        private WebMarkupContainer trees = new WebMarkupContainer("trees");
        private WebMarkupContainer video = new WebMarkupContainer("video");
        private WebMarkupContainer wait = new WebMarkupContainer("wait");
-       private WebMarkupContainer player = new WebMarkupContainer("player");
-       private WebMarkupContainer mp4stream = new 
WebMarkupContainer("mp4stream");
-       private WebMarkupContainer oggStream = new 
WebMarkupContainer("oggStream");
-       private final AjaxDownload mp4download;
-       private final AjaxDownload oggDownload;
+       private final Mp4RecordingResourceReference mp4res = new 
Mp4RecordingResourceReference();
+       private final OggRecordingResourceReference oggres = new 
OggRecordingResourceReference();
+       private final WebMarkupContainer player;
+       private final IModel<List<MediaSource>> playerModel = new 
ListModel<MediaSource>(new ArrayList<MediaSource>()); 
        private IModel<FlvRecording> rm = new 
CompoundPropertyModel<FlvRecording>(new FlvRecording());
-       boolean sourceSrcSet = false;
 
        public RecordingsPanel(String id) {
                super(id);
@@ -113,57 +109,20 @@ public class RecordingsPanel extends Use
                        .add(new Label("room_id"))
                        .setOutputMarkupId(true)
                        );
-               add(video.add(wait.setVisible(false), player.add(mp4stream, 
oggStream).setVisible(false)).setOutputMarkupId(true));
-               add(mp4download = new AjaxDownload() {
-                       private static final long serialVersionUID = 
3964935286359801781L;
+               player = new Html5Video("player", playerModel) {
+                       private static final long serialVersionUID = 
-6058309447222765121L;
 
                        @Override
-                       protected String getFileName() {
-                               return rm.getObject().getFileHash() + 
MP4_EXTENSION;
+                       protected boolean isAutoPlay() {
+                               return false;
                        }
                        
                        @Override
-                       protected ContentDisposition getContentDisposition() {
-                               return ContentDisposition.INLINE;
+                       protected boolean isControls() {
+                               return true;
                        }
-                       
-                       @Override
-                       protected IResourceStream getResourceStream() {
-                               return new 
FileResourceStream(getMp4Recording(rm.getObject().getFileHash())) {
-                                       private static final long 
serialVersionUID = -6932595565356990873L;
-
-                                       @Override
-                                       public String getContentType() {
-                                               return "video/mp4";
-                                       }
-                               };
-                       }
-               });
-               add(oggDownload = new AjaxDownload() {
-                       private static final long serialVersionUID = 
1455929706119733507L;
-
-                       @Override
-                       protected String getFileName() {
-                               return rm.getObject().getFileHash() + 
OGG_EXTENSION;
-                       }
-                       
-                       @Override
-                       protected ContentDisposition getContentDisposition() {
-                               return ContentDisposition.INLINE;
-                       }
-                       
-                       @Override
-                       protected IResourceStream getResourceStream() {
-                               return new 
FileResourceStream(getOggRecording(rm.getObject().getFileHash())) {
-                                       private static final long 
serialVersionUID = -1374855048096998543L;
-
-                                       @Override
-                                       public String getContentType() {
-                                               return "video/ogg";
-                                       }
-                               };
-                       }
-               });
+               };
+               add(video.add(wait.setVisible(false), 
player.setVisible(false)).setOutputMarkupId(true));
        }
 
        //FIXME need to be generalized to use as Room files explorer
@@ -210,14 +169,11 @@ public class RecordingsPanel extends Use
                                                super.onClick(target);
                                        } else {
                                                boolean videoExists = 
getMp4Recording(r.getFileHash()).exists();
-                                               if (!sourceSrcSet && 
videoExists) {
-                                                       //CharSequence mp4Url = 
getRequestCycle().urlFor(new Mp4RecordingResourceReference(), new 
PageParameters().add("id", r.getFlvRecordingId()));
-                                                       //CharSequence oggUrl = 
getRequestCycle().urlFor(new OggRecordingResourceReference(), new 
PageParameters().add("id", r.getFlvRecordingId()));
-                                                       
mp4stream.add(AttributeModifier.replace("src", Model.of("" + 
mp4download.getCallbackUrl())));
-                                                       
//mp4stream.add(AttributeModifier.replace("src", Model.of("" + mp4Url)));
-                                                       
oggStream.add(AttributeModifier.replace("src", Model.of("" + 
oggDownload.getCallbackUrl())));
-                                                       
//oggStream.add(AttributeModifier.replace("src", Model.of("" + oggUrl)));
-                                                       sourceSrcSet = true;
+                                               if (videoExists) {
+                                                       PageParameters pp = new 
PageParameters().add("id", r.getFlvRecordingId());
+                                                       
playerModel.setObject(Arrays.asList(
+                                                                       new 
MediaSource("" + getRequestCycle().urlFor(mp4res, pp), "video/mp4")
+                                                                       , new 
MediaSource("" + getRequestCycle().urlFor(oggres, pp), "video/ogg")));
                                                }
                                                player.setVisible(videoExists);
                                                target.add(video, info);

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java?rev=1483857&r1=1483856&r2=1483857&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java
 Fri May 17 15:20:48 2013
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.web.util;
 
+import static org.apache.openmeetings.utils.OmFileHelper.MP4_EXTENSION;
 import static org.apache.openmeetings.utils.OmFileHelper.getMp4Recording;
 
 import java.io.File;
@@ -37,6 +38,11 @@ public class Mp4RecordingResourceReferen
        }
        
        @Override
+       String getFileName(FlvRecording r) {
+               return r.getFileHash() + MP4_EXTENSION;
+       }
+       
+       @Override
        File getFile(FlvRecording r) {
                return getMp4Recording(r.getFileHash());
        }

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/OggRecordingResourceReference.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/OggRecordingResourceReference.java?rev=1483857&r1=1483856&r2=1483857&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/OggRecordingResourceReference.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/OggRecordingResourceReference.java
 Fri May 17 15:20:48 2013
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.web.util;
 
+import static org.apache.openmeetings.utils.OmFileHelper.OGG_EXTENSION;
 import static org.apache.openmeetings.utils.OmFileHelper.getOggRecording;
 
 import java.io.File;
@@ -37,6 +38,11 @@ public class OggRecordingResourceReferen
        }
        
        @Override
+       String getFileName(FlvRecording r) {
+               return r.getFileHash() + OGG_EXTENSION;
+       }
+       
+       @Override
        File getFile(FlvRecording r) {
                return getOggRecording(r.getFileHash());
        }

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java?rev=1483857&r1=1483856&r2=1483857&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java
 Fri May 17 15:20:48 2013
@@ -38,7 +38,6 @@ import org.apache.wicket.util.string.Str
 
 public abstract class RecordingResourceReference extends ResourceReference {
        private static final long serialVersionUID = -7420364030290560099L;
-       private File file;
 
        public RecordingResourceReference(Class<? extends 
RecordingResourceReference> clazz) {
                super(clazz, "recordings");
@@ -46,42 +45,47 @@ public abstract class RecordingResourceR
 
        @Override
        public IResource getResource() {
-               
                return new ResourceStreamResource() {
                        private static final long serialVersionUID = 
-961779297961218109L;
+                       private File file;
                        
                        @Override
                        protected IResourceStream getResourceStream() {
                                return file == null ? null : new 
FileResourceStream(file) {
-                                       private static final long 
serialVersionUID = -6932595565356990873L;
-                                       
+                                       private static final long 
serialVersionUID = 2546785247219805747L;
+
                                        @Override
                                        public String getContentType() {
                                                return 
RecordingResourceReference.this.getContentType();
                                        }
                                };
-
                        }
                        
                        @Override
                        protected ResourceResponse 
newResourceResponse(Attributes attributes) {
+                               ResourceResponse rr = new ResourceResponse();
                                FlvRecording r = getRecording(attributes);
                                if (r != null) {
-                                       setFileName(r.getFileHash());
                                        file = getFile(r);
+                                       rr.setFileName(getFileName(r));
+                                       
rr.setContentType(RecordingResourceReference.this.getContentType());
+                                       rr = 
super.newResourceResponse(attributes);
+                               } else {
+                                       rr.setError(404);
                                }
-                               return super.newResourceResponse(attributes);
+                               return rr;
                        }
                };
        }
        
        abstract String getContentType();
+       abstract String getFileName(FlvRecording r);
        abstract File getFile(FlvRecording r);
        
        private FlvRecording getRecording(Attributes attributes) {
                PageParameters params = attributes.getParameters();
                StringValue id = params.get("id");
-               if (!id.isEmpty()) {
+               if (getUserId() > 0 && !id.isEmpty()) {
                        FlvRecording r = 
getBean(FlvRecordingDao.class).getFlvRecordingById(id.toLongObject());
                        if (r.getOwnerId() == null || getUserId() == 
r.getOwnerId()) {
                                return r;


Reply via email to