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;
+ }
+}