Author: solomax
Date: Fri May 17 14:01:01 2013
New Revision: 1483807

URL: http://svn.apache.org/r1483807
Log:
[OPENMEETINGS-626] basic videoplayer is added (somehow working)

Added:
    
openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/film_error.png
   (with props)
    
openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/house_link.png
   (with props)
    
openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/world_link.png
   (with props)
    
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/WebContent/openmeetings/css/theme.css
    openmeetings/trunk/singlewebapp/ivy.xml
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/FlvRecordingDao.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/BaseConverter.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/FlvInterviewConverter.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/FlvRecorderConverter.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/utils/OmFileHelper.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/AjaxDownload.java

Added: 
openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/film_error.png
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/film_error.png?rev=1483807&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/film_error.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: 
openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/house_link.png
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/house_link.png?rev=1483807&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/house_link.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: 
openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/world_link.png
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/world_link.png?rev=1483807&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/images/world_link.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/theme.css
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/theme.css?rev=1483807&r1=1483806&r2=1483807&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/theme.css 
(original)
+++ openmeetings/trunk/singlewebapp/WebContent/openmeetings/css/theme.css Fri 
May 17 14:01:01 2013
@@ -606,6 +606,8 @@ div.tableWrapper {
 }
 .recording .files .trees {
        min-height: 400px;
+       overflow-x: hidden;
+       overflow-y: auto;
 }
 .recording .files .sizes table, .recording .files .info table {
        width: 100%;
@@ -615,7 +617,13 @@ div.tableWrapper {
        padding-right: 5px;
        padding-left: 5px;
 }
-.recording .video {
+.recording .video .player {
+       width: 100%;
+       display: inline-block;
+       box-shadow: 0 0 10px 1px rgba(74, 137, 151, 0.5);
+}
+.recording .video .player video {
+       width: 100%;
 }
 .align-left {
        float: left;
@@ -653,6 +661,20 @@ div.tableWrapper {
 .recording-icon {
        padding-left: 18px;
        background-image: url(images/film.png);
-       /*background-position: 0px 50%;*/
        background-repeat: no-repeat;
-}
\ No newline at end of file
+}
+.broken-recording-icon {
+       padding-left: 18px;
+       background-image: url(images/film_error.png);
+       background-repeat: no-repeat;
+}
+.my-recordings-icon {
+       padding-left: 18px;
+       background-image: url(images/house_link.png);
+       background-repeat: no-repeat;
+}
+.public-recordings-icon {
+       padding-left: 18px;
+       background-image: url(images/world_link.png);
+       background-repeat: no-repeat;
+}

Modified: openmeetings/trunk/singlewebapp/ivy.xml
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/ivy.xml?rev=1483807&r1=1483806&r2=1483807&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/ivy.xml (original)
+++ openmeetings/trunk/singlewebapp/ivy.xml Fri May 17 14:01:01 2013
@@ -276,6 +276,9 @@
                <dependency org="org.wicketstuff" 
name="wicketstuff-urlfragment" rev="6.0-20130515.164331-3" 
conf="openmeetings->*" transitive="false">
                        <include type="jar" />
                </dependency>
+               <dependency org="org.wicketstuff" name="wicketstuff-html5" 
rev="6.7.0" conf="openmeetings->*" transitive="false">
+                       <include type="jar" />
+               </dependency>
                
                <!-- iCal4j seems to need this JAR -->
                <dependency org="edu.emory.mathcs" 
name="backport-util-concurrent" rev="3.1" conf="openmeetings->*"/>

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/FlvRecordingDao.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/FlvRecordingDao.java?rev=1483807&r1=1483806&r2=1483807&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/FlvRecordingDao.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/FlvRecordingDao.java
 Fri May 17 14:01:01 2013
@@ -228,7 +228,7 @@ public class FlvRecordingDao {
                        
                        return flvRecordingList;
                } catch (Exception ex2) {
-                       log.error("[getFlvRecordingByOwner]: ",ex2);
+                       log.error("[getFlvRecordingRootByPublic]: ",ex2);
                }
                return null;
        }

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=1483807&r1=1483806&r2=1483807&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 14:01:01 2013
@@ -18,7 +18,11 @@
  */
 package org.apache.openmeetings.data.flvrecord.converter;
 
+import static org.apache.openmeetings.utils.OmFileHelper.MP4_EXTENSION;
+import static org.apache.openmeetings.utils.OmFileHelper.OGG_EXTENSION;
+
 import java.io.File;
+import java.io.IOException;
 import java.util.List;
 
 import org.apache.openmeetings.OpenmeetingsVariables;
@@ -56,7 +60,7 @@ public abstract class BaseConverter {
                return path;
        }
        
-       protected String getPathToFFMPEG() {
+       public String getPathToFFMPEG() {
                return getPath("ffmpeg_path", "ffmpeg");
        }
 
@@ -300,4 +304,59 @@ public abstract class BaseConverter {
                        log.error("[stripAudioFromFLVs]", err);
                }
        }
+       
+       public void convertToMp4(FlvRecording r, List<ConverterProcessResult> 
returnLog) throws IOException {
+               //TODO add faststart, move filepaths to helpers
+               File file = OmFileHelper.getRecording(r.getFileName());
+               if (!file.exists()) {
+                       return;
+               }
+               String path = file.getCanonicalPath();
+               String mp4path = path + MP4_EXTENSION;
+               // ffmpeg -i video_source_file.ext -vcodec libx264 -b 250k -bt 
50k -acodec libfaac -ab 56k -ac 2 -s 480x320 video_out_file.mp4
+               String[] argv = new String[] {
+                               getPathToFFMPEG(), //
+                               "-i", path,
+                               "-vcodec", "libx264",
+                               "-b", "250k",
+                               "-bt", "50k",
+                               "-acodec", "libfaac",
+                               "-ab", "56k",
+                               "-ac", "2",
+                               "-s", r.getFlvWidth() + "x" + r.getFlvHeight(), 
//
+                               mp4path
+                               };
+
+               if (log.isDebugEnabled()) {
+                       log.debug("START generate MP4 ################# ");
+                       String tString = "";
+                       for (int i = 0; i < argv.length; i++) {
+                               tString += argv[i] + " ";
+                               // log.debug(" i " + i + " argv-i " + 
argv_fullFLV[i]);
+                       }
+                       log.debug(tString);
+                       log.debug("END generate MP4 ################# ");
+               }
+               returnLog.add(ProcessHelper.executeScript("generate MP4", 
argv));
+               
+               argv = new String[] {
+                               getPathToFFMPEG(), //
+                               "-i", mp4path,
+                               "-vcodec", "libtheora",
+                               "-acodec", "libvorbis",
+                               path + OGG_EXTENSION
+                               };
+
+               if (log.isDebugEnabled()) {
+                       log.debug("START generate MP4 ################# ");
+                       String tString = "";
+                       for (int i = 0; i < argv.length; i++) {
+                               tString += argv[i] + " ";
+                               // log.debug(" i " + i + " argv-i " + 
argv_fullFLV[i]);
+                       }
+                       log.debug(tString);
+                       log.debug("END generate MP4 ################# ");
+               }
+               returnLog.add(ProcessHelper.executeScript("generate MP4", 
argv));
+       }
 }

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/FlvInterviewConverter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/FlvInterviewConverter.java?rev=1483807&r1=1483806&r2=1483807&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/FlvInterviewConverter.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/FlvInterviewConverter.java
 Fri May 17 14:01:01 2013
@@ -452,7 +452,7 @@ public class FlvInterviewConverter exten
                        flvRecording.setFlvHeight(flvHeight);
 
                        String[] argv_fullFLV = new String[] {
-                                       this.getPathToFFMPEG(), //
+                                       getPathToFFMPEG(), //
                                        "-i", inputScreenFullFlv, "-i", 
outputFullWav,
                                        "-ar",
                                        "22050", //
@@ -535,6 +535,7 @@ public class FlvInterviewConverter exten
                        
flvRecording.setAlternateDownload(alternateDownloadName);
 
                        flvRecordingDaoImpl.updateFlvRecording(flvRecording);
+                       convertToMp4(flvRecording, returnLog);
 
                        flvRecordingLogDaoImpl
                                        
.deleteFLVRecordingLogByRecordingId(flvRecording

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/FlvRecorderConverter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/FlvRecorderConverter.java?rev=1483807&r1=1483806&r2=1483807&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/FlvRecorderConverter.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/flvrecord/converter/FlvRecorderConverter.java
 Fri May 17 14:01:01 2013
@@ -294,7 +294,8 @@ public class FlvRecorderConverter extend
                        
flvRecording.setAlternateDownload(alternateDownloadName);
 
                        
this.flvRecordingDaoImpl.updateFlvRecording(flvRecording);
-
+                       convertToMp4(flvRecording, returnLog);
+                       
                        for (ConverterProcessResult returnMap : returnLog) {
                                this.flvRecordingLogDaoImpl.addFLVRecordingLog(
                                                "generateFFMPEG", flvRecording, 
returnMap);

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/utils/OmFileHelper.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/utils/OmFileHelper.java?rev=1483807&r1=1483806&r2=1483807&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/utils/OmFileHelper.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/utils/OmFileHelper.java
 Fri May 17 14:01:01 2013
@@ -69,6 +69,8 @@ public class OmFileHelper {
        public static final String bigImagePrefix = "_big_";
        public static final String thumbImagePrefix = "_thumb_";
        public static final String dashboardFile = "dashboard.xml";
+       public static final String MP4_EXTENSION = ".mp4";
+       public static final String OGG_EXTENSION = ".ogg";
 
        public static void setOmHome(File omHome) {
                OmFileHelper.OM_HOME = omHome;
@@ -175,6 +177,18 @@ public class OmFileHelper {
                return getDir(getStreamsDir(), HIBERNATE_DIR);
        }
        
+       public static File getRecording(String name) {
+               return new File(getDir(getStreamsDir(), HIBERNATE_DIR), name);
+       }
+       
+       public static File getMp4Recording(String name) {
+               return new File(getDir(getStreamsDir(), HIBERNATE_DIR), name + 
MP4_EXTENSION);
+       }
+       
+       public static File getOggRecording(String name) {
+               return new File(getDir(getStreamsDir(), HIBERNATE_DIR), name + 
OGG_EXTENSION);
+       }
+       
        public static File getStreamsSubDir(Long id) {
                return getDir(getStreamsDir(), id.toString());
        }

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=1483807&r1=1483806&r2=1483807&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 14:01:01 2013
@@ -97,6 +97,9 @@ 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());
 
                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=1483807&r1=1483806&r2=1483807&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 14:01:01 2013
@@ -50,14 +50,6 @@
                                <div wicket:id="info" class="info">
                                        <table>
                                                <tr>
-                                                       <td>Shift</td>
-                                                       <td></td>
-                                               </tr>
-                                               <tr>
-                                                       <td>Loudness</td>
-                                                       <td></td>
-                                               </tr>
-                                               <tr>
                                                        <td><wicket:ommessage 
key="863"/></td>
                                                        <td><span 
wicket:id="fileName"></span></td>
                                                </tr>
@@ -73,6 +65,8 @@
                                                        <td><wicket:ommessage 
key="874"/></td>
                                                        <td><span 
wicket:id="room_id"></span></td>
                                                </tr>
+                                       </table>
+                                       <table>
                                                <tr>
                                                        <td><input 
type="button" wicket:ommessage="value:884"/></td>
                                                        <td><input 
type="button" wicket:ommessage="value:883"/></td>
@@ -80,7 +74,16 @@
                                        </table>
                                </div>
                        </td>
-                       <td class="video"></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"/>
+                                               Your browser does not support 
HTML5 video. <!-- FIXME hardcoded -->
+                                       </video>
+                               </div>
+                       </td>
                </tr>
        </table>
 </wicket:panel>

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=1483807&r1=1483806&r2=1483807&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 14:01:01 2013
@@ -18,6 +18,10 @@
  */
 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;
 
@@ -33,6 +37,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.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -45,12 +51,23 @@ 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;
 
 public class RecordingsPanel extends UserPanel {
        private static final long serialVersionUID = 1321258690447136958L;
-       WebMarkupContainer info = new WebMarkupContainer("info");
-       WebMarkupContainer trees = new WebMarkupContainer("trees");
+       private WebMarkupContainer info = new WebMarkupContainer("info");
+       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 IModel<FlvRecording> rm = new 
CompoundPropertyModel<FlvRecording>(new FlvRecording());
+       boolean sourceSrcSet = false;
 
        public RecordingsPanel(String id) {
                super(id);
@@ -96,8 +113,60 @@ 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;
+
+                       @Override
+                       protected String getFileName() {
+                               return rm.getObject().getFileHash() + 
MP4_EXTENSION;
+                       }
+                       
+                       @Override
+                       protected ContentDisposition getContentDisposition() {
+                               return ContentDisposition.INLINE;
+                       }
+                       
+                       @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";
+                                       }
+                               };
+                       }
+               });
        }
-       
+
+       //FIXME need to be generalized to use as Room files explorer
        class RecordingTree extends DefaultNestedTree<FlvRecording> {
                private static final long serialVersionUID = 
2527395034256868022L;
 
@@ -140,13 +209,61 @@ public class RecordingsPanel extends Use
                                        if (r.getIsFolder() == null || 
r.getIsFolder()) {
                                                super.onClick(target);
                                        } else {
-                                               target.add(info);
+                                               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;
+                                               }
+                                               player.setVisible(videoExists);
+                                               target.add(video, info);
                                        }
                                }
                                
                                @Override
                                protected String 
getOtherStyleClass(FlvRecording t) {
-                                       return t.getIsFolder() ? 
super.getOtherStyleClass(t) : "recording-icon";
+                                       String style;
+                                       if (t.getFlvRecordingId() == -2) {
+                                               style = "my-recordings-icon";
+                                       } else if (t.getFlvRecordingId() == -1) 
{
+                                               style = 
"public-recordings-icon";
+                                       } else {
+                                               style = t.getIsFolder() ? 
super.getOtherStyleClass(t)
+                                                               : 
(getMp4Recording(t.getFileHash()).exists() ? "recording-icon" : 
"broken-recording-icon");
+                                       }
+                                       return style;
+                               }
+                               
+                               @Override
+                               protected String getOpenStyleClass() {
+                                       String style;
+                                       FlvRecording r = getModelObject();
+                                       if (r.getFlvRecordingId() == -2) {
+                                               style = "my-recordings-icon";
+                                       } else if (r.getFlvRecordingId() == -1) 
{
+                                               style = 
"public-recordings-icon";
+                                       } else {
+                                               style = 
super.getOpenStyleClass();
+                                       }
+                                       return style;
+                               }
+                               
+                               @Override
+                               protected String getClosedStyleClass() {
+                                       String style;
+                                       FlvRecording r = getModelObject();
+                                       if (r.getFlvRecordingId() == -2) {
+                                               style = "my-recordings-icon";
+                                       } else if (r.getFlvRecordingId() == -1) 
{
+                                               style = 
"public-recordings-icon";
+                                       } else {
+                                               style = 
super.getOpenStyleClass();
+                                       }
+                                       return style;
                                }
                                
                                @Override
@@ -170,11 +287,7 @@ public class RecordingsPanel extends Use
                
                public Iterator<? extends FlvRecording> 
getChildren(FlvRecording node) {
                        if (node.getFlvRecordingId() < 0) {
-                               List<FlvRecording> roots = new 
ArrayList<FlvRecording>();
-                               for (Organisation_Users ou : 
getBean(UsersDao.class).get(getUserId()).getOrganisation_users()) {
-                                       
roots.addAll(getBean(FlvRecordingDao.class).getFlvRecordingRootByOwner(ou.getOrganisation().getOrganisation_id()));
-                               }
-                               return roots.iterator();
+                               return 
getBean(FlvRecordingDao.class).getFlvRecordingRootByOwner(getUserId()).iterator();
                        } else {
                                return super.getChildren(node);
                        }
@@ -193,7 +306,11 @@ public class RecordingsPanel extends Use
                
                public Iterator<? extends FlvRecording> 
getChildren(FlvRecording node) {
                        if (node.getFlvRecordingId() < 0) {
-                               return 
getBean(FlvRecordingDao.class).getFlvRecordingRootByPublic(getUserId()).iterator();
+                               List<FlvRecording> roots = new 
ArrayList<FlvRecording>();
+                               for (Organisation_Users ou : 
getBean(UsersDao.class).get(getUserId()).getOrganisation_users()) {
+                                       
roots.addAll(getBean(FlvRecordingDao.class).getFlvRecordingRootByPublic(ou.getOrganisation().getOrganisation_id()));
+                               }
+                               return roots.iterator();
                        } else {
                                return super.getChildren(node);
                        }

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/AjaxDownload.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/AjaxDownload.java?rev=1483807&r1=1483806&r2=1483807&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/AjaxDownload.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/AjaxDownload.java
 Fri May 17 14:01:01 2013
@@ -58,18 +58,18 @@ public class AjaxDownload extends Abstra
                }
 
                // the timeout is needed to let Wicket release the channel
-               target.appendJavaScript("setTimeout(\"window.location.href='" + 
url
-                               + "'\", 100);");
+               target.appendJavaScript("setTimeout(\"window.location.href='" + 
url + "'\", 100);");
        }
 
        public void onRequest() {
-               ResourceStreamRequestHandler handler = new 
ResourceStreamRequestHandler(
-                               getResourceStream(), getFileName());
-               handler.setContentDisposition(ContentDisposition.ATTACHMENT);
-               
getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(
-                               handler);
+               ResourceStreamRequestHandler handler = new 
ResourceStreamRequestHandler(getResourceStream(), getFileName());
+               handler.setContentDisposition(getContentDisposition());
+               
getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
        }
 
+       protected ContentDisposition getContentDisposition() {
+               return ContentDisposition.ATTACHMENT;
+       }
        /**
         * Override this method for a file name which will let the browser 
prompt
         * with a save/open dialog.

Added: 
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=1483807&view=auto
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java
 (added)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java
 Fri May 17 14:01:01 2013
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.util;
+
+import static org.apache.openmeetings.utils.OmFileHelper.getMp4Recording;
+
+import java.io.File;
+
+import org.apache.openmeetings.persistence.beans.flvrecord.FlvRecording;
+
+public class Mp4RecordingResourceReference extends RecordingResourceReference {
+       private static final long serialVersionUID = 6181482949621024822L;
+
+       public Mp4RecordingResourceReference() {
+               super(Mp4RecordingResourceReference.class);
+       }
+       
+       @Override
+       public String getContentType() {
+               return "video/mp4";
+       }
+       
+       @Override
+       File getFile(FlvRecording r) {
+               return getMp4Recording(r.getFileHash());
+       }
+}

Added: 
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=1483807&view=auto
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/OggRecordingResourceReference.java
 (added)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/OggRecordingResourceReference.java
 Fri May 17 14:01:01 2013
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.util;
+
+import static org.apache.openmeetings.utils.OmFileHelper.getOggRecording;
+
+import java.io.File;
+
+import org.apache.openmeetings.persistence.beans.flvrecord.FlvRecording;
+
+public class OggRecordingResourceReference extends RecordingResourceReference {
+       private static final long serialVersionUID = 6181482949621024822L;
+
+       public OggRecordingResourceReference() {
+               super(OggRecordingResourceReference.class);
+       }
+       
+       @Override
+       public String getContentType() {
+               return "video/ogg";
+       }
+       
+       @Override
+       File getFile(FlvRecording r) {
+               return getOggRecording(r.getFileHash());
+       }
+}

Added: 
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=1483807&view=auto
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java
 (added)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/RecordingResourceReference.java
 Fri May 17 14:01:01 2013
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.util;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.io.File;
+
+import org.apache.openmeetings.data.flvrecord.FlvRecordingDao;
+import org.apache.openmeetings.data.user.dao.UsersDao;
+import org.apache.openmeetings.persistence.beans.domain.Organisation_Users;
+import org.apache.openmeetings.persistence.beans.flvrecord.FlvRecording;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.IResource.Attributes;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.request.resource.ResourceStreamResource;
+import org.apache.wicket.util.resource.FileResourceStream;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.string.StringValue;
+
+public abstract class RecordingResourceReference extends ResourceReference {
+       private static final long serialVersionUID = -7420364030290560099L;
+       private File file;
+
+       public RecordingResourceReference(Class<? extends 
RecordingResourceReference> clazz) {
+               super(clazz, "recordings");
+       }
+
+       @Override
+       public IResource getResource() {
+               
+               return new ResourceStreamResource() {
+                       private static final long serialVersionUID = 
-961779297961218109L;
+                       
+                       @Override
+                       protected IResourceStream getResourceStream() {
+                               return file == null ? null : new 
FileResourceStream(file) {
+                                       private static final long 
serialVersionUID = -6932595565356990873L;
+                                       
+                                       @Override
+                                       public String getContentType() {
+                                               return 
RecordingResourceReference.this.getContentType();
+                                       }
+                               };
+
+                       }
+                       
+                       @Override
+                       protected ResourceResponse 
newResourceResponse(Attributes attributes) {
+                               FlvRecording r = getRecording(attributes);
+                               if (r != null) {
+                                       setFileName(r.getFileHash());
+                                       file = getFile(r);
+                               }
+                               return super.newResourceResponse(attributes);
+                       }
+               };
+       }
+       
+       abstract String getContentType();
+       abstract File getFile(FlvRecording r);
+       
+       private FlvRecording getRecording(Attributes attributes) {
+               PageParameters params = attributes.getParameters();
+               StringValue id = params.get("id");
+               if (!id.isEmpty()) {
+                       FlvRecording r = 
getBean(FlvRecordingDao.class).getFlvRecordingById(id.toLongObject());
+                       if (r.getOwnerId() == null || getUserId() == 
r.getOwnerId()) {
+                               return r;
+                       }
+                       //FIXME UGLY need to be optimized
+                       for (Organisation_Users ou : 
getBean(UsersDao.class).get(getUserId()).getOrganisation_users()) {
+                               if 
(ou.getOrganisation().getOrganisation_id().equals(r.getOrganization_id())) {
+                                       return r;
+                               }
+                       }
+                       //TODO investigate if these checks are enough
+               }
+               return null;
+       }
+}


Reply via email to