Merge branch 'master' into upgrading-red5-r4406
This commit is contained in:
commit
046e4aa9d8
@ -481,7 +481,7 @@ public String getRecordings(String meetingID) {
|
||||
if (j != 0){
|
||||
playback +=", ";
|
||||
}
|
||||
playback += StringEscapeUtils.escapeXml("<a href='" + urlP + "'>" + typeP + "</a>");
|
||||
playback += StringEscapeUtils.escapeXml("<a href='" + urlP + "' target='_blank'>" + typeP + "</a>");
|
||||
|
||||
if(typeP.equalsIgnoreCase("slides")){
|
||||
length = lengthP;
|
||||
|
@ -66,10 +66,6 @@ public class BigBlueButtonSession {
|
||||
return internalUserID;
|
||||
}
|
||||
|
||||
public long getClientID() {
|
||||
return clientID;
|
||||
}
|
||||
|
||||
public String getSessionName() {
|
||||
return sessionName;
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ public class ParticipantsHandler extends ApplicationAdapter implements IApplicat
|
||||
if (bbbSession == null) {
|
||||
log.debug("roomLeave - session is null");
|
||||
} else {
|
||||
participantsApplication.participantLeft(bbbSession.getSessionName(), new Long(bbbSession.getClientID()));
|
||||
participantsApplication.participantLeft(bbbSession.getSessionName(), new Long(bbbSession.getInternalUserID()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,7 @@ package org.bigbluebutton.conference.service.whiteboard;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map;
|
||||
import org.bigbluebutton.conference.BigBlueButtonSession;
|
||||
import org.bigbluebutton.conference.ClientMessage;
|
||||
import org.bigbluebutton.conference.ConnectionInvokerService;
|
||||
@ -116,7 +116,7 @@ public class WhiteboardApplication extends MultiThreadedApplicationAdapter imple
|
||||
public void sendAnnotation(Annotation annotation) {
|
||||
String status = annotation.getStatus();
|
||||
|
||||
if("textCreated".equals(status) || "DRAW_START".equals(status)) {
|
||||
if("textCreated".equals(status) || "DRAW_START".equals(status) || "DRAW_UPDATE".equals(status) || "DRAW_END".equals(status) ) {
|
||||
roomManager.getRoom(getMeetingId()).addAnnotation(annotation);
|
||||
} else {
|
||||
if ("text".equals(annotation.getType())) {
|
||||
@ -145,7 +145,7 @@ public class WhiteboardApplication extends MultiThreadedApplicationAdapter imple
|
||||
Map<String, Object> message = new HashMap<String, Object>();
|
||||
ClientMessage m = new ClientMessage(ClientMessage.BROADCAST, getMeetingId(), "WhiteboardClearCommand", message);
|
||||
connInvokerService.sendMessage(m);
|
||||
}
|
||||
}
|
||||
|
||||
public void undo() {
|
||||
roomManager.getRoom(getMeetingId()).undo();
|
||||
|
@ -19,6 +19,7 @@ server {
|
||||
proxy_read_timeout 90;
|
||||
|
||||
proxy_buffering off;
|
||||
keepalive_requests 1000000000;
|
||||
}
|
||||
|
||||
# Handle desktop sharing tunneling. Forwards
|
||||
|
@ -70,7 +70,7 @@
|
||||
convolutionFilter="-1, 0, -1, 0, 6, 0, -1, 0, -1"
|
||||
filterBias="0"
|
||||
filterDivisor="4"
|
||||
enableH264 = "true"
|
||||
enableH264 = "false"
|
||||
h264Level = "2.1"
|
||||
h264Profile = "main"
|
||||
/>
|
||||
|
@ -41,4 +41,26 @@
|
||||
</div>
|
||||
<div id="notifications" aria-live="polite" role="region" aria-label="Chat Notifications"></div>
|
||||
</body>
|
||||
<script type="text/javascript">
|
||||
// Work around pixel alignment bug with Chrome 21 on Mac.
|
||||
// See: http://code.google.com/p/bigbluebutton/issues/detail?id=1294
|
||||
var objs = $('object');
|
||||
objs.each(function(i, o) {
|
||||
var o = $(o);
|
||||
var top = o.offset().top;
|
||||
var left = o.offset().left;
|
||||
var roundtop = Math.round(top);
|
||||
var roundleft = Math.round(left);
|
||||
o.css("position", "relative");
|
||||
if (roundtop === top) {
|
||||
} else {
|
||||
o.css("top", roundtop - top);
|
||||
}
|
||||
if (roundleft === left) {
|
||||
} else {
|
||||
o.css("left", roundleft - left);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
</html>
|
||||
|
@ -19,24 +19,25 @@
|
||||
|
||||
package org.bigbluebutton.modules.videoconf.business
|
||||
{
|
||||
import flash.events.MouseEvent;
|
||||
import flash.geom.Point;
|
||||
import flash.media.Video;
|
||||
|
||||
import flexlib.mdi.containers.MDIWindow;
|
||||
import flexlib.mdi.events.MDIWindowEvent;
|
||||
|
||||
import org.bigbluebutton.common.LogUtil;
|
||||
import org.bigbluebutton.common.Images;
|
||||
import mx.controls.Button;
|
||||
import mx.core.UIComponent;
|
||||
|
||||
import org.bigbluebutton.common.IBbbModuleWindow;
|
||||
import org.bigbluebutton.common.events.DragWindowEvent;
|
||||
import org.bigbluebutton.common.Images;
|
||||
import org.bigbluebutton.common.LogUtil;
|
||||
import org.bigbluebutton.common.events.CloseWindowEvent;
|
||||
import org.bigbluebutton.common.events.DragWindowEvent;
|
||||
import org.bigbluebutton.core.managers.UserManager;
|
||||
import org.bigbluebutton.main.views.MainCanvas;
|
||||
import org.bigbluebutton.util.i18n.ResourceUtil;
|
||||
|
||||
import mx.core.UIComponent;
|
||||
import mx.controls.Button;
|
||||
|
||||
import flash.events.MouseEvent;
|
||||
import flash.media.Video;
|
||||
import flash.geom.Point;
|
||||
|
||||
public class VideoWindowItf extends MDIWindow implements IBbbModuleWindow
|
||||
{
|
||||
protected var _video:Video;
|
||||
@ -56,16 +57,19 @@ package org.bigbluebutton.modules.videoconf.business
|
||||
protected var mousePositionOnDragStart:Point;
|
||||
|
||||
public var streamName:String;
|
||||
public var userId:int;
|
||||
|
||||
[Bindable] public var resolutions:Array;
|
||||
|
||||
protected function getVideoResolution(stream:String):Array {
|
||||
// streamname: <width>x<height><userId>-<timestamp>
|
||||
// example: 320x2405-1329334829687
|
||||
var pattern:RegExp = new RegExp("\\d+x\\d+-\\d+", "");
|
||||
var pattern:RegExp = new RegExp("(\\d+x\\d+)-\\d+-\\d+", "");
|
||||
if (pattern.test(stream)) {
|
||||
LogUtil.debug("The stream name is well formatted");
|
||||
return stream.substr(0, stream.split("-")[0].length - String(this.userId).length).split("x");
|
||||
LogUtil.debug("The stream name is well formatted [" + stream + "]");
|
||||
var uid:Number = UserManager.getInstance().getConference().getMyUserId();
|
||||
//return stream.substr(0, stream.split("-")[0].length - String(uid).length).split("x");
|
||||
LogUtil.debug("Stream resolution is [" + pattern.exec(stream)[1] + "]");
|
||||
return pattern.exec(stream)[1].split("x");
|
||||
} else {
|
||||
LogUtil.error("The stream name doesn't follow the pattern <width>x<height><userId>-<timestamp>. However, the video resolution will be set to the lowest defined resolution in the config.xml: " + resolutions[0]);
|
||||
return resolutions[0].split("x");
|
||||
|
@ -59,7 +59,7 @@
|
||||
if (userid == module.userid) return;
|
||||
|
||||
var window:VideoWindow = new VideoWindow();
|
||||
window.userId = userid;
|
||||
// window.userId = userid;
|
||||
window.videoOptions = proxy.videoOptions;
|
||||
|
||||
window.resolutions = module.resolutions.split(",");
|
||||
@ -102,7 +102,6 @@
|
||||
private function openPublishWindow():void{
|
||||
publishWindow = new PublishWindow();
|
||||
publishWindow.videoOptions = proxy.videoOptions;
|
||||
publishWindow.userId = module.userid;
|
||||
publishWindow.userrole = module.role;
|
||||
publishWindow.quality = module.quality;
|
||||
publishWindow.resolutions = module.resolutions.split(",");
|
||||
|
@ -34,23 +34,23 @@
|
||||
|
||||
<mx:Script>
|
||||
<![CDATA[
|
||||
import org.bigbluebutton.modules.videoconf.model.VideoConfOptions;
|
||||
import org.bigbluebutton.common.LogUtil;
|
||||
import org.bigbluebutton.common.events.CloseWindowEvent;
|
||||
import flexlib.mdi.events.MDIWindowEvent;
|
||||
|
||||
import mx.core.UIComponent;
|
||||
import mx.events.ResizeEvent;
|
||||
|
||||
import org.bigbluebutton.common.Images;
|
||||
import org.bigbluebutton.common.LogUtil;
|
||||
import org.bigbluebutton.common.events.LocaleChangeEvent;
|
||||
import org.bigbluebutton.main.views.MainCanvas;
|
||||
import org.bigbluebutton.modules.videoconf.events.OpenVideoWindowEvent;
|
||||
import org.bigbluebutton.modules.videoconf.events.CloseAllWindowsEvent;
|
||||
import org.bigbluebutton.modules.videoconf.events.StartBroadcastEvent;
|
||||
import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent;
|
||||
import org.bigbluebutton.util.i18n.ResourceUtil;
|
||||
import flexlib.mdi.events.MDIWindowEvent;
|
||||
|
||||
import mx.core.UIComponent;
|
||||
import mx.events.ResizeEvent;
|
||||
|
||||
import org.bigbluebutton.common.Images;
|
||||
import org.bigbluebutton.common.LogUtil;
|
||||
import org.bigbluebutton.common.events.CloseWindowEvent;
|
||||
import org.bigbluebutton.common.events.LocaleChangeEvent;
|
||||
import org.bigbluebutton.core.managers.UserManager;
|
||||
import org.bigbluebutton.main.views.MainCanvas;
|
||||
import org.bigbluebutton.modules.videoconf.events.CloseAllWindowsEvent;
|
||||
import org.bigbluebutton.modules.videoconf.events.OpenVideoWindowEvent;
|
||||
import org.bigbluebutton.modules.videoconf.events.StartBroadcastEvent;
|
||||
import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent;
|
||||
import org.bigbluebutton.modules.videoconf.model.VideoConfOptions;
|
||||
import org.bigbluebutton.util.i18n.ResourceUtil;
|
||||
|
||||
[Bindable] public var camIcon:Class = images.control_play;
|
||||
[Bindable] public var bbbLogo:Class = images.bbb_logo;
|
||||
@ -307,8 +307,9 @@
|
||||
* Add timestamp to create a unique stream name. This way we can record
|
||||
* stream without overwriting previously recorded streams.
|
||||
*/
|
||||
var curTime:Number = new Date().getTime();
|
||||
this.streamName = cmbResolution.selectedLabel.concat(this.userId) + "-" + curTime;
|
||||
var curTime:Number = new Date().getTime();
|
||||
var uid:Number = UserManager.getInstance().getConference().getMyUserId();
|
||||
this.streamName = cmbResolution.selectedLabel.concat("-" + uid) + "-" + curTime;
|
||||
}
|
||||
|
||||
public function set userrole(role:String):void{
|
||||
|
@ -520,7 +520,7 @@ package org.bigbluebutton.modules.whiteboard
|
||||
wbCanvas.dispatchEvent(e);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// LogUtil.debug("SENDING TEXT: [" + tobj.textSize + "]");
|
||||
|
||||
var annotation:Object = new Object();
|
||||
@ -533,6 +533,7 @@ package org.bigbluebutton.modules.whiteboard
|
||||
annotation["background"] = tobj.background;
|
||||
annotation["x"] = tobj.getOrigX();
|
||||
annotation["y"] = tobj.getOrigY();
|
||||
annotation["dataPoints"] = tobj.getOrigX() + "," +tobj.getOrigY();
|
||||
annotation["fontSize"] = tobj.textSize;
|
||||
annotation["calcedFontSize"] = GraphicFactory.normalize(tobj.textSize, shapeFactory.parentHeight);
|
||||
annotation["textBoxWidth"] = tobj.textBoxWidth;
|
||||
@ -560,7 +561,7 @@ package org.bigbluebutton.modules.whiteboard
|
||||
public function isPageEmpty():Boolean {
|
||||
return _annotationsList.length == 0;
|
||||
}
|
||||
|
||||
|
||||
/** Helper method to test whether this user is the presenter */
|
||||
private function get isPresenter():Boolean {
|
||||
return UserManager.getInstance().getConference().amIPresenter();
|
||||
|
@ -28,7 +28,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
|
||||
_fontSize = fontSize;
|
||||
_calcedFontSize = calcedFontSize;
|
||||
}
|
||||
|
||||
|
||||
override public function createAnnotation(wbModel:WhiteboardModel, ctrlKeyPressed:Boolean=false):Annotation {
|
||||
var ao:Object = new Object();
|
||||
ao["type"] = DrawObject.TEXT;
|
||||
@ -38,10 +38,11 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
|
||||
ao["fontColor"] = _fontColor;
|
||||
ao["x"] = _x;
|
||||
ao["y"] = _y;
|
||||
ao["dataPoints"] = _x + "," + _y;
|
||||
ao["fontSize"] = _fontSize;
|
||||
ao["calcedFontSize"] = _calcedFontSize;
|
||||
ao["textBoxWidth"] = _textBoxWidth;
|
||||
ao["textBoxHeight"] = _textBoxHeight;
|
||||
ao["textBoxHeight"] = _textBoxHeight;
|
||||
|
||||
var pn:Object = wbModel.getCurrentPresentationAndPage();
|
||||
if (pn != null) {
|
||||
|
@ -1802,7 +1802,11 @@ if [ -n "$HOST" ]; then
|
||||
echo "Assigning $HOST for record and playback in /usr/local/bigbluebutton/core/scripts/slides.yml"
|
||||
change_yml_value /usr/local/bigbluebutton/core/scripts/slides.yml $redis_host playback_host $HOST
|
||||
fi
|
||||
|
||||
|
||||
if [ -f /usr/local/bigbluebutton/core/scripts/presentation.yml ]; then
|
||||
echo "Assigning $HOST for record and playback in /usr/local/bigbluebutton/core/scripts/presentation.yml"
|
||||
change_yml_value /usr/local/bigbluebutton/core/scripts/presentation.yml $redis_host playback_host $HOST
|
||||
fi
|
||||
|
||||
echo "Restarting the bigbluebutton server ..."
|
||||
stop_bigbluebutton
|
||||
|
@ -336,8 +336,8 @@ if [ $LIST ]; then
|
||||
# A -- Archiving
|
||||
#
|
||||
|
||||
echo "MeetingID Time APVD APVDE RA Slides Processed Published Description"
|
||||
echo "------------------------------------------------------ ---------------------------- ---- ----- -- ------ -------------------- -------------------- -----------------------------"
|
||||
echo "MeetingID Time APVD APVDE RAS Slides Processed Published Description"
|
||||
echo "------------------------------------------------------ ---------------------------- ---- ----- --- ------ -------------------- -------------------- -----------------------------"
|
||||
|
||||
if [ -z $HEAD ]; then
|
||||
# If we're not called with --list20, show all recordings
|
||||
@ -430,7 +430,7 @@ for meeting in $(ls -t /var/bigbluebutton | grep "[0-9]\{13\}$" | head -n $HEAD)
|
||||
#
|
||||
echo -n " "
|
||||
STATUS_DIR=$RAW_PRESENTATION_SRC/recording/status
|
||||
DIRS="recorded archived"
|
||||
DIRS="recorded archived sanity"
|
||||
for dir in $DIRS; do
|
||||
if [ -f $STATUS_DIR/$dir/$meeting.done ]; then
|
||||
echo -n "X"
|
||||
|
@ -1,3 +1,22 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
source "http://rubygems.org"
|
||||
|
||||
gem "rspec", "2.0.0", :require => "spec"
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'fileutils'
|
||||
|
||||
Given /^the meeting has ended$/ do
|
||||
|
@ -1,3 +1,20 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
require 'fileutils'
|
||||
|
||||
Given /^a set of audio recordings in the archive$/ do
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'fileutils'
|
||||
|
||||
Given /^recordings in the archive$/ do
|
||||
|
@ -1,3 +1,22 @@
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'fileutils'
|
||||
|
||||
Given /^the raw recorded events$/ do
|
||||
|
@ -1,2 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
$LOAD_PATH << File.expand_path('../../../lib', __FILE__)
|
||||
require 'recordandplayback'
|
@ -1,3 +1,22 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
# NOTE:
|
||||
# Copy into /etc/bigbluebutton/god/conf
|
||||
# sudo cp rap-god-conf.rb /etc/bigbluebutton/god/conf/rap-conf.rb
|
||||
|
@ -1,3 +1,22 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
# load in all god configs
|
||||
God.load "/etc/bigbluebutton/god/conf/*.rb"
|
||||
|
||||
|
@ -1,5 +1,22 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
#
|
||||
# Record and Playback God init.d script
|
||||
# http://god.rubyforge.org/
|
||||
#
|
||||
@ -15,6 +32,7 @@
|
||||
# Description: bbb-record-core - BigBlueButton Record and Playback core
|
||||
### END INIT INFO
|
||||
|
||||
|
||||
set -e
|
||||
|
||||
RETVAL=0
|
||||
|
@ -1,6 +1,25 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
path = File.expand_path(File.join(File.dirname(__FILE__), '../lib'))
|
||||
$LOAD_PATH << path
|
||||
|
||||
|
@ -1,5 +1,23 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require 'fileutils'
|
||||
|
||||
|
@ -1,6 +1,25 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require 'fileutils'
|
||||
|
||||
module BigBlueButton
|
||||
|
@ -1,6 +1,25 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require 'rubygems'
|
||||
require 'redis'
|
||||
require 'builder'
|
||||
@ -40,6 +59,18 @@ module BigBlueButton
|
||||
|
||||
def event_info_for(meeting_id, event)
|
||||
@redis.hgetall("recording:#{meeting_id}:#{event}")
|
||||
end
|
||||
|
||||
def delete_event_info_for(meeting_id,event)
|
||||
@redis.del("recording:#{meeting_id}:#{event}")
|
||||
end
|
||||
|
||||
def delete_events_for(meeting_id)
|
||||
@redis.del("meeting:#{meeting_id}:recordings")
|
||||
end
|
||||
|
||||
def delete_metadata_for(meeting_id)
|
||||
@redis.del("meeting:info:#{meeting_id}")
|
||||
end
|
||||
end
|
||||
|
||||
@ -89,6 +120,18 @@ module BigBlueButton
|
||||
end
|
||||
xml.target!
|
||||
end
|
||||
|
||||
def delete_events(meeting_id)
|
||||
meeting_metadata = @redis.metadata_for(meeting_id)
|
||||
if (meeting_metadata != nil)
|
||||
msgs = @redis.events_for(meeting_id)
|
||||
msgs.each do |msg|
|
||||
@redis.delete_event_info_for(meeting_id, msg)
|
||||
end
|
||||
@redis.delete_events_for(meeting_id)
|
||||
end
|
||||
@redis.delete_metadata_for(meeting_id)
|
||||
end
|
||||
|
||||
def save_events_to_file(directory, result)
|
||||
File.open("#{directory}/events.xml", 'w') do |f2|
|
||||
|
@ -1,6 +1,25 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require 'fileutils'
|
||||
require 'rubygems'
|
||||
require 'nokogiri'
|
||||
|
@ -1,6 +1,25 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require 'fileutils'
|
||||
|
||||
module BigBlueButton
|
||||
|
@ -1,6 +1,25 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require 'rubygems'
|
||||
require 'nokogiri'
|
||||
|
||||
|
@ -1,6 +1,25 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require 'rubygems'
|
||||
require 'fileutils'
|
||||
require 'builder'
|
||||
|
@ -1,6 +1,25 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require 'rubygems'
|
||||
require 'nokogiri'
|
||||
|
||||
|
@ -1,6 +1,25 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require 'rubygems'
|
||||
require 'streamio-ffmpeg'
|
||||
|
||||
@ -17,17 +36,6 @@ module BigBlueButton
|
||||
# TODO: check for result, raise an exception when there is an error
|
||||
end
|
||||
|
||||
# Converts a time in milisseconds to a format that FFmpeg understands
|
||||
# ms - time in milisseconds
|
||||
# Example:
|
||||
# ms_to_strtime(1000)
|
||||
# Output:
|
||||
# 00:00:01.000
|
||||
def self.ms_to_strtime(ms)
|
||||
t = Time.at(ms / 1000, (ms % 1000) * 1000)
|
||||
return t.getutc.strftime("%H:%M:%S.%L")
|
||||
end
|
||||
|
||||
# Generates a new video file given a start point and a duration
|
||||
# start - start point of the video_in, in milisseconds
|
||||
# duration - duration of the new video file, in milisseconds
|
||||
@ -67,6 +75,10 @@ module BigBlueButton
|
||||
BigBlueButton.execute(command)
|
||||
# TODO: check for result, raise exception when there is an error
|
||||
end
|
||||
|
||||
def self.create_blank_video_ms(length, rate, blank_canvas, video_out)
|
||||
BigBlueButton.create_blank_video(BigBlueButton.ms_to_strtime(length), rate, blank_canvas, video_out)
|
||||
end
|
||||
|
||||
# Creates a blank image file with the specified dimension and color
|
||||
# width - the width of the image
|
||||
@ -290,14 +302,32 @@ module BigBlueButton
|
||||
# Determine if video is less that 640x480.
|
||||
def self.fits_640_by_480?(width, height)
|
||||
BigBlueButton.logger.info("Task: Determine if video is less that max width and height")
|
||||
(width < 640) and (height < 480)
|
||||
(width < MAX_VID_WIDTH) and (height < MAX_VID_HEIGHT)
|
||||
end
|
||||
|
||||
# Determine the width and height of the video that fits
|
||||
# within 640x480 while maintaining aspect ratio.
|
||||
def self.fit_to_640_by_480(width, height)
|
||||
BigBlueButton.logger.info("Fitting the video to the max width and height")
|
||||
fit_to(width, height, 640, 480)
|
||||
anamorphic_factor = calc_anamorphic_factor(width, height)
|
||||
if (width <= MAX_VID_WIDTH) and (height > MAX_VID_HEIGHT)
|
||||
# Fit the video vertically and adjust the width then pad it to fit into 640x480 video.
|
||||
width = calc_width(anamorphic_factor)
|
||||
height = MAX_VID_HEIGHT
|
||||
elsif (height <= MAX_VID_HEIGHT) and (width > MAX_VID_WIDTH)
|
||||
# Fit the video horizontally and adjust the height then pad the top and bottom to fit the 640x480 video.
|
||||
height = calc_height(anamorphic_factor)
|
||||
width = MAX_VID_WIDTH
|
||||
else
|
||||
if (height > width)
|
||||
width = calc_width(anamorphic_factor)
|
||||
height = MAX_VID_HEIGHT
|
||||
elsif (width >= height)
|
||||
height = calc_height(anamorphic_factor)
|
||||
width = MAX_VID_WIDTH
|
||||
end
|
||||
end
|
||||
{:width => width.to_i, :height => height.to_i}
|
||||
end
|
||||
|
||||
def self.fit_to(width, height, fit_width, fit_height)
|
||||
@ -310,7 +340,7 @@ module BigBlueButton
|
||||
width = fit_width
|
||||
height = width / aspect_ratio
|
||||
end
|
||||
BigBlueButton.logger.info("Best fit width #{width} height #{height}")
|
||||
BigBlueButton.logger.info("Best fit width #{width.to_i} height #{height.to_i}")
|
||||
{:width => width.to_i, :height => height.to_i}
|
||||
end
|
||||
|
||||
@ -428,12 +458,18 @@ module BigBlueButton
|
||||
BigBlueButton.concatenate_videos(flvs, "#{target_dir}/deskshare.flv")
|
||||
end
|
||||
|
||||
def BigBlueButton.ms_to_strtime(ms)
|
||||
# Converts a time in milisseconds to a format that FFmpeg understands
|
||||
# ms - time in milisseconds
|
||||
# Example:
|
||||
# ms_to_strtime(1000)
|
||||
# Output:
|
||||
# 00:00:01.000
|
||||
def self.ms_to_strtime(ms)
|
||||
t = Time.at(ms / 1000, (ms % 1000) * 1000)
|
||||
return t.getutc.strftime("%H:%M:%S.%L")
|
||||
end
|
||||
|
||||
def BigBlueButton.process_videos(target_dir, temp_dir, meeting_id)
|
||||
def BigBlueButton.process_multiple_videos(target_dir, temp_dir, meeting_id, output_width, output_height)
|
||||
BigBlueButton.logger.info("Processing webcam videos")
|
||||
|
||||
# Process audio
|
||||
@ -443,7 +479,7 @@ module BigBlueButton
|
||||
blank_color = "000000"
|
||||
video_dir = "#{temp_dir}/#{meeting_id}/video/#{meeting_id}"
|
||||
blank_canvas = "#{temp_dir}/canvas.jpg"
|
||||
BigBlueButton.create_blank_canvas(MAX_VID_WIDTH, MAX_VID_HEIGHT, "##{blank_color}", blank_canvas)
|
||||
BigBlueButton.create_blank_canvas(output_width, output_height, "##{blank_color}", blank_canvas)
|
||||
|
||||
events_xml = "#{temp_dir}/#{meeting_id}/events.xml"
|
||||
first_timestamp = BigBlueButton::Events.first_event_timestamp(events_xml)
|
||||
@ -451,6 +487,14 @@ module BigBlueButton
|
||||
start_evt = BigBlueButton::Events.get_start_video_events(events_xml)
|
||||
stop_evt = BigBlueButton::Events.get_stop_video_events(events_xml)
|
||||
matched_evts = BigBlueButton::Events.match_start_and_stop_video_events(start_evt, stop_evt)
|
||||
BigBlueButton.logger.debug("First timestamp: #{first_timestamp}")
|
||||
BigBlueButton.logger.debug("Last timestamp: #{last_timestamp}")
|
||||
BigBlueButton.logger.debug("Start events:")
|
||||
BigBlueButton.logger.debug(start_evt)
|
||||
BigBlueButton.logger.debug("Stop events:")
|
||||
BigBlueButton.logger.debug(stop_evt)
|
||||
BigBlueButton.logger.debug("Matched events:")
|
||||
BigBlueButton.logger.debug(matched_evts)
|
||||
|
||||
all_events = []
|
||||
start_evt.each do |evt|
|
||||
@ -468,6 +512,9 @@ module BigBlueButton
|
||||
all_events << event
|
||||
end
|
||||
all_events.sort!{|a,b| a[:timestamp] <=> b[:timestamp]}
|
||||
|
||||
BigBlueButton.logger.debug("All events:")
|
||||
BigBlueButton.logger.debug(all_events)
|
||||
|
||||
timeline = [ { :timestamp => first_timestamp, :webcams => [] } ]
|
||||
all_events.each do |event|
|
||||
@ -479,7 +526,10 @@ module BigBlueButton
|
||||
end
|
||||
timeline << new_event
|
||||
end
|
||||
|
||||
timeline << { :timestamp => last_timestamp, :webcams => [] }
|
||||
BigBlueButton.logger.debug("Current timeline:")
|
||||
BigBlueButton.logger.debug(timeline)
|
||||
|
||||
# removes audio stream
|
||||
matched_evts.each do |evt|
|
||||
@ -489,55 +539,68 @@ module BigBlueButton
|
||||
|
||||
webcams = []
|
||||
for i in 1..(timeline.length-1)
|
||||
past_event = timeline[i-1]
|
||||
event = timeline[i]
|
||||
|
||||
if past_event[:webcams].empty?
|
||||
event = timeline[i-1]
|
||||
next_event = timeline[i]
|
||||
event_duration = next_event[:timestamp] - event[:timestamp]
|
||||
|
||||
BigBlueButton.logger.debug("Processing event:")
|
||||
BigBlueButton.logger.debug(event)
|
||||
|
||||
if event_duration == 0 then
|
||||
next
|
||||
elsif event[:webcams].empty?
|
||||
blank_video = "#{temp_dir}/#{meeting_id}/video#{i}.flv"
|
||||
webcams << blank_video
|
||||
BigBlueButton.create_blank_video((event[:timestamp] - past_event[:timestamp].to_f)/1000.0, 1000, blank_canvas, blank_video)
|
||||
BigBlueButton.create_blank_video_ms(event_duration, 1000, blank_canvas, blank_video)
|
||||
else
|
||||
# try to find the number of rows to maximize the internal videos
|
||||
# try to find the number of rows and columns to maximize the internal videos
|
||||
each_row = 0
|
||||
num_rows = 0
|
||||
slot_width = 0
|
||||
slot_height = 0
|
||||
for rows in 1..(past_event[:webcams].length)
|
||||
tmp_each_row = (past_event[:webcams].length / rows.to_f).ceil
|
||||
max_width = (MAX_VID_WIDTH / tmp_each_row).floor
|
||||
max_height = (MAX_VID_HEIGHT / rows).floor
|
||||
if max_width <= 0 or max_height <= 0
|
||||
total_area = 0
|
||||
num_cams = event[:webcams].length
|
||||
for tmp_num_rows in 1..(num_cams)
|
||||
tmp_each_row = (num_cams / tmp_num_rows.to_f).ceil
|
||||
max_width = (output_width / tmp_each_row).floor
|
||||
max_height = (output_height / tmp_num_rows).floor
|
||||
if max_width <= 0 or max_height <= 0 then
|
||||
next
|
||||
end
|
||||
|
||||
measurements = BigBlueButton.fit_to(MAX_VID_WIDTH, MAX_VID_HEIGHT, max_width, max_height)
|
||||
max_width = measurements[:width]
|
||||
max_height = measurements[:height]
|
||||
tmp_total_area = 0
|
||||
event[:webcams].each do |stream|
|
||||
video_path = "#{temp_dir}/#{meeting_id}/stripped-#{stream}.flv"
|
||||
measurements = BigBlueButton.fit_to(BigBlueButton.get_video_width(video_path), BigBlueButton.get_video_height(video_path), max_width, max_height)
|
||||
tmp_total_area += measurements[:width] * measurements[:height]
|
||||
end
|
||||
|
||||
if max_width > slot_width
|
||||
if tmp_total_area > total_area
|
||||
slot_width = max_width
|
||||
slot_height = max_height
|
||||
num_rows = rows
|
||||
num_rows = tmp_num_rows
|
||||
each_row = tmp_each_row
|
||||
total_area = tmp_total_area
|
||||
end
|
||||
end
|
||||
|
||||
BigBlueButton.logger.debug("Using #{num_rows} rows and #{each_row} columns the slot size is #{slot_width}x#{slot_height}")
|
||||
|
||||
# create video canvas
|
||||
video_filter = "pad=#{MAX_VID_WIDTH}:#{MAX_VID_HEIGHT}:0:0:0x#{blank_color} "
|
||||
video_filter = "pad=#{output_width}:#{output_height}:0:0:0x#{blank_color} "
|
||||
|
||||
past_event[:webcams].each_with_index do |stream, index|
|
||||
event[:webcams].each_with_index do |stream, index|
|
||||
stream_events = matched_evts.select{|s| s[:stream] == stream}[0]
|
||||
video_begin = past_event[:timestamp] - stream_events[:start_timestamp]
|
||||
video_duration = event[:timestamp] - past_event[:timestamp]
|
||||
video_begin = event[:timestamp] - stream_events[:start_timestamp]
|
||||
trimmed_video = "#{temp_dir}/#{meeting_id}/video#{i}-#{stream}.flv"
|
||||
stripped_video = "#{temp_dir}/#{meeting_id}/stripped-#{stream}.flv"
|
||||
BigBlueButton.trim_video(video_begin, video_duration, stripped_video, trimmed_video)
|
||||
BigBlueButton.trim_video(video_begin, event_duration, stripped_video, trimmed_video)
|
||||
|
||||
# sometimes the duration is too small that ffmpeg cannot create a valid video file for it
|
||||
# in this cases we will create a blank valid video instead
|
||||
# \TODO investigate why it's occurring
|
||||
if BigBlueButton.get_video_duration(trimmed_video) == nil
|
||||
BigBlueButton.create_blank_video(video_duration/1000.0, 1000, blank_canvas, trimmed_video)
|
||||
if BigBlueButton.get_video_duration(trimmed_video).nil? || BigBlueButton.get_video_duration(trimmed_video) == 0.0
|
||||
BigBlueButton.create_blank_video_ms(event_duration, 1000, blank_canvas, trimmed_video)
|
||||
end
|
||||
frame_size = BigBlueButton.fit_to(BigBlueButton.get_video_width(trimmed_video), BigBlueButton.get_video_height(trimmed_video), slot_width, slot_height)
|
||||
width = frame_size[:width]
|
||||
@ -547,8 +610,8 @@ module BigBlueButton
|
||||
command = "ffmpeg -i #{trimmed_video} -loglevel fatal -v -10 -aspect 4:3 -r 1000 -sameq -vf scale=#{width}:#{height} #{scaled_video}"
|
||||
BigBlueButton.execute(command)
|
||||
|
||||
slot_x = (index%each_row) * slot_width + (MAX_VID_WIDTH - slot_width * each_row) / 2
|
||||
slot_y = (index/each_row).floor * slot_height + (MAX_VID_HEIGHT - slot_height * num_rows) / 2
|
||||
slot_x = (index%each_row) * slot_width + (output_width - slot_width * each_row) / 2
|
||||
slot_y = (index/each_row).floor * slot_height + (output_height - slot_height * num_rows) / 2
|
||||
x = slot_x + (slot_width - width) / 2
|
||||
y = slot_y + (slot_height - height) / 2
|
||||
|
||||
@ -557,7 +620,7 @@ module BigBlueButton
|
||||
end
|
||||
BigBlueButton.logger.info("videofilter: #{video_filter}")
|
||||
blank_video = "#{temp_dir}/#{meeting_id}/video#{i}-blank.flv"
|
||||
BigBlueButton.create_blank_video((event[:timestamp] - past_event[:timestamp].to_f)/1000.0, 1000, blank_canvas, blank_video)
|
||||
BigBlueButton.create_blank_video_ms(event_duration, 1000, blank_canvas, blank_video)
|
||||
webcam_video = "#{temp_dir}/#{meeting_id}/video#{i}.flv"
|
||||
webcams << webcam_video
|
||||
command = "ffmpeg -i #{blank_video} -loglevel fatal -r 1000 -sameq -v -10 -vf \"#{video_filter}\" #{webcam_video}"
|
||||
@ -573,7 +636,7 @@ module BigBlueButton
|
||||
end
|
||||
|
||||
# create webm video and mux audio
|
||||
command = "ffmpeg -i #{target_dir}/audio.ogg -i #{concat_vid} -loglevel fatal -v -10 -vcodec libvpx -profile high -preset slow -b 1000k -threads 0 -map 1:0 -map 0:0 -ar 22050 #{target_dir}/webcams.webm"
|
||||
command = "ffmpeg -i #{target_dir}/audio.ogg -i #{concat_vid} -loglevel fatal -v -10 -vcodec libvpx -b 1000k -threads 0 -map 1:0 -map 0:0 -ar 22050 #{target_dir}/webcams.webm"
|
||||
BigBlueButton.execute(command)
|
||||
end
|
||||
|
||||
|
@ -1,6 +1,25 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require 'fileutils'
|
||||
|
||||
module BigBlueButton
|
||||
|
@ -1,6 +1,25 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require 'fileutils'
|
||||
|
||||
module BigBlueButton
|
||||
|
@ -1,5 +1,23 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require '../lib/recordandplayback'
|
||||
require 'logger'
|
||||
|
@ -1,5 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
#
|
||||
#Redis configuration file
|
||||
#
|
||||
|
@ -1,3 +1,20 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
require "rubygems"
|
||||
require "fileutils"
|
||||
require "redis"
|
||||
|
@ -1,6 +1,24 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require '../lib/recordandplayback'
|
||||
require 'rubygems'
|
||||
require 'yaml'
|
||||
@ -28,10 +46,34 @@ def archive_recorded_meeting(recording_dir)
|
||||
|
||||
end
|
||||
|
||||
def process_archived_meeting(recording_dir)
|
||||
def sanity_archived_meeting(recording_dir)
|
||||
archived_done_files = Dir.glob("#{recording_dir}/status/archived/*.done")
|
||||
|
||||
sanity_done_files = Dir.glob("#{recording_dir}/status/sanity/*.done")
|
||||
sanity_failed_files = Dir.glob("#{recording_dir}/status/sanity/*.fail")
|
||||
|
||||
archived_done_files.each do |df|
|
||||
match = /(.*).done/.match df.sub(/.+\//, "")
|
||||
meeting_id = match[1]
|
||||
|
||||
has_failed = sanity_failed_files.any? { |s| s.include?(meeting_id) }
|
||||
if(has_failed)
|
||||
BigBlueButton.logger.info("it has failed sanity check... skipping meeting: #{meeting_id}")
|
||||
next
|
||||
end
|
||||
|
||||
is_sanity_check_completed = sanity_done_files.any? { |s| s.include?(meeting_id) }
|
||||
if(!is_sanity_check_completed)
|
||||
command = "ruby sanity/sanity.rb -m #{meeting_id}"
|
||||
BigBlueButton.execute(command)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def process_archived_meeting(recording_dir)
|
||||
sanity_done_files = Dir.glob("#{recording_dir}/status/sanity/*.done")
|
||||
|
||||
sanity_done_files.each do |df|
|
||||
match = /(.*).done/.match df.sub(/.+\//, "")
|
||||
meeting_id = match[1]
|
||||
|
||||
@ -101,6 +143,7 @@ end
|
||||
props = YAML::load(File.open('bigbluebutton.yml'))
|
||||
recording_dir = props['recording_dir']
|
||||
archive_recorded_meeting(recording_dir)
|
||||
sanity_archived_meeting(recording_dir)
|
||||
process_archived_meeting(recording_dir)
|
||||
publish_processed_meeting(recording_dir)
|
||||
|
||||
|
97
record-and-playback/core/scripts/sanity/sanity.rb
Executable file
97
record-and-playback/core/scripts/sanity/sanity.rb
Executable file
@ -0,0 +1,97 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require '../lib/recordandplayback'
|
||||
require 'logger'
|
||||
require 'trollop'
|
||||
require 'yaml'
|
||||
require "nokogiri"
|
||||
require "redis"
|
||||
require "fileutils"
|
||||
|
||||
def check_events_xml(raw_dir,meeting_id)
|
||||
filepath = "#{raw_dir}/#{meeting_id}/events.xml"
|
||||
raise Exception, "Events file doesn't exists." if not File.exists?(filepath)
|
||||
bad_doc = Nokogiri::XML(File.open(filepath)) { |config| config.options = Nokogiri::XML::ParseOptions::STRICT }
|
||||
end
|
||||
|
||||
def check_audio_files(raw_dir,meeting_id)
|
||||
#check every file that is in events.xml, it's in audio dir
|
||||
doc = Nokogiri::XML(File.open("#{raw_dir}/#{meeting_id}/events.xml"))
|
||||
|
||||
doc.xpath("//event[@eventname='StartRecordingEvent']/filename/text()").each { |fs_audio_file|
|
||||
audioname = fs_audio_file.content.split("/").last
|
||||
raw_audio_file = "#{raw_dir}/#{meeting_id}/audio/#{audioname}"
|
||||
#checking that the audio file exists in raw directory
|
||||
raise Exception, "Audio file doesn't exists in raw directory." if not File.exists?(raw_audio_file)
|
||||
|
||||
#checking length
|
||||
raise Exception, "Audio file length is zero." if BigBlueButton::AudioEvents.determine_length_of_audio_from_file(raw_audio_file) <= 0
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
BigBlueButton.logger = Logger.new('/var/log/bigbluebutton/sanity.log', 'daily' )
|
||||
|
||||
opts = Trollop::options do
|
||||
opt :meeting_id, "Meeting id to archive", :default => '58f4a6b3-cd07-444d-8564-59116cb53974', :type => String
|
||||
end
|
||||
|
||||
meeting_id = opts[:meeting_id]
|
||||
|
||||
# This script lives in scripts/archive/steps while bigbluebutton.yml lives in scripts/
|
||||
props = YAML::load(File.open('bigbluebutton.yml'))
|
||||
|
||||
audio_dir = props['raw_audio_src']
|
||||
recording_dir = props['recording_dir']
|
||||
raw_archive_dir = "#{recording_dir}/raw"
|
||||
redis_host = props['redis_host']
|
||||
redis_port = props['redis_port']
|
||||
|
||||
begin
|
||||
BigBlueButton.logger.info("checking events.xml")
|
||||
check_events_xml(raw_archive_dir,meeting_id)
|
||||
BigBlueButton.logger.info("checking audio")
|
||||
check_audio_files(raw_archive_dir,meeting_id)
|
||||
#delete keys
|
||||
BigBlueButton.logger.info("deleting keys")
|
||||
redis = BigBlueButton::RedisWrapper.new(redis_host, redis_port)
|
||||
events_archiver = BigBlueButton::RedisEventsArchiver.new redis
|
||||
events_archiver.delete_events(meeting_id)
|
||||
|
||||
#delete audio
|
||||
#Dir.glob("#{audio_dir}/#{meeting_id}*.wav").each{ |audio_meeting|
|
||||
# FileUtils.rm(
|
||||
#}
|
||||
|
||||
#create done files for sanity
|
||||
BigBlueButton.logger.info("creating sanity done files")
|
||||
sanity_done = File.new("#{recording_dir}/status/sanity/#{meeting_id}.done", "w")
|
||||
sanity_done.write("sanity check #{meeting_id}")
|
||||
sanity_done.close
|
||||
rescue Exception => e
|
||||
BigBlueButton.logger.error("error in sanity check: " + e.message)
|
||||
sanity_done = File.new("#{recording_dir}/status/sanity/#{meeting_id}.fail", "w")
|
||||
sanity_done.write("error: " + e.message)
|
||||
sanity_done.close
|
||||
end
|
||||
|
||||
|
@ -1,3 +1,20 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
require 'spec_helper'
|
||||
require 'fileutils'
|
||||
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'spec_helper'
|
||||
require 'digest/md5'
|
||||
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'spec_helper'
|
||||
require 'digest/md5'
|
||||
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'spec_helper'
|
||||
require 'fileutils'
|
||||
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'spec_helper'
|
||||
require 'redis'
|
||||
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'spec_helper'
|
||||
require 'redis'
|
||||
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'spec_helper'
|
||||
require 'digest/md5'
|
||||
require 'fileutils'
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'spec_helper'
|
||||
require 'fileutils'
|
||||
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'spec_helper'
|
||||
require 'fileutils'
|
||||
|
||||
|
@ -1,2 +1,20 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require 'recordandplayback'
|
||||
require 'recordandplayback/generators/audio'
|
||||
|
@ -1,5 +1,22 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
sudo cp -r core/lib/recordandplayback/* /usr/local/bigbluebutton/core/lib/recordandplayback/
|
||||
|
||||
PLAYBACK_LIST="slides presentation"
|
||||
|
@ -1,7 +1,27 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
#
|
||||
#Create Matterhorn installation directory
|
||||
#
|
||||
|
||||
echo "Create Matterhorn installation directory"
|
||||
echo "------------------------------------------------------"
|
||||
echo "sudo mkdir -p /opt/matterhorn"
|
||||
|
@ -17,6 +17,26 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
|
||||
require "rubygems"
|
||||
require "curb"
|
||||
require "nokogiri"
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
# NOTE:
|
||||
# Copy into /etc/bigbluebutton/god/conf
|
||||
# sudo cp matt-pub-god-conf.rb /etc/bigbluebutton/god/conf/matterhorn-publish-conf.rb
|
||||
|
@ -1,5 +1,23 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
require '../../core/lib/recordandplayback'
|
||||
require 'rubygems'
|
||||
|
@ -1,5 +1,22 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require '../../core/lib/recordandplayback'
|
||||
require 'rubygems'
|
||||
@ -41,6 +58,10 @@ done_files.each do |df|
|
||||
Open3.popen3(command) do | stdin, stdout, stderr|
|
||||
BigBlueButton.logger.info("scp result=#{$?.exitstatus}")
|
||||
end
|
||||
|
||||
BigBlueButton.logger.info("Removing processed files.")
|
||||
FileUtils.rm_r(Dir.glob("#{$process_dir}/*"))
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -187,6 +187,6 @@ br{
|
||||
|
||||
|
||||
#cursor {
|
||||
position: absolute;
|
||||
position: relative;
|
||||
background: red;
|
||||
}
|
||||
|
@ -103,7 +103,6 @@ function cleanseSlideText(text) {
|
||||
// - - - END OF JAVASCRIPT FUNCTIONS - - - //
|
||||
|
||||
function runPopcorn() {
|
||||
console.log("SVG loaded");
|
||||
if(svgobj.contentDocument) svgfile = svgobj.contentDocument.getElementById("svgfile");
|
||||
else svgfile = svgobj.getSVGDocument('svgfile');
|
||||
|
||||
@ -125,11 +124,8 @@ function runPopcorn() {
|
||||
|
||||
//get the array of values for the first shape (getDataPoints(0) is the first shape).
|
||||
var array = shapeelements[0].getElementsByClassName("shape"); //get all the lines from the svg file
|
||||
//var pages = shapeelements[0].getElementsByClassName("page");
|
||||
var images = shapeelements[0].getElementsByTagName("image");
|
||||
|
||||
//console.log(images);
|
||||
|
||||
//fill the times array with the times of the svg images.
|
||||
for (var j = 0; j < array.length; j++) {
|
||||
times[j] = array[j].getAttribute("id").substr(4);
|
||||
@ -321,7 +317,7 @@ function runPopcorn() {
|
||||
var cursor_on = false;
|
||||
if(cursorVal != null) {
|
||||
if(!cursor_on) {
|
||||
document.getElementById("cursor").style.visibility = 'visible';
|
||||
document.getElementById("cursor").style.visibility = 'visible'; //make visible
|
||||
cursor_on = true;
|
||||
}
|
||||
setCursor([parseFloat(cursorVal[0]) + imageXOffset - 6, parseFloat(cursorVal[1]) + imageYOffset - 6]); //-6 is for radius of cursor offset
|
||||
@ -331,7 +327,6 @@ function runPopcorn() {
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
var current_canvas = "canvas0";
|
||||
var current_image = "image0";
|
||||
var currentcanvas;
|
||||
@ -381,4 +376,3 @@ window.onresize = function(event) {
|
||||
svgobj.style.left = document.getElementById("slide").offsetLeft + "px";
|
||||
svgobj.style.top = "8px";
|
||||
};
|
||||
console.log("writing.js is loaded.");
|
||||
|
@ -29,19 +29,22 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
<div id="playbackArea" class="clearfix" role="main">
|
||||
<div id="thumbnails" role="region" aria-label="Slide thumbnails"></div>
|
||||
<div id="presentation">
|
||||
<div id="slide" role="region" aria-label="Slide"></div>
|
||||
<div id="slideText" class="visually-hidden" role="region" aria-live="polite" aria-label="polite"></div>
|
||||
<div class="circle" id="cursor" style="visibility:hidden;"></div>
|
||||
<div id="slide" role="region" aria-label="Slide">
|
||||
</div>
|
||||
<div id="slideText" class="visually-hidden" role="region" aria-live="polite" aria-label="polite"></div>
|
||||
</div>
|
||||
<div class="circle" id="cursor" style="visibility:hidden;"></div>
|
||||
<div class="chatcontainer">
|
||||
<div id="chat" aria-live="polite" role="region" aria-label="Chat messages"></div>
|
||||
<div id="videoRecordingWrapper" role="region" aria-label="Video">
|
||||
<video id="video" controls>You must use an HTML5 capable browser to view this page.
|
||||
This playback requires modern browser, please use FF, Safari, Chrome</video>
|
||||
</div>
|
||||
This playback requires modern browser, please use FF, Safari, Chrome</video>
|
||||
</div>
|
||||
<div id="audioRecordingWrapper" role="region" aria-label="Audio"></div>
|
||||
</div>
|
||||
</div>
|
||||
<p id="footer">Recorded with <a href="http://bigbluebutton.org/">BigBlueButton</a>.</p>
|
||||
<script src='lib/writing.js'></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -1,3 +1,23 @@
|
||||
/*
|
||||
|
||||
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
|
||||
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under the
|
||||
terms of the GNU Lesser General Public License as published by the Free Software
|
||||
Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
version.
|
||||
|
||||
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
goToSlide = function(time) {
|
||||
var pop = Popcorn("#video");
|
||||
pop.currentTime(time);
|
||||
@ -175,7 +195,7 @@ generateThumbnails = function() {
|
||||
var div = $(document.createElement('div'));
|
||||
div.addClass("thumbnail-wrapper");
|
||||
div.attr("role", "link"); //tells accessibility software it can be clicked
|
||||
div.attr("aria-describedby", img.attr("id") + "description");
|
||||
div.attr("aria-describedby", img.attr("id") + "description");
|
||||
div.append(img);
|
||||
div.append(label);
|
||||
div.append(hiddenDesc);
|
||||
@ -196,33 +216,55 @@ generateThumbnails = function() {
|
||||
}
|
||||
}
|
||||
|
||||
google_frame_warning = function(){
|
||||
var message = "To support this playback please install 'Google Chrome Frame', or use other browser: Firefox, Safari, Chrome, Opera";
|
||||
var line = document.createElement("p");
|
||||
var link = document.createElement("a");
|
||||
line.appendChild(document.createTextNode(message));
|
||||
link.setAttribute("href", "http://www.google.com/chromeframe")
|
||||
link.setAttribute("target", "_blank")
|
||||
link.appendChild(document.createTextNode("Install Google Chrome Frame"));
|
||||
document.getElementById("chat").appendChild(line);
|
||||
document.getElementById("chat").appendChild(link);
|
||||
}
|
||||
|
||||
load_video = function(video){
|
||||
video.setAttribute('src', RECORDINGS + '/video/webcams.webm');
|
||||
video.setAttribute('type','video/webm');
|
||||
video.setAttribute('data-timeline-sources', SLIDES_XML);
|
||||
}
|
||||
|
||||
load_audio = function() {
|
||||
audio = document.createElement("audio")
|
||||
audio.setAttribute('src', RECORDINGS + '/audio/audio.ogg');
|
||||
audio.setAttribute('type','audio/ogg');
|
||||
audio.setAttribute('id','video');
|
||||
audio.setAttribute('controls','');
|
||||
audio.setAttribute('autoplay','autoplay');
|
||||
audio.setAttribute('data-timeline-sources', SLIDES_XML);
|
||||
document.getElementById("audioRecordingWrapper").appendChild(audio)
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener( "DOMContentLoaded", function() {
|
||||
var appName = navigator.appName;
|
||||
var appVersion = navigator.appVersion;
|
||||
var video = document.getElementById("video");
|
||||
if (appName == "Microsoft Internet Explorer") {
|
||||
if (navigator.userAgent.match("chromeframe")) {
|
||||
video.setAttribute('src', RECORDINGS + '/video/webcams.webm');
|
||||
video.setAttribute('type','video/webm');
|
||||
} else {
|
||||
var message = "To support this playback please install 'Google Chrome Frame', or use other browser: Firefox, Safari, Chrome, Opera";
|
||||
var line = document.createElement("p");
|
||||
var link = document.createElement("a");
|
||||
line.appendChild(document.createTextNode(message));
|
||||
link.setAttribute("href", "http://www.google.com/chromeframe")
|
||||
link.setAttribute("target", "_blank")
|
||||
link.appendChild(document.createTextNode("Install Google Chrome Frame"));
|
||||
document.getElementById("chat").appendChild(line);
|
||||
document.getElementById("chat").appendChild(link);
|
||||
}
|
||||
} else if (appVersion.match("Safari") != null && appVersion.match("Chrome") == null) {
|
||||
video.setAttribute('src', RECORDINGS + '/video/webcams.webm');
|
||||
video.setAttribute('type','video/webm');
|
||||
} else {
|
||||
video.setAttribute('src', RECORDINGS + '/video/webcams.webm');
|
||||
video.setAttribute('type','video/webm');
|
||||
|
||||
if (appName == "Microsoft Internet Explorer" && navigator.userAgent.match("chromeframe") == false ) {
|
||||
google_frame_warning
|
||||
}
|
||||
video.setAttribute('data-timeline-sources', SLIDES_XML);
|
||||
|
||||
video.addEventListener("error",function(ev){
|
||||
if (ev.currentTarget.networkState == ev.currentTarget.NETWORK_NO_SOURCE){
|
||||
videoContainer = document.getElementById("videoRecordingWrapper")
|
||||
videoContainer.parentNode.removeChild(videoContainer)
|
||||
load_audio()
|
||||
}
|
||||
},true);
|
||||
load_video(video)
|
||||
|
||||
generateThumbnails();
|
||||
|
||||
}, false);
|
||||
|
||||
|
@ -1,3 +1,21 @@
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
location /playback/presentation {
|
||||
root /var/bigbluebutton;
|
||||
index index.html index.htm;
|
||||
|
@ -1,3 +1,6 @@
|
||||
|
||||
playback_host: 192.168.0.183
|
||||
publish_dir: /var/bigbluebutton/published/presentation
|
||||
video_output_width: 640
|
||||
video_output_height: 480
|
||||
|
||||
|
@ -32,6 +32,7 @@ meeting_id = opts[:meeting_id]
|
||||
|
||||
# This script lives in scripts/archive/steps while properties.yaml lives in scripts/
|
||||
props = YAML::load(File.open('../../core/scripts/bigbluebutton.yml'))
|
||||
presentation_props = YAML::load(File.open('presentation.yml'))
|
||||
|
||||
recording_dir = props['recording_dir']
|
||||
raw_archive_dir = "#{recording_dir}/raw/#{meeting_id}"
|
||||
@ -40,6 +41,7 @@ raw_archive_dir = "#{recording_dir}/raw/#{meeting_id}"
|
||||
|
||||
target_dir = "#{recording_dir}/process/presentation/#{meeting_id}"
|
||||
if not FileTest.directory?(target_dir)
|
||||
FileUtils.mkdir_p "/var/log/bigbluebutton/presentation"
|
||||
logger = Logger.new("/var/log/bigbluebutton/presentation/process-#{meeting_id}.log", 'daily' )
|
||||
BigBlueButton.logger = logger
|
||||
BigBlueButton.logger.info("Processing script presentation.rb")
|
||||
@ -77,7 +79,9 @@ if not FileTest.directory?(target_dir)
|
||||
#BigBlueButton::Presentation.convert_pdf_to_png(pdf_page, "#{target_pres_dir}/slide-#{page}.png")
|
||||
command = "convert -density 300x300 -resize 1600x1200 -quality 90 +dither -depth 8 -colors 256 #{pdf_page} #{target_pres_dir}/slide-#{page}.png"
|
||||
BigBlueButton.execute(command)
|
||||
FileUtils.cp("#{pres_dir}/textfiles/slide-#{page}.txt", "#{target_pres_dir}/textfiles")
|
||||
if File.exist?("#{pres_dir}/textfiles/slide-#{page}.txt") then
|
||||
FileUtils.cp("#{pres_dir}/textfiles/slide-#{page}.txt", "#{target_pres_dir}/textfiles")
|
||||
end
|
||||
end
|
||||
else
|
||||
ext = File.extname("#{images[0]}")
|
||||
@ -88,7 +92,11 @@ if not FileTest.directory?(target_dir)
|
||||
|
||||
end
|
||||
|
||||
BigBlueButton.process_videos(target_dir, temp_dir, meeting_id)
|
||||
if !Dir["#{raw_archive_dir}/video/*"].empty?
|
||||
BigBlueButton.process_multiple_videos(target_dir, temp_dir, meeting_id, presentation_props['video_output_width'], presentation_props['video_output_height'])
|
||||
else
|
||||
BigBlueButton::AudioProcessor.process("#{temp_dir}/#{meeting_id}", "#{target_dir}/audio.ogg")
|
||||
end
|
||||
|
||||
process_done = File.new("#{recording_dir}/status/processed/#{meeting_id}-presentation.done", "w")
|
||||
process_done.write("Processed #{meeting_id}")
|
||||
|
@ -264,6 +264,45 @@ def storeRectShape
|
||||
end
|
||||
end
|
||||
|
||||
def storeTriangleShape
|
||||
if($shapeCreationTime != $prev_time)
|
||||
if(($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height))
|
||||
# do not update the triangle count
|
||||
else
|
||||
$triangle_count = $triangle_count + 1
|
||||
end
|
||||
$xml.g(:class => :shape, :id => "draw#{$shapeCreationTime}", :undo => $shapeUndoTime, :shape => "triangle#{$triangle_count}", :style => "stroke:\##{$colour_hex}; stroke-width:#{$shapeThickness}; visibility:hidden; fill:none") do
|
||||
|
||||
$originX = (($shapeDataPoints[0].to_f)/100)*$vbox_width
|
||||
$originY = (($shapeDataPoints[1].to_f)/100)*$vbox_height
|
||||
|
||||
#3 points (p0, p1 and p2) to draw a triangle
|
||||
|
||||
base = (($shapeDataPoints[2].to_f - $shapeDataPoints[0].to_f)/100)*$vbox_width
|
||||
|
||||
x0 = $originX + (base.to_f / 2.0)
|
||||
x1 = $originX
|
||||
x2 = $originX + base.to_f
|
||||
|
||||
height = (($shapeDataPoints[3].to_f - $shapeDataPoints[1].to_f)/100)*$vbox_height
|
||||
|
||||
y0 = $originY
|
||||
y1 = $originY + height
|
||||
y2 = y1
|
||||
|
||||
p0 = "#{x0},#{y0}"
|
||||
p1 = "#{x1},#{y1}"
|
||||
p2 = "#{x2},#{y2}"
|
||||
|
||||
$originalOriginX = $originX
|
||||
$originalOriginY = $originY
|
||||
|
||||
$xml.polyline(:points => "#{p0} #{p1} #{p2} #{p0}")
|
||||
$prev_time = $shapeCreationTime
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def storeEllipseShape
|
||||
if($shapeCreationTime != $prev_time)
|
||||
if(($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height))
|
||||
@ -292,15 +331,17 @@ def storeEllipseShape
|
||||
end # end if($shapeCreationTime != $prev_time)
|
||||
end
|
||||
|
||||
|
||||
def storeTextShape
|
||||
def storeTextShape
|
||||
if($shapeCreationTime != $prev_time)
|
||||
$xml.g(:class => :shape, :id => "draw#{$shapeCreationTime}", :undo => $shapeUndoTime, :shape => "text#{$text_count}", :style => "fill:\##{$colour_hex}; visibility:hidden; font-family: #{$textFontType}; font-size: #{$textFontSize};") do
|
||||
$xml.text_(:x => "#{(($shapeDataPoints[0].to_f)/100)*$vbox_width}", :y => "#{(($shapeDataPoints[1].to_f)/100)*$vbox_height}") do
|
||||
$xml.text($textValue)
|
||||
font_size_factor = 2
|
||||
y_gap = 45
|
||||
$textFontSize_pixels = $textFontSize.to_f * font_size_factor
|
||||
$xml.g(:class => :shape, :id => "draw#{$shapeCreationTime}", :undo => $shapeUndoTime, :shape => "text#{$text_count}", :style => "fill:\##{$colour_hex}; visibility:hidden; font-family: #{$textFontType}; font-size: #{$textFontSize_pixels};") do
|
||||
$xml.text_( "font-size" => "#{$textFontSize_pixels}", :x => "#{(($shapeDataPoints[0].to_f)/100)*$vbox_width}", :y => "#{((($shapeDataPoints[1].to_f)/100) *$vbox_height ) + y_gap.to_f }") do
|
||||
$xml.text($textValue)
|
||||
end
|
||||
$prev_time = $shapeCreationTime
|
||||
end # end xml.g
|
||||
end # end xml.g
|
||||
end # end if($shapeCreationTime != $prev_time)
|
||||
end
|
||||
|
||||
@ -395,18 +436,20 @@ def processShapesAndClears
|
||||
end
|
||||
|
||||
if(in_this_image)
|
||||
# Get variables
|
||||
$shapeType = shape.xpath(".//type")[0].text()
|
||||
$shapeThickness = shape.xpath(".//thickness")[0].text()
|
||||
$pageNumber = shape.xpath(".//pageNumber")[0].text()
|
||||
$shapeDataPoints = shape.xpath(".//dataPoints")[0].text().split(",")
|
||||
colour = shape.xpath(".//color")[0].text()
|
||||
|
||||
if($shapeType == "text")
|
||||
$textValue = shape.xpath(".//text")[0].text()
|
||||
$textFontType = shape.xpath(".//font")[0].text()
|
||||
$textFontSize = shape.xpath(".//fontsize")[0].text()
|
||||
end
|
||||
# Get variables
|
||||
BigBlueButton.logger.info shape
|
||||
$shapeType = shape.xpath(".//type")[0].text()
|
||||
$pageNumber = shape.xpath(".//pageNumber")[0].text()
|
||||
$shapeDataPoints = shape.xpath(".//dataPoints")[0].text().split(",")
|
||||
|
||||
if($shapeType == "text")
|
||||
$textValue = shape.xpath(".//text")[0].text()
|
||||
$textFontType = "Arial"
|
||||
$textFontSize = shape.xpath(".//fontSize")[0].text()
|
||||
else
|
||||
$shapeThickness = shape.xpath(".//thickness")[0].text()
|
||||
colour = shape.xpath(".//color")[0].text()
|
||||
end
|
||||
|
||||
# figure out undo time
|
||||
BigBlueButton.logger.info("Figuring out undo time")
|
||||
@ -465,6 +508,10 @@ def processShapesAndClears
|
||||
elsif $shapeType.eql? "rectangle"
|
||||
storeRectShape()
|
||||
|
||||
# Process the triangle shapes
|
||||
elsif $shapeType.eql? "triangle"
|
||||
storeTriangleShape()
|
||||
|
||||
# Process the ellipse shapes
|
||||
elsif $shapeType.eql? "ellipse"
|
||||
storeEllipseShape()
|
||||
@ -498,8 +545,8 @@ def processChatMessages
|
||||
end
|
||||
end
|
||||
|
||||
$vbox_width = 800
|
||||
$vbox_height = 600
|
||||
$vbox_width = 1600
|
||||
$vbox_height = 1200
|
||||
$magic_mystery_number = 2
|
||||
$shapesold_svg_filename = 'shapes_old.svg'
|
||||
$shapes_svg_filename = 'shapes.svg'
|
||||
@ -512,6 +559,7 @@ $originalOriginX = "NaN"
|
||||
$originalOriginY = "NaN"
|
||||
|
||||
$rectangle_count = 0
|
||||
$triangle_count = 0
|
||||
$line_count = 0
|
||||
$ellipse_count = 0
|
||||
$text_count = 0
|
||||
@ -577,13 +625,15 @@ if ($playback == "slides")
|
||||
BigBlueButton.logger.info("Copied .wav file - copying #{$process_dir}/events.xml to -> #{package_dir}")
|
||||
FileUtils.cp("#{$process_dir}/events.xml", package_dir)
|
||||
BigBlueButton.logger.info("Copied events.xml file")
|
||||
|
||||
BigBlueButton.logger.info("Making video dir")
|
||||
video_dir = "#{package_dir}/video"
|
||||
FileUtils.mkdir_p video_dir
|
||||
BigBlueButton.logger.info("Made video dir - copying: #{$process_dir}/webcams.webm to -> #{video_dir}")
|
||||
FileUtils.cp("#{$process_dir}/webcams.webm", video_dir)
|
||||
BigBlueButton.logger.info("Copied .webm file")
|
||||
|
||||
if File.exist?("#{$process_dir}/webcams.webm")
|
||||
BigBlueButton.logger.info("Making video dir")
|
||||
video_dir = "#{package_dir}/video"
|
||||
FileUtils.mkdir_p video_dir
|
||||
BigBlueButton.logger.info("Made video dir - copying: #{$process_dir}/webcams.webm to -> #{video_dir}")
|
||||
FileUtils.cp("#{$process_dir}/webcams.webm", video_dir)
|
||||
BigBlueButton.logger.info("Copied .webm file")
|
||||
end
|
||||
|
||||
BigBlueButton.logger.info("Copying files to package dir")
|
||||
FileUtils.cp_r("#{$process_dir}/presentation", package_dir)
|
||||
@ -629,7 +679,7 @@ if ($playback == "slides")
|
||||
# Gathering all the events from the events.xml
|
||||
$slides_events = @doc.xpath("//event[@eventname='GotoSlideEvent' or @eventname='SharePresentationEvent']")
|
||||
$chat_events = @doc.xpath("//event[@eventname='PublicChatEvent']")
|
||||
$shape_events = @doc.xpath("//event[@eventname='AddShapeEvent']") # for the creation of shapes
|
||||
$shape_events = @doc.xpath("//event[@eventname='AddShapeEvent' or @eventname='ModifyTextEvent']") # for the creation of shapes
|
||||
$panzoom_events = @doc.xpath("//event[@eventname='ResizeAndMoveSlideEvent']") # for the action of panning and/or zooming
|
||||
$cursor_events = @doc.xpath("//event[@eventname='CursorMoveEvent']")
|
||||
$clear_page_events = @doc.xpath("//event[@eventname='ClearPageEvent']") # for clearing the svg image
|
||||
@ -643,17 +693,10 @@ if ($playback == "slides")
|
||||
|
||||
processPanAndZooms()
|
||||
|
||||
BigBlueButton.logger.info("Cursor events empty: #{$cursor_events.empty?}")
|
||||
processCursorEvents()
|
||||
|
||||
|
||||
|
||||
BigBlueButton.logger.info("writing slides_new.xml")
|
||||
# Write slides.xml to file
|
||||
File.open("#{package_dir}/slides_new.xml", 'w') { |f| f.puts $slides_doc.to_xml }
|
||||
|
||||
BigBlueButton.logger.info("Wrote slides_new.xml")
|
||||
|
||||
# Write shapes.svg to file
|
||||
File.open("#{package_dir}/#{$shapes_svg_filename}", 'w') { |f| f.puts $shapes_svg.to_xml.gsub(%r"\s*\<g.*/\>", "") } #.gsub(%r"\s*\<g.*\>\s*\</g\>", "") }
|
||||
|
||||
@ -663,13 +706,19 @@ if ($playback == "slides")
|
||||
# Write panzooms.xml to file
|
||||
File.open("#{package_dir}/#{$cursor_xml_filename}", 'w') { |f| f.puts $cursor_xml.to_xml }
|
||||
|
||||
BigBlueButton.logger.info("Publishing slides")
|
||||
BigBlueButton.logger.info("Publishing slides")
|
||||
# Now publish this recording files by copying them into the publish folder.
|
||||
if not FileTest.directory?(publish_dir)
|
||||
FileUtils.mkdir_p publish_dir
|
||||
end
|
||||
FileUtils.cp_r(package_dir, publish_dir) # Copy all the files.
|
||||
BigBlueButton.logger.info("Finished publishing script presentation.rb successfully.")
|
||||
|
||||
BigBlueButton.logger.info("Removing processed files.")
|
||||
FileUtils.rm_r(Dir.glob("#{$process_dir}/*"))
|
||||
|
||||
BigBlueButton.logger.info("Removing published files.")
|
||||
FileUtils.rm_r(Dir.glob("#{target_dir}/*"))
|
||||
else
|
||||
BigBlueButton.logger.info("#{target_dir} is already there")
|
||||
end
|
||||
|
@ -1,3 +1,23 @@
|
||||
/*
|
||||
|
||||
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
|
||||
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under the
|
||||
terms of the GNU Lesser General Public License as published by the Free Software
|
||||
Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
version.
|
||||
|
||||
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
html{
|
||||
height:100%;
|
||||
}
|
||||
|
@ -1,4 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
|
||||
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under the
|
||||
terms of the GNU Lesser General Public License as published by the Free Software
|
||||
Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
version.
|
||||
*
|
||||
BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
|
||||
|
@ -1,6 +1,24 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
require '../../core/lib/recordandplayback'
|
||||
require 'rubygems'
|
||||
require 'trollop'
|
||||
@ -20,6 +38,7 @@ raw_archive_dir = "#{recording_dir}/raw/#{meeting_id}"
|
||||
|
||||
target_dir = "#{recording_dir}/process/slides/#{meeting_id}"
|
||||
if not FileTest.directory?(target_dir)
|
||||
FileUtils.mkdir_p "/var/log/bigbluebutton/slides"
|
||||
logger = Logger.new("/var/log/bigbluebutton/slides/process-#{meeting_id}.log", 'daily' )
|
||||
BigBlueButton.logger = logger
|
||||
|
||||
@ -55,7 +74,9 @@ if not FileTest.directory?(target_dir)
|
||||
pdf_page = "#{pres_dir}/slide-#{page}.pdf"
|
||||
BigBlueButton::Presentation.extract_page_from_pdf(page, pres_pdf, pdf_page)
|
||||
BigBlueButton::Presentation.convert_pdf_to_png(pdf_page, "#{target_pres_dir}/slide-#{page}.png")
|
||||
FileUtils.cp("#{pres_dir}/textfiles/slide-#{page}.txt", "#{target_pres_dir}/textfiles")
|
||||
if File.exist?("#{pres_dir}/textfiles/slide-#{page}.txt") then
|
||||
FileUtils.cp("#{pres_dir}/textfiles/slide-#{page}.txt", "#{target_pres_dir}/textfiles")
|
||||
end
|
||||
end
|
||||
else
|
||||
ext = File.extname("#{images[0]}")
|
||||
|
@ -1,6 +1,23 @@
|
||||
# Set encoding to utf-8
|
||||
# encoding: UTF-8
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
require '../../core/lib/recordandplayback'
|
||||
require 'rubygems'
|
||||
require 'trollop'
|
||||
|
@ -1,3 +1,21 @@
|
||||
|
||||
#
|
||||
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
|
||||
#
|
||||
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License as published by the Free Software
|
||||
# Foundation; either version 3.0 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License along
|
||||
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
location /playback/slides {
|
||||
root /var/bigbluebutton;
|
||||
index index.html index.htm;
|
||||
|
Loading…
Reference in New Issue
Block a user