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;