Merge branch 'master' into upgrading-red5-r4406

This commit is contained in:
Richard Alam 2012-09-05 14:43:03 +00:00
commit 046e4aa9d8
69 changed files with 1360 additions and 174 deletions

View File

@ -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;

View File

@ -66,10 +66,6 @@ public class BigBlueButtonSession {
return internalUserID;
}
public long getClientID() {
return clientID;
}
public String getSessionName() {
return sessionName;
}

View File

@ -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()));
}
}

View File

@ -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();

View File

@ -19,6 +19,7 @@ server {
proxy_read_timeout 90;
proxy_buffering off;
keepalive_requests 1000000000;
}
# Handle desktop sharing tunneling. Forwards

View File

@ -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"
/>

View File

@ -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>

View File

@ -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");

View File

@ -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(",");

View File

@ -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{

View File

@ -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();

View File

@ -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) {

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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

View 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 'fileutils'
Given /^a set of audio recordings in the archive$/ do

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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|

View File

@ -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'

View File

@ -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

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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
#

View 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"

View File

@ -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)

View 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

View 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 'spec_helper'
require 'fileutils'

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -187,6 +187,6 @@ br{
#cursor {
position: absolute;
position: relative;
background: red;
}

View File

@ -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.");

View File

@ -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>

View File

@ -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);

View File

@ -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;

View File

@ -1,3 +1,6 @@
playback_host: 192.168.0.183
publish_dir: /var/bigbluebutton/published/presentation
video_output_width: 640
video_output_height: 480

View File

@ -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}")

View File

@ -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

View File

@ -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%;
}

View File

@ -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>

View File

@ -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]}")

View File

@ -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'

View File

@ -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;