Skip to content
Snippets Groups Projects
Commit 0b8b55f5 authored by uhensler's avatar uhensler
Browse files

OO-4357: Paella Palyer as video player in the live stream course element

parent 92ba833a
No related branches found
No related tags found
No related merge requests found
Showing
with 949 additions and 80 deletions
......@@ -119,7 +119,7 @@ This product uses software based on the Apache Software License like
* Java-html-sanitizer (Apache Software License, Version 2.0) [https://github.com/OWASP/java-html-sanitizer]
-----------------------------------------------------------------------
This produce uses software based on the MIT License
This product uses software based on the MIT License
* Bootstrap (MIT License) [http://http://getbootstrap.com]
* Prototype javascript framework (MIT License) [http://www.prototypejs.org]
* SCORM player project: reload (MIT License) [http://www.reload.ac.uk]
......@@ -211,3 +211,4 @@ This product uses software based on specific License
* periodic (none) [https://github.com/tra/periodic]
* typeahead.js (see src/main/webapp/WEB-INF/lib/licenses/typeahead.licence.txt) [https://github.com/twitter/typeahead.js/blob/master/LICENSE]
* validator.nu htmlparser (https://github.com/validator/htmlparser/blob/validator-nu/LICENSE.txt) [https://github.com/validator/htmlparser/blob/validator-nu/LICENSE.txt]
* Paella Player (https://paellaplayer.upv.es/license/) [https://paellaplayer.upv.es/license/]
......@@ -187,6 +187,8 @@ $theme.renderHTMLHeaderElements()
/* Detect IE below version 11 */
if (window.navigator.userAgent.indexOf('MSIE ') > 0) {
jQuery('body').addClass('o_browser_ie10');
} else if (!!navigator.userAgent.match(/Trident\/7\./)) {
jQuery('body').addClass('o_browser_ie11');
}
});
</script>
......
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.course.nodes.livestream.paella;
import org.olat.core.util.StringHelper;
/**
*
* Initial date: 13 Dec 2019<br>
* @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
*
*/
public class PaellaFactory {
public static Sources createSources(String url) {
Sources sources = new Sources();
addSource(sources, url);
return sources;
}
private static void addSource(Sources sources, String url) {
if (!StringHelper.containsNonWhitespace(url)) return;
String suffix = getSuffix(url);
if (suffix == null) return;
switch (suffix) {
case "m3u8":
addM3U8Source(sources, url);
break;
case "mp4":
addMP4Source(sources, url);
break;
default:
break;
}
}
private static void addM3U8Source(Sources sources, String url) {
Source source = createSource(url);
sources.setHls(new Source[] {source});
}
private static void addMP4Source(Sources sources, String url) {
Source source = createSource(url);
sources.setMp4(new Source[] {source});
}
private static Source createSource(String url) {
Source source = new Source();
source.setSrc(url);
source.setMimetype("video/mp4");
return source;
}
private static String getSuffix(String url) {
int i = url.lastIndexOf('.');
return i > 0? url.substring(i+1): null;
}
}
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.course.nodes.livestream.paella;
import java.nio.charset.StandardCharsets;
import javax.servlet.http.HttpServletRequest;
import org.apache.logging.log4j.Logger;
import org.olat.core.dispatcher.impl.StaticMediaDispatcher;
import org.olat.core.dispatcher.mapper.Mapper;
import org.olat.core.gui.media.MediaResource;
import org.olat.core.gui.media.StringMediaResource;
import org.olat.core.gui.render.StringOutput;
import org.olat.core.logging.Tracing;
import org.olat.core.util.StringHelper;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
*
* based on https://github.com/polimediaupv/paella-opencast/blob/master/src/main/paella-opencast/ui/embed.html
*
* Initial date: 11 Dec 2019<br>
* @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
*
*/
public class PaellaMapper implements Mapper {
private static final Logger log = Tracing.createLoggerFor(PaellaMapper.class);
private final ObjectMapper mapper = new ObjectMapper();
private final Sources sources;
public PaellaMapper(Sources sources) {
this.sources = sources;
}
@Override
public MediaResource handle(String relPath, HttpServletRequest request) {
StringMediaResource smr = new StringMediaResource();
String encoding = StandardCharsets.ISO_8859_1.name();
String mimetype = "text/html;charset=" + StringHelper.check4xMacRoman(encoding);
smr.setContentType(mimetype);
smr.setEncoding(encoding);
String content = createContent();
smr.setData(content);
return smr;
}
private String createContent() {
StringOutput sb = new StringOutput();
sb.append("<!DOCTYPE html>");
sb.append("<html>");
sb.append("<head>");
sb.append("<meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8;\">");
sb.append("<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">");
appendStaticJs(sb, "js/paella/player/javascript/swfobject.js");
appendStaticJs(sb, "js/paella/player/javascript/base.js");
appendStaticJs(sb, "js/paella/player/javascript/jquery.min.js");
appendStaticJs(sb, "js/paella/player/javascript/lunr.min.js");
appendStaticJs(sb, "js/paella/player/javascript/require.js");
appendStaticJs(sb, "js/paella/player/javascript/paella_player.js");
appendStaticCSS(sb, "js/paella/player/resources/bootstrap/css/bootstrap.min.css");
appendStaticCSS(sb, "js/paella/player/resources/style/style_dark.css");
sb.append("</head>");
sb.append("<body id=\"body\" onload=\"paella.load('playerContainer', {");
sb.append(" configUrl: '");
apendConfigUrl(sb);
sb.append("',");
sb.append(" data:");
sb.append("{");
sb.append("'streams': [{");
sb.append(" 'sources' : ");
sb.append(objectToJson(sources));
sb.append(", 'content': 'stream content'");
sb.append("}] ");
sb.append("}");
sb.append("}");
sb.append(");\">");
sb.append("<div id=\"playerContainer\" style=\"display:block;width:100%\">");
sb.append("</div>");
sb.append("</body>");
sb.append("</html>");
String html = sb.toString();
log.debug(html);
return html;
}
private void apendConfigUrl(StringOutput sb) {
StaticMediaDispatcher.renderStaticURI(sb, "js/paella/openolat/config.json");
}
private void appendStaticJs(StringOutput sb, String javascript) {
sb.append("<script src=\"");
StaticMediaDispatcher.renderStaticURI(sb, javascript);
sb.append("\"></script>");
}
private void appendStaticCSS(StringOutput sb, String css) {
sb.append("<link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"");
StaticMediaDispatcher.renderStaticURI(sb, css);
sb.append("\"></link>");
}
private String objectToJson(Object o) {
String json = null;
try {
json = mapper.writeValueAsString(o);
} catch (Exception e) {
json = "{}";
}
json = json.replace("\"", "'");
log.debug(json);
return json;
}
}
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.course.nodes.livestream.paella;
/**
*
* Initial date: 13 Dec 2019<br>
* @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
*
*/
public class Source {
private String src;
private String mimetype;
public String getSrc() {
return src;
}
public void setSrc(String src) {
this.src = src;
}
public String getMimetype() {
return mimetype;
}
public void setMimetype(String mimetype) {
this.mimetype = mimetype;
}
}
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.course.nodes.livestream.paella;
import com.fasterxml.jackson.annotation.JsonInclude;
/**
*
* Initial date: 13 Dec 2019<br>
* @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Sources {
private Source[] hls;
private Source[] mp4;
public Source[] getHls() {
return hls;
}
public void setHls(Source[] hls) {
this.hls = hls;
}
public Source[] getMp4() {
return mp4;
}
public void setMp4(Source[] mp4) {
this.mp4 = mp4;
}
}
......@@ -108,7 +108,7 @@ public class LiveStreamRunController extends BasicController {
streamsCtrl = new LiveStreamsController(ureq, swControl, moduleConfiguration, calendars);
listenTo(streamsCtrl);
} else {
streamsCtrl.refreshData();
streamsCtrl.refreshData(ureq.getUserSession());
addToHistory(ureq, streamsCtrl);
}
segmentView.select(streamsLink);
......
......@@ -19,19 +19,25 @@
*/
package org.olat.course.nodes.livestream.ui;
import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.List;
import org.olat.core.dispatcher.mapper.MapperService;
import org.olat.core.dispatcher.mapper.manager.MapperKey;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.logging.Tracing;
import org.olat.core.util.CodeHelper;
import org.olat.core.util.StringHelper;
import org.olat.core.util.UserSession;
import org.olat.course.nodes.livestream.LiveStreamEvent;
import org.olat.course.nodes.livestream.paella.PaellaFactory;
import org.olat.course.nodes.livestream.paella.PaellaMapper;
import org.olat.course.nodes.livestream.paella.Sources;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
......@@ -41,61 +47,51 @@ import org.olat.course.nodes.livestream.LiveStreamEvent;
*/
public class LiveStreamVideoController extends BasicController {
private static final Logger log = Tracing.createLoggerFor(LiveStreamVideoController.class);
private final VelocityContainer mainVC;
private Link retryLink;
private final List<MapperKey> mappers = new ArrayList<>();
private String url;
private boolean error = false;
@Autowired
private MapperService mapperService;
protected LiveStreamVideoController(UserRequest ureq, WindowControl wControl) {
super(ureq, wControl);
mainVC = createVelocityContainer("video");
updateUI();
updateUI(ureq.getUserSession());
putInitialPanel(mainVC);
}
public void setEvent(LiveStreamEvent event) {
public void setEvent(UserSession usess, LiveStreamEvent event) {
String newUrl = event != null? event.getLiveStreamUrl(): null;
if (newUrl == null || !newUrl.equalsIgnoreCase(url)) {
url = newUrl;
error = Boolean.FALSE;
updateUI();
updateUI(usess);
}
}
private void updateUI() {
if (error) {
private void updateUI(UserSession usess) {
if (StringHelper.containsNonWhitespace(url)) {
mainVC.contextPut("id", CodeHelper.getRAMUniqueID());
Sources sources = PaellaFactory.createSources(url);
PaellaMapper paellaMapper = new PaellaMapper(sources);
MapperKey mapperKey = mapperService.register(usess, paellaMapper);
mappers.add(mapperKey);
String baseURI = mapperKey.getUrl();
mainVC.contextPut("baseURI", baseURI);
} else {
mainVC.contextRemove("id");
mainVC.contextPut("error", error);
retryLink = LinkFactory.createButton("viewer.retry", mainVC, this);
} else {
mainVC.contextRemove("error");
if (StringHelper.containsNonWhitespace(url)) {
mainVC.contextPut("id", CodeHelper.getRAMUniqueID());
mainVC.contextPut("src", url);
} else {
mainVC.contextRemove("id");
}
}
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if ("error".equals(event.getCommand())) {
log.debug("Error when open a video from {}", url);
error = true;
updateUI();
} else if (source == retryLink) {
error = false;
updateUI();
}
//
}
@Override
protected void doDispose() {
//
mapperService.cleanUp(mappers);
}
}
......@@ -25,6 +25,7 @@ import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.util.UserSession;
import org.olat.course.nodes.livestream.LiveStreamEvent;
/**
......@@ -54,8 +55,8 @@ public class LiveStreamViewerController extends BasicController {
putInitialPanel(mainVC);
}
public void setEvent(LiveStreamEvent event) {
videoCtrl.setEvent(event);
public void setEvent(UserSession usess, LiveStreamEvent event) {
videoCtrl.setEvent(usess, event);
metadataCtrl.setEvent(event);
}
......
......@@ -30,6 +30,7 @@ import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.util.UserSession;
import org.olat.course.nodes.LiveStreamCourseNode;
import org.olat.course.nodes.cal.CourseCalendars;
import org.olat.course.nodes.livestream.LiveStreamEvent;
......@@ -129,12 +130,12 @@ public class LiveStreamViewersController extends BasicController {
mainVC.put("display9", displayCtrl9.getInitialComponent());
displayWrappers.add(new DisplayWrapper(displayCtrl9));
refresh();
refresh(ureq.getUserSession());
putInitialPanel(mainVC);
}
void refresh() {
void refresh(UserSession usess) {
List<? extends LiveStreamEvent> events = liveStreamService.getRunningEvents(calendars, bufferBeforeMin, bufferAfterMin);
putNoLiveStreamToMainVC(events);
......@@ -144,8 +145,8 @@ public class LiveStreamViewersController extends BasicController {
// luck.
events = removeOverlappingWithSameUrl(events);
Collections.sort(events, (e1, e2) -> e1.getBegin().compareTo(e2.getBegin()));
displayStartedEvents(events);
removeEndedEvents(events);
displayStartedEvents(usess, events);
removeEndedEvents(usess, events);
}
private void putNoLiveStreamToMainVC(List<? extends LiveStreamEvent> events) {
......@@ -203,13 +204,13 @@ public class LiveStreamViewersController extends BasicController {
return sameUrlEvents;
}
private void displayStartedEvents(List<? extends LiveStreamEvent> events) {
private void displayStartedEvents(UserSession usess, List<? extends LiveStreamEvent> events) {
for (LiveStreamEvent event: events) {
DisplayWrapper displayWrapper = getDisplayWrapper(event);
if (displayWrapper != null) {
updateEvent(displayWrapper, event);
updateEvent(usess, displayWrapper, event);
} else {
addToNextDisplay(event);
addToNextDisplay(usess, event);
}
}
}
......@@ -223,10 +224,10 @@ public class LiveStreamViewersController extends BasicController {
return null;
}
private void addToNextDisplay(LiveStreamEvent event) {
private void addToNextDisplay(UserSession usess, LiveStreamEvent event) {
DisplayWrapper nextDisplay = getNextFreeDisplay();
if (nextDisplay != null ) {
updateEvent(nextDisplay, event);
updateEvent(usess, nextDisplay, event);
}
}
......@@ -242,11 +243,11 @@ public class LiveStreamViewersController extends BasicController {
return nextDisplay;
}
private void removeEndedEvents(List<? extends LiveStreamEvent> events) {
private void removeEndedEvents(UserSession usess, List<? extends LiveStreamEvent> events) {
for (DisplayWrapper displayWrapper : displayWrappers) {
LiveStreamEvent wrappedEvent = displayWrapper.getEvent();
if (hasEnded(wrappedEvent, events)) {
updateEvent(displayWrapper, null);
updateEvent(usess, displayWrapper, null);
}
}
}
......@@ -262,9 +263,9 @@ public class LiveStreamViewersController extends BasicController {
return true;
}
private void updateEvent(DisplayWrapper displayWrapper, LiveStreamEvent event) {
private void updateEvent(UserSession usess, DisplayWrapper displayWrapper, LiveStreamEvent event) {
displayWrapper.setEvent(event);
displayWrapper.getController().setEvent(event);
displayWrapper.getController().setEvent(usess, event);
}
@Override
......
......@@ -31,6 +31,7 @@ import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.logging.Tracing;
import org.olat.core.util.UserSession;
import org.olat.course.nodes.cal.CourseCalendars;
import org.olat.modules.ModuleConfiguration;
......@@ -65,14 +66,14 @@ public class LiveStreamsController extends BasicController {
mainVC.put("list", listCtrl.getInitialComponent());
scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(new RefreshTask(), 10, 10, TimeUnit.SECONDS);
scheduler.scheduleAtFixedRate(new RefreshTask(ureq.getUserSession()), 10, 10, TimeUnit.SECONDS);
putInitialPanel(mainVC);
}
public synchronized void refreshData() {
public synchronized void refreshData(UserSession usess) {
log.debug("Refresh live stream data of " + getIdentity());
viewersCtrl.refresh();
viewersCtrl.refresh(usess);
listCtrl.refreshData();
}
......@@ -88,9 +89,16 @@ public class LiveStreamsController extends BasicController {
private final class RefreshTask implements Runnable {
private final UserSession usess;
public RefreshTask(UserSession usess) {
this.usess = usess;
}
@Override
public void run() {
refreshData();
refreshData(usess);
}
}
......
#if($r.isNotNull($error))
<div class="o_instruction">
$r.translate("viewer.error.stream")
<div class="o_button_group">
$r.render("viewer.retry")
</div>
</div>
#elseif($r.isNotNull($id))
<div>
## height / width does not matter, because the size is streched responsive.
<p><span id="o_livestream_${id}" class="olatFlashMovieViewer" style="display:block;border:solid 1px #000;">
<script>
var errorCallback_$id = function(mediaElement, originalNode, player) {$r.openJavaScriptCommand("error"));};
BPlayer.insertPlayer("$src","o_livestream_${id}",400,'100%',0,0,"video",undefined,true,true,false, null, errorCallback_$id);
</script>
</span></p>
#if($r.isNotNull($id))
<div class="o_paella_wrapper">
<div class="o_instruction o_paella_error">
$r.translate("viewer.error.browser")
</div>
<iframe id="${id}" allowfullscreen="true" src="${baseURI}" frameborder="0" />
</div>
#end
\ No newline at end of file
admin.buffer.before.min=$:\config.buffer.before.min
admin.buffer.after.min=$:\config.buffer.after.min
admin.default.values.title=Initialwerte
admin.default.values.desc=Hier k\u00f6nnen Sie die Initialwerte eines neuen Kursbausteines konfigurieren.
admin.default.values.desc=Hier k\u00F6nnen Sie die Initialwerte eines neuen Kursbausteines konfigurieren.
admin.coach.edit=$:\config.coach.edit
admin.general.title=$:\admin.menu.title
admin.menu.title=Livestream
......@@ -20,7 +20,7 @@ peekview.no.streams=Es sind keine Livestreams geplant.
peekview.open.live=Livestream anzeigen
peekview.open.upcoming=Alle anzeigen
peekview.title.live=Jetzt live: {0}
peekview.title.upcoming=Demn\u00e4chst: {0}
peekview.title.upcoming=Demn\u00E4chst: {0}
run.edit.events=Termine bearbeiten
run.streams=Live Streams
table.empty=Es sind keine Livestreams anstehend.
......@@ -29,6 +29,5 @@ table.header.description=$org.olat.commons.calendar\:cal.form.description
table.header.end=$org.olat.commons.calendar\:cal.form.end
table.header.location=$org.olat.commons.calendar\:cal.form.location
table.header.subject=$org.olat.commons.calendar\:cal.form.subject
viewer.error.stream=Der Livestream kann nicht angezeigt werden. Vermutlich wird der Livestream noch nicht ausgestrahlt.
viewer.error.browser=Der Livestream kann in diesem Browser nicht angezeigt werden. Bitte verwenden Sie einen anderen Browser.
viewer.no.stream=Aktuell wird kein Livestream ausgestrahlt.
viewer.retry=Erneut starten
......@@ -29,6 +29,5 @@ table.header.description=$org.olat.commons.calendar\:cal.form.description
table.header.end=$org.olat.commons.calendar\:cal.form.end
table.header.location=$org.olat.commons.calendar\:cal.form.location
table.header.subject=$org.olat.commons.calendar\:cal.form.subject
viewer.error.stream=It is not possible to show the live stream. Probably is the live stream not broadcasted yet.
viewer.error.browser=The livestream cannot be displayed in this browser. Please use a different browser.
viewer.no.stream=Currently no live stream is broadcasted.
viewer.retry=Try again
......@@ -30,6 +30,4 @@ table.header.description=$org.olat.commons.calendar\:cal.form.description
table.header.end=$org.olat.commons.calendar\:cal.form.end
table.header.location=$org.olat.commons.calendar\:cal.form.location
table.header.subject=$org.olat.commons.calendar\:cal.form.subject
viewer.error.stream=Il n'est pas possible d'afficher la vid\u00E9o. La diffusion en direct n'a probablement pas encore commenc\u00E9.
viewer.no.stream=Pas de diffusion pour l'instant.
viewer.retry=Essayer \u00E0 nouveau
......@@ -30,6 +30,4 @@ table.header.description=$org.olat.commons.calendar\:cal.form.description
table.header.end=$org.olat.commons.calendar\:cal.form.end
table.header.location=$org.olat.commons.calendar\:cal.form.location
table.header.subject=$org.olat.commons.calendar\:cal.form.subject
viewer.error.stream=N\u00E3o \u00E9 poss\u00EDvel mostrar a transmiss\u00E3o ao vivo. Provavelmente a transmiss\u00E3o n\u00E3o come\u00E7ou ainda.
viewer.no.stream=Atualmente, nenhuma transmiss\u00E3o ao vivo est\u00E1 sendo transmitida.
viewer.retry=Tente novamente
Paella Player
=============
Used in live stream course element to display multiple streams in one movie panel.
Version: 6.3.1
https://github.com/polimediaupv/paella
https://paellaplayer.upv.es/
{
"player":{
"accessControlClass":"paella.AccessControl",
"profileFrameStrategy": "paella.ProfileFrameStrategy",
"videoQualityStrategy": "paella.LimitedBestFitVideoQualityStrategy",
"videoQualityStrategyParams":{ "maxAutoQualityRes":720 },
"reloadOnFullscreen": true,
"videoZoom": {
"enabled":false,
"max":800
},
"deprecated-methods":[{"name":"streaming","enabled":true},
{"name":"html","enabled":true},
{"name":"flash","enabled":true},
{"name":"image","enabled":true}],
"methods":[
{ "factory":"ChromaVideoFactory", "enabled":true },
{ "factory":"WebmVideoFactory", "enabled":true },
{ "factory":"Html5VideoFactory", "enabled":true },
{ "factory":"MpegDashVideoFactory", "enabled":true },
{
"factory":"HLSVideoFactory",
"enabled":true,
"config": {
"*** You can add more hls.js settings here": "",
"https://github.com/video-dev/hls.js/blob/master/docs/API.md": "",
"maxBufferLength": 30,
"maxMaxBufferLength": 600,
"maxBufferSize": 60000000,
"maxBufferHole": 0.5,
"lowBufferWatchdogPeriod": 0.5,
"highBufferWatchdogPeriod": 3
},
"iOSMaxStreams": 2,
"androidMaxStreams": 2
},
{ "factory":"RTMPVideoFactory", "enabled":true },
{ "factory":"ImageVideoFactory", "enabled":true },
{ "factory":"YoutubeVideoFactory", "enabled":true },
{ "factory":"Video360ThetaFactory", "enabled":true },
{ "factory":"Video360Factory", "enabled":true }
],
"audioMethods":[
{ "factory":"MultiformatAudioFactory", "enabled":true }
],
"defaultAudioTag": "",
"slidesMarks":{
"enabled":true,
"color":"gray"
}
},
"defaultProfile":"presenter_presentation",
"data":{
"enabled":true,
"dataDelegates":{
"trimming":"CookieDataDelegate",
"metadata":"VideoManifestMetadataDataDelegate",
"cameraTrack":"TrackCameraDataDelegate"
}
},
"folders": {
"profiles": "config/profiles",
"resources": "resources",
"skins": "resources/style"
},
"experimental":{
"autoplay":true
},
"plugins":{
"enablePluginsByDefault": false,
"//**** Instructions: Disable any individual plugin by setting its enable property to false": {"enabled": false},
"//**** For a list of available plugins and configuration, go to": "https://github.com/polimediaupv/paella/blob/master/doc/plugins.md",
"list":{
"//******* Button plugins": "",
"edu.harvard.dce.paella.flexSkipPlugin": {"enabled":true, "direction": "Rewind", "seconds": 10, "minWindowSize": 510 },
"edu.harvard.dce.paella.flexSkipForwardPlugin": {"enabled":true, "direction": "Forward", "seconds": 30},
"es.upv.paella.captionsPlugin": {"enabled":true, "searchOnCaptions":true},
"es.upv.paella.frameControlPlugin": {"enabled": true, "showFullPreview": "auto", "showCaptions":true, "minWindowSize": 450 },
"es.upv.paella.fullScreenButtonPlugin": {"enabled":true, "reloadOnFullscreen":{ "enabled":true, "keepUserSelection":true }},
"es.upv.paella.multipleQualitiesPlugin": {"enabled":true, "showWidthRes":true, "minWindowSize": 550 },
"es.upv.paella.playPauseButtonPlugin": {"enabled":true},
"es.upv.paella.themeChooserPlugin": {"enabled":true, "minWindowSize": 600},
"es.upv.paella.viewModePlugin": { "enabled": true, "minWindowSize": 300 },
"es.upv.paella.volumeRangePlugin":{"enabled":true, "showMasterVolume": true, "showSlaveVolume": false },
"es.upv.paella.pipModePlugin": { "enabled":true },
"es.upv.paella.audioSelector": { "enabled":true, "minWindowSize": 400 },
"es.upv.paella.airPlayPlugin": { "enabled":true },
"//***** Video Overlay Button Plugins": "",
"es.upv.paella.liveStreamingIndicatorPlugin": { "enabled": true },
"es.upv.paella.showEditorPlugin":{"enabled":true,"alwaysVisible":true},
"es.upv.paella.arrowSlidesNavigatorPlugin": {"enabled": true, "content":["presentation","presenter"] },
"es.upv.paella.videoDataPlugin": {
"enabled": true,
"excludeLocations":[
"paellaplayer.upv.es"
],
"excludeParentLocations":[
"localhost:8000"
]
},
"//**** Event Driven Plugins": "",
"es.upv.paella.blackBoardPlugin": {"enabled": true},
"es.upv.paella.breaksPlayerPlugin": {"enabled": true},
"es.upv.paella.overlayCaptionsPlugin": {"enabled": true},
"es.upv.paella.playButtonOnScreenPlugin": {"enabled":true},
"es.upv.paella.translecture.captionsPlugin": {"enabled":true},
"es.upv.paella.trimmingPlayerPlugin": {"enabled":true},
"es.upv.paella.windowTitlePlugin": {"enabled": true},
"//**** Video profile plugins": "",
"es.upv.paella.singleStreamProfilePlugin": {
"enabled": true,
"videoSets": [
{ "icon":"professor_icon.svg", "id":"presenter", "content":["presenter"]},
{ "icon":"slide_icon.svg", "id":"presentation", "content":["presentation"]}
]
},
"es.upv.paella.dualStreamProfilePlugin": { "enabled":true,
"videoSets": [
{ "icon":"slide_professor_icon.svg", "id":"presenter_presentation", "content":["presenter","presentation"] },
{ "icon":"slide_professor_icon.svg", "id":"presenter2_presentation", "content":["presenter-2","presentation"] },
{ "icon":"slide_professor_icon.svg", "id":"presenter3_presentation", "content":["presenter-3","presentation"] }
]
},
"es.upv.paella.tripleStreamProfilePlugin": {
"enabled": true,
"videoSets": [
{ "icon":"three_streams_icon.svg", "id":"presenter_presentation_presenter2", "content":["presenter","presentation","presenter-2"] },
{ "icon":"three_streams_icon.svg", "id":"presenter_presentation_presenter3", "content":["presenter","presentation","presenter-3"] }
]
}
}
},
"standalone" : {
"repository": "../repository/"
},
"skin": {
"available": [
"dark",
"dark_small",
"light",
"light_small"
]
}
}
{
"player":{
"accessControlClass":"paella.AccessControl",
"profileFrameStrategy": "paella.ProfileFrameStrategy",
"videoQualityStrategy": "paella.LimitedBestFitVideoQualityStrategy",
"videoQualityStrategyParams":{ "maxAutoQualityRes":720 },
"reloadOnFullscreen": true,
"videoZoom": {
"enabled":true,
"max":800
},
"deprecated-methods":[{"name":"streaming","enabled":true},
{"name":"html","enabled":true},
{"name":"flash","enabled":true},
{"name":"image","enabled":true}],
"methods":[
{ "factory":"ChromaVideoFactory", "enabled":true },
{ "factory":"WebmVideoFactory", "enabled":true },
{ "factory":"Html5VideoFactory", "enabled":true },
{ "factory":"MpegDashVideoFactory", "enabled":true },
{
"factory":"HLSVideoFactory",
"enabled":true,
"config": {
"*** You can add more hls.js settings here": "",
"https://github.com/video-dev/hls.js/blob/master/docs/API.md": "",
"maxBufferLength": 30,
"maxMaxBufferLength": 600,
"maxBufferSize": 60000000,
"maxBufferHole": 0.5,
"lowBufferWatchdogPeriod": 0.5,
"highBufferWatchdogPeriod": 3
},
"iOSMaxStreams": 2,
"androidMaxStreams": 2
},
{ "factory":"RTMPVideoFactory", "enabled":true },
{ "factory":"ImageVideoFactory", "enabled":true },
{ "factory":"YoutubeVideoFactory", "enabled":true },
{ "factory":"Video360ThetaFactory", "enabled":true },
{ "factory":"Video360Factory", "enabled":true }
],
"audioMethods":[
{ "factory":"MultiformatAudioFactory", "enabled":true }
],
"defaultAudioTag": "",
"slidesMarks":{
"enabled":true,
"color":"gray"
}
},
"defaultProfile":"presenter_presentation",
"data":{
"enabled":true,
"dataDelegates":{
"trimming":"CookieDataDelegate",
"metadata":"VideoManifestMetadataDataDelegate",
"cameraTrack":"TrackCameraDataDelegate"
}
},
"folders": {
"profiles": "config/profiles",
"resources": "resources",
"skins": "resources/style"
},
"experimental":{
"autoplay":true
},
"plugins":{
"enablePluginsByDefault": false,
"//**** Instructions: Disable any individual plugin by setting its enable property to false": {"enabled": false},
"//**** For a list of available plugins and configuration, go to": "https://github.com/polimediaupv/paella/blob/master/doc/plugins.md",
"list":{
"//******* Button plugins": "",
"edu.harvard.dce.paella.flexSkipPlugin": {"enabled":true, "direction": "Rewind", "seconds": 10, "minWindowSize": 510 },
"edu.harvard.dce.paella.flexSkipForwardPlugin": {"enabled":true, "direction": "Forward", "seconds": 30},
"es.upv.paella.captionsPlugin": {"enabled":true, "searchOnCaptions":true},
"es.upv.paella.extendedTabAdapterPlugin": {"enabled":true, "minWindowSize": 400},
"es.upv.paella.footprintsPlugin": {"enabled":false},
"es.upv.paella.frameControlPlugin": {"enabled": true, "showFullPreview": "auto", "showCaptions":true, "minWindowSize": 450 },
"es.upv.paella.fullScreenButtonPlugin": {"enabled":true, "reloadOnFullscreen":{ "enabled":true, "keepUserSelection":true }},
"es.upv.paella.helpPlugin": {"enabled":true, "langs":["en","es"], "minWindowSize": 650 },
"es.upv.paella.multipleQualitiesPlugin": {"enabled":true, "showWidthRes":true, "minWindowSize": 550 },
"es.upv.paella.playbackRatePlugin": {"enabled":true, "availableRates": [0.75, 1, 1.25, 1.5], "minWindowSize": 500 },
"es.upv.paella.playPauseButtonPlugin": {"enabled":true},
"es.upv.paella.searchPlugin": {"enabled":true, "sortType":"time", "colorSearch":false, "minWindowSize": 550},
"es.upv.paella.socialPlugin": {"enabled":true, "minWindowSize": 600},
"es.upv.paella.themeChooserPlugin": {"enabled":true, "minWindowSize": 600},
"es.upv.paella.viewModePlugin": { "enabled": true, "minWindowSize": 300 },
"es.upv.paella.volumeRangePlugin":{"enabled":true, "showMasterVolume": true, "showSlaveVolume": false },
"es.upv.paella.pipModePlugin": { "enabled":true },
"es.upv.paella.ratePlugin": { "enabled":true, "minWindowSize": 500 },
"es.upv.paella.videoZoomPlugin": { "enabled":true },
"es.upv.paella.audioSelector": { "enabled":true, "minWindowSize": 400 },
"es.upv.paella.videoZoomToolbarPlugin": { "enabled":false, "targetStreamIndex":0, "minWindowSize": 500 },
"es.upv.paella.videoZoomTrack4kPlugin": { "enabled":true, "targetStreamIndex":0, "autoModeByDefault":false, "minWindowSize": 500 },
"es.upv.paella.airPlayPlugin": { "enabled":true },
"//***** Video Overlay Button Plugins": "",
"es.upv.paella.liveStreamingIndicatorPlugin": { "enabled": true },
"es.upv.paella.showEditorPlugin":{"enabled":true,"alwaysVisible":true},
"es.upv.paella.arrowSlidesNavigatorPlugin": {"enabled": true, "content":["presentation","presenter"] },
"es.upv.paella.videoDataPlugin": {
"enabled": true,
"excludeLocations":[
"paellaplayer.upv.es"
],
"excludeParentLocations":[
"localhost:8000"
]
},
"es.upv.paella.legalPlugin": {
"enabled": true,
"label": "Legal info",
"position": "right",
"legalUrl": "https://en.wikipedia.org/wiki/General_Data_Protection_Regulation"
},
"//***** TabBar Plugins": "",
"es.upv.paella.commentsPlugin": {"enabled": false},
"es.upv.paella.test.tabBarExamplePlugin": {"enabled": false},
"//**** Event Driven Plugins": "",
"es.upv.paella.blackBoardPlugin": {"enabled": true},
"es.upv.paella.breaksPlayerPlugin": {"enabled": true},
"es.upv.paella.overlayCaptionsPlugin": {"enabled": true},
"es.upv.paella.playButtonOnScreenPlugin": {"enabled":true},
"es.upv.paella.translecture.captionsPlugin": {"enabled":true},
"es.upv.paella.trimmingPlayerPlugin": {"enabled":true},
"es.upv.paella.windowTitlePlugin": {"enabled": true},
"es.upv.paella.track4kPlugin": { "enabled":false },
"es.upv.paella.relatedVideosPlugin": { "enabled":true },
"//**** Video profile plugins": "",
"es.upv.paella.singleStreamProfilePlugin": {
"enabled": true,
"videoSets": [
{ "icon":"professor_icon.svg", "id":"presenter", "content":["presenter"]},
{ "icon":"slide_icon.svg", "id":"presentation", "content":["presentation"]}
]
},
"es.upv.paella.dualStreamProfilePlugin": { "enabled":true,
"videoSets": [
{ "icon":"slide_professor_icon.svg", "id":"presenter_presentation", "content":["presenter","presentation"] },
{ "icon":"slide_professor_icon.svg", "id":"presenter2_presentation", "content":["presenter-2","presentation"] },
{ "icon":"slide_professor_icon.svg", "id":"presenter3_presentation", "content":["presenter-3","presentation"] }
]
},
"es.upv.paella.tripleStreamProfilePlugin": {
"enabled": true,
"videoSets": [
{ "icon":"three_streams_icon.svg", "id":"presenter_presentation_presenter2", "content":["presenter","presentation","presenter-2"] },
{ "icon":"three_streams_icon.svg", "id":"presenter_presentation_presenter3", "content":["presenter","presentation","presenter-3"] }
]
},
"//**** Captions Parser Plugins": "",
"es.upv.paella.captions.DFXPParserPlugin": {"enabled":true},
"es.teltek.paella.captions.WebVTTParserPlugin": {"enabled":true},
"//**** Search Service Plugins": "",
"es.upv.paella.search.captionsSearchPlugin": {"enabled":true},
"es.upv.paella.frameCaptionsSearchPlugin": {"enabled":true},
"//**** User Tracking Saver Plugins": "",
"es.upv.paella.usertracking.elasticsearchSaverPlugin": { "enabled": false, "url": "http://my.elastic.server"},
"es.upv.paella.usertracking.GoogleAnalyticsSaverPlugin": { "enabled": false, "trackingID": "UA-XXXXXXXX-Y" },
"es.upv.paella.usertracking.piwikSaverPlugIn": { "enabled": false, "tracker":"http://localhost/piwik/", "siteId": "1" },
"org.opencast.usertracking.MatomoSaverPlugIn": {
"enabled": false,
"server": "http://localhost/piwik/",
"site_id": 1,
"heartbeat": 30,
"client_id": "Paella Player"
},
"org.opencast.usertracking.x5gonSaverPlugIn": {
"enabled": false,
"token": "X5GON_TOKEN",
"testing_environment" : false
},
"es.teltek.paella.usertracking.xAPISaverPlugin": {"enabled": false, "endpoint":"http://localhost:8081/data/xAPI/", "auth":"auth_key"},
"//***** Keyboard plugins": "",
"es.upv.paella.defaultKeysPlugin": {"enabled": true }
}
},
"standalone" : {
"repository": "../repository/"
},
"skin": {
"available": [
"dark",
"dark_small",
"light",
"light_small"
]
}
}
{
"s_p_blackboard2":{
"name":{"es":"Pizarra"},
"hidden":false,
"icon":"slide_professor_icon.png",
"slaveVideo":{"content":"presenter","rect":[
{"aspectRatio":"16/9","left":"10","top":"70","width":"432","height":"243"}],"visible":"true","layer":"1"},
"masterVideo":{"content":"presentation","rect":[
{"aspectRatio":"16/9","left":"450","top":"135","width":"816","height":"459"}],"visible":"true","layer":"1"},
"blackBoardImages":{"left":"10","top":"325","width":"432","height":"324"},
"background":{"content":"slide_professor_paella.jpg","zIndex":5,"rect":{"left":"0","top":"0","width":"1280","height":"720"},"visible":"true","layer":"0"},
"logos":[{"content":"paella_logo.png","zIndex":5,"rect":{"top":"10","left":"10","width":"49","height":"42"}}]
},
"slide_professor":{
"name":{"es":"Presentación y presentador"},
"hidden":false,
"icon":"slide_professor_icon.png",
"masterVideo":{"content":"presenter","rect":[
{"aspectRatio":"16/9","left":"712","top":"302","width":"560","height":"315"},
{"aspectRatio":"16/10","left":"712","top":"267","width":"560","height":"350"},
{"aspectRatio":"4/3","left":"712","top":"198","width":"560","height":"420"},
{"aspectRatio":"5/3","left":"712","top":"281","width":"560","height":"336"},
{"aspectRatio":"5/4","left":"712","top":"169","width":"560","height":"448"}],"visible":"true","layer":"1"},
"slaveVideo":{"content":"presentation","rect":[
{"aspectRatio":"16/9","left":"10","top":"225","width":"695","height":"390"},
{"aspectRatio":"16/10","left":"10","top":"183","width":"695","height":"434"},
{"aspectRatio":"4/3","left":"10","top":"96","width":"695","height":"521"},
{"aspectRatio":"5/3","left":"10","top":"200","width":"695","height":"417"},
{"aspectRatio":"5/4","left":"10","top":"62","width":"695","height":"556"}],"visible":"true","layer":"1"},
"background":{"content":"slide_professor_paella.jpg","zIndex":5,"rect":{"left":"0","top":"0","width":"1280","height":"720"},"visible":"true","layer":"0"},
"logos":[{"content":"paella_logo.png","zIndex":5,"rect":{"top":"10","left":"10","width":"49","height":"42"}}]
},
"professor_slide":{
"name":{"es":"Presentador y presentación"},
"hidden":false,
"icon":"professor_slide_icon.png",
"masterVideo":{"content":"presenter","rect":[
{"aspectRatio":"16/9","left":"10","top":"225","width":"695","height":"390"},
{"aspectRatio":"16/10","left":"10","top":"183","width":"695","height":"434"},
{"aspectRatio":"4/3","left":"10","top":"96","width":"695","height":"521"},
{"aspectRatio":"5/3","left":"10","top":"200","width":"695","height":"417"},
{"aspectRatio":"5/4","left":"10","top":"62","width":"695","height":"556"}],"visible":"true","layer":"1"},
"slaveVideo":{"content":"presentation","rect":[
{"aspectRatio":"16/9","left":"712","top":"302","width":"560","height":"315"},
{"aspectRatio":"16/10","left":"712","top":"267","width":"560","height":"350"},
{"aspectRatio":"4/3","left":"712","top":"198","width":"560","height":"420"},
{"aspectRatio":"5/3","left":"712","top":"281","width":"560","height":"336"},
{"aspectRatio":"5/4","left":"712","top":"169","width":"560","height":"448"}],"visible":"true","layer":"1"},
"background":{"content":"slide_professor_paella.jpg","zIndex":5,"rect":{"left":"0","top":"0","width":"1280","height":"720"},"visible":"true","layer":"0"},
"logos":[{"content":"paella_logo.png","zIndex":5,"rect":{"top":"10","left":"10","width":"49","height":"42"}}]
},
"professor":{
"name":{"es":"Solo profesor"},
"hidden":false,
"icon":"professor_icon.png",
"masterVideo":{"content":"presenter","rect":[
{"aspectRatio":"16/9","left":"0","top":"0","width":"1280","height":"720"},
{"aspectRatio":"16/10","left":"64","top":"0","width":"1152","height":"720"},
{"aspectRatio":"5/3","left":"40","top":"0","width":"1200","height":"720"},
{"aspectRatio":"5/4","left":"190","top":"0","width":"900","height":"720"},
{"aspectRatio":"4/3","left":"160","top":"0","width":"960","height":"720"}],"visible":"true","layer":"1"},
"slaveVideo":{"content":"presentation","rect":[
{"aspectRatio":"4/3","left":"0","top":"0","width":"300","height":"300"}],"visible":"false","layer":"1"},
"background":{"content":"default_background_paella.jpg","zIndex":5,"rect":{"left":"0","top":"0","width":"1280","height":"720"},"visible":"true","layer":"0"},
"logos":[{"content":"paella_logo.png","zIndex":5,"rect":{"top":"10","left":"10","width":"49","height":"42"}}],
"isMonostream":true
},
"slide":{
"name":{"es":"Solo presentación"},
"hidden":false,
"icon":"slide_icon.png",
"masterVideo":{"content":"presenter","rect":[
{"aspectRatio":"16/9","left":"0","top":"0","width":"320","height":"190"}],"visible":"false","layer":"1"},
"slaveVideo":{"content":"presentation","rect":[
{"aspectRatio":"16/9","left":"0","top":"0","width":"1280","height":"720"},
{"aspectRatio":"16/10","left":"64","top":"0","width":"1152","height":"720"},
{"aspectRatio":"5/3","left":"40","top":"0","width":"1200","height":"720"},
{"aspectRatio":"5/4","left":"190","top":"0","width":"900","height":"720"},
{"aspectRatio":"4/3","left":"160","top":"0","width":"960","height":"720"}],"visible":"true","layer":"1"},
"background":{"content":"default_background_paella.jpg","zIndex":5,"rect":{"left":"0","top":"0","width":"1280","height":"720"},"visible":"true","layer":"0"},
"logos":[{"content":"paella_logo.png","zIndex":5,"rect":{"top":"10","left":"10","width":"49","height":"42"}}],
"isMonostream":true
},
"slide_over_professor":{
"name":{"es":"Presentación sobre profesor"},
"hidden":false,
"icon":"slide_over_professor_icon.png",
"masterVideo":{"content":"presenter","rect":[
{"aspectRatio":"16/9","left":"0","top":"0","width":"1280","height":"720"},
{"aspectRatio":"16/10","left":"64","top":"0","width":"1152","height":"720"},
{"aspectRatio":"5/3","left":"40","top":"0","width":"1200","height":"720"},
{"aspectRatio":"5/4","left":"190","top":"0","width":"900","height":"720"},
{"aspectRatio":"4/3","left":"160","top":"0","width":"960","height":"720"}],"visible":"true","layer":"1"},
"slaveVideo":{"content":"presentation","rect":[
{"aspectRatio":"16/9","left":"50","top":"470","width":"350","height":"197"},
{"aspectRatio":"16/10","left":"50","top":"448","width":"350","height":"219"},
{"aspectRatio":"5/3","left":"50","top":"457","width":"350","height":"210"},
{"aspectRatio":"5/4","left":"50","top":"387","width":"350","height":"280"},
{"aspectRatio":"4/3","left":"50","top":"404","width":"350","height":"262"}],"visible":"true","layer":"1"},
"background":{"content":"default_background_paella.jpg","zIndex":5,"rect":{"left":"0","top":"0","width":"1280","height":"720"},"visible":"true","layer":"0"},
"logos":[{"content":"paella_logo.png","zIndex":5,"rect":{"top":"10","left":"10","width":"49","height":"42"}}]
},
"slide_over_professor_right":{
"name":{"es":"Presentación a la derecha, sobre profesor"},
"hidden":false,
"icon":"slide_over_professor_right_icon.png",
"masterVideo":{"content":"presenter","rect":[
{"aspectRatio":"16/9","left":"0","top":"0","width":"1280","height":"720"},
{"aspectRatio":"16/10","left":"64","top":"0","width":"1152","height":"720"},
{"aspectRatio":"5/3","left":"40","top":"0","width":"1200","height":"720"},
{"aspectRatio":"5/4","left":"190","top":"0","width":"900","height":"720"},
{"aspectRatio":"4/3","left":"160","top":"0","width":"960","height":"720"}],"visible":"true","layer":"1"},
"slaveVideo":{"content":"presentation","rect":[
{"aspectRatio":"16/9","left":"910","top":"470","width":"350","height":"197"},
{"aspectRatio":"16/10","left":"910","top":"448","width":"350","height":"219"},
{"aspectRatio":"5/3","left":"910","top":"457","width":"350","height":"210"},
{"aspectRatio":"5/4","left":"910","top":"387","width":"350","height":"280"},
{"aspectRatio":"4/3","left":"910","top":"404","width":"350","height":"262"}],"visible":"true","layer":"1"},
"background":{"content":"default_background_paella.jpg","zIndex":5,"rect":{"left":"0","top":"0","width":"1280","height":"720"},"visible":"true","layer":"0"},
"logos":[{"content":"paella_logo.png","zIndex":5,"rect":{"top":"10","left":"10","width":"49","height":"42"}}]
},
"professor_over_slide":{
"name":{"es":"Profesor sobre presentación"},
"hidden":false,
"icon":"slide_over_professor_icon.png",
"masterVideo":{"content":"presentation","rect":[
{"aspectRatio":"16/9","left":"50","top":"470","width":"350","height":"197"},
{"aspectRatio":"16/10","left":"50","top":"448","width":"350","height":"219"},
{"aspectRatio":"5/3","left":"50","top":"457","width":"350","height":"210"},
{"aspectRatio":"5/4","left":"50","top":"387","width":"350","height":"280"},
{"aspectRatio":"4/3","left":"50","top":"404","width":"350","height":"262"}],"visible":"true","layer":"2"},
"slaveVideo":{"content":"presenter","rect":[
{"aspectRatio":"16/9","left":"0","top":"0","width":"1280","height":"720"},
{"aspectRatio":"16/10","left":"64","top":"0","width":"1152","height":"720"},
{"aspectRatio":"5/3","left":"40","top":"0","width":"1200","height":"720"},
{"aspectRatio":"5/4","left":"190","top":"0","width":"900","height":"720"},
{"aspectRatio":"4/3","left":"160","top":"0","width":"960","height":"720"}],"visible":"true","layer":"1"},
"background":{"content":"default_background_paella.jpg","zIndex":5,"rect":{"left":"0","top":"0","width":"1280","height":"720"},"visible":"true","layer":"0"},
"logos":[{"content":"paella_logo.png","zIndex":5,"rect":{"top":"10","left":"10","width":"49","height":"42"}}]
},
"professor_over_slide_right":{
"name":{"es":"Profesor a la derecha, sobre presentación"},
"hidden":false,
"icon":"slide_over_professor_right_icon.png",
"masterVideo":{"content":"presentation","rect":[
{"aspectRatio":"16/9","left":"910","top":"470","width":"350","height":"197"},
{"aspectRatio":"16/10","left":"910","top":"448","width":"350","height":"219"},
{"aspectRatio":"5/3","left":"910","top":"457","width":"350","height":"210"},
{"aspectRatio":"5/4","left":"910","top":"387","width":"350","height":"280"},
{"aspectRatio":"4/3","left":"910","top":"404","width":"350","height":"262"}],"visible":"true","layer":"2"},
"slaveVideo":{"content":"presenter","rect":[
{"aspectRatio":"16/9","left":"0","top":"0","width":"1280","height":"720"},
{"aspectRatio":"16/10","left":"64","top":"0","width":"1152","height":"720"},
{"aspectRatio":"5/3","left":"40","top":"0","width":"1200","height":"720"},
{"aspectRatio":"5/4","left":"190","top":"0","width":"900","height":"720"},
{"aspectRatio":"4/3","left":"160","top":"0","width":"960","height":"720"}],"visible":"true","layer":"1"},
"background":{"content":"default_background_paella.jpg","zIndex":5,"rect":{"left":"0","top":"0","width":"1280","height":"720"},"visible":"true","layer":"0"},
"logos":[{"content":"paella_logo.png","zIndex":5,"rect":{"top":"10","left":"10","width":"49","height":"42"}}]
},
"blank_professor":{
"name":{"es":"Nada y presentador"},
"hidden":true,
"icon":"slide_professor_icon.png",
"masterVideo":{"content":"presenter","rect":[
{"aspectRatio":"16/9","left":"712","top":"302","width":"560","height":"315"},
{"aspectRatio":"16/10","left":"712","top":"267","width":"560","height":"350"},
{"aspectRatio":"4/3","left":"712","top":"198","width":"560","height":"420"},
{"aspectRatio":"5/3","left":"712","top":"281","width":"560","height":"336"},
{"aspectRatio":"5/4","left":"712","top":"169","width":"560","height":"448"}],"visible":"true","layer":"1"},
"slaveVideo":{"content":"presentation","rect":[
{"aspectRatio":"4/3","left":"0","top":"0","width":"300","height":"300"}],"visible":"false","layer":"1"},
"background":{"content":"slide_professor_paella.jpg","zIndex":5,"rect":{"left":"0","top":"0","width":"1280","height":"720"},"visible":"false","layer":"0"},
"logos":[{"content":"paella_logo.png","zIndex":5,"rect":{"top":"10","left":"10","width":"49","height":"42"}}],
"isMonostream":true
},
"chroma":{
"name":{"es":"Polimedia"},
"hidden":false,
"icon":"slide_icon.png",
"masterVideo":{"content":"presenter","rect":[
{"aspectRatio":"16/9","left":"0","top":"0","width":"1280","height":"720"},
{"aspectRatio":"16/10","left":"64","top":"0","width":"1152","height":"720"},
{"aspectRatio":"5/3","left":"40","top":"0","width":"1200","height":"720"},
{"aspectRatio":"5/4","left":"190","top":"0","width":"900","height":"720"},
{"aspectRatio":"4/3","left":"160","top":"0","width":"960","height":"720"}],"visible":"true","layer":"1"},
"slaveVideo":{"content":"presentation","rect":[
{"aspectRatio":"16/9","left":"0","top":"0","width":"1280","height":"720"},
{"aspectRatio":"16/10","left":"64","top":"0","width":"1152","height":"720"},
{"aspectRatio":"5/3","left":"40","top":"0","width":"1200","height":"720"},
{"aspectRatio":"5/4","left":"190","top":"0","width":"900","height":"720"},
{"aspectRatio":"4/3","left":"160","top":"0","width":"960","height":"720"}],"visible":"true","layer":"0"},
"background":{"content":"default_background_paella.jpg","zIndex":5,"rect":{"left":"0","top":"0","width":"1280","height":"720"},"visible":"true","layer":"0"},
"logos":[{"content":"paella_logo.png","zIndex":5,"rect":{"top":"10","left":"10","width":"49","height":"42"}}]
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment