Commit Graph

675 Commits

Author SHA1 Message Date
Daniel Petri Rocha
61bc318211
Merge branch 'bigbluebutton:develop' into faster-publish 2022-01-31 16:23:00 +01:00
Ramón Souza
16cd3c4ebb Merge remote-tracking branch 'upstream/v2.4.x-release' into dev-24-0125 2022-01-25 16:56:52 +00:00
Pedro Beschorner Marin
810deb907b refactor(etherpad): access control et al.
Move all Etherpad's access control from Meteor to a separated [Node application](https://github.com/bigbluebutton/bbb-pads).
This new app uses [Etherpad's API](https://etherpad.org/doc/v1.8.4/#index_overview)
to create groups and manage session tokens for users to access them. Each group
represents one distinct pad at the html5 client.

- Removed locked users' access to pads: replaced readOnly pad's access with a new pad's content sharing routine
- Pad's access is now controlled by [Etherpad's API](https://etherpad.org/doc/v1.8.4/#index_overview)
- Closed captions edited content now reflects at it's live feedback
- Improved closed caption's dictation mode live feedback
- Moved all Etherpad's API control from Meteor to a separated [app](https://github.com/bigbluebutton/bbb-pads)
- Included access control both in akka-apps and bbb-pads
2022-01-21 16:56:01 -03:00
Anton Georgiev
e463993d01
Merge pull request #9837 from hiroshisuga/fix-thumbnails
fix(recording): Generate thumbnails from uploaded file
2022-01-20 13:39:38 -05:00
Fred Dixon
5743b29eba
Merge pull request #11805 from sebastianberm/patch-2
Updated usage section of analytics script to match actual syntax
2022-01-03 16:38:19 -04:00
Daniel Petri Rocha
4328222c82 Merge with fill shape fix 2021-12-16 13:01:26 +01:00
Anton Georgiev
797fc49633 TEMP 2021-12-09 20:37:05 +00:00
Daniel Petri Rocha
869f289290 Update README instructions to setup a recording development environment 2021-12-05 15:37:47 +01:00
Felipe Cecagno
b313c7deeb refactor(record-and-playback): replace trollop by optimist 2021-11-23 23:59:59 -03:00
Felipe Cecagno
2a4cc7b62e chore(record-and-playback): update nokogiri from 1.11.0 to 1.12.5 2021-11-23 23:59:07 -03:00
Daniel Petri Rocha
3cd16ff7a3 XPATH query optimization: replace // 2021-11-16 00:56:16 +01:00
Daniel Petri Rocha
9be8e9b897 Remove temp dir from deskshare and webcam processing 2021-11-16 00:54:58 +01:00
Joao Siebel
7a118ed3b8 Remove unused properties from chat message event record. close #11696 2021-10-25 14:46:59 -03:00
Calvin Walton
3c1a9cd7c4 RAP: Use "asetpts=N" in ffmpeg audio processing
There's an issue sometimes where when processing the audio from a
desktop sharing file, the STARTPTS value is invalid somehow, and this
results in bad timestamps in the output stream. Depending on the
selected codec/container combination, this might result in errors such
as spam of the message:

Application provided invalid, non monotonically increasing dts to muxer in stream

or simply a hang during processing.

Since we're already using aresample in async mode to correct timestamp
gaps, we can use "asetpts=N" here to simply set the audio frame pts
values to the sample number directly, giving proper monotonic timestamps
with no gaps.
2021-10-21 11:23:09 -04:00
prlanzarin
fbe1610e1c chore(recording): track mediasoup raw media files locations
I was going to resort to some trickery to make mediasoup raw files end up in the
same directory as KMS to reduce changes, but it ended up being too dirty.
I am adding a third directory (/var/mediasoup) to be tracked by the rap scripts
which is where the new raw files end up in.
2021-10-04 17:33:18 +00:00
Calvin Walton
1654f26084 recording: Anonymize names in chat
Move the handling of chat events into the shared library so it can be
used by multiple recording formats.

The anonymization of names is based on the external user id, if
available, so users have a consistent name through the meeting. Note
that no effort is made to edit chat messages - if someone is mentioned
by name in a chat message, that will still be visible.

Default settings for anonymization can be controlled in
bigbluebutton.yml, and per-meeting overrides can be done using meta
parameters on the create call.
2021-09-02 15:02:27 -04:00
Anton Georgiev
4ecb24b4fa Merge branch 'v2.3.x-release' of github.com:bigbluebutton/bigbluebutton into merge-aug30 2021-08-30 18:11:16 +00:00
Calvin Walton
93422b5f21 Move ffmpeg '-an' and '-vn' options out of the working format args
Disabling audio or video processing isn't really something that's part
of the working format (and at some point we might want to combine
audio+video processing together).

Move the setting of the '-an' and '-vn' options to where they're
required - as a detail of the EDL processing for video-only and
audio-only components of the output.

Honestly, the main reason for this change is that when testing alternate
working formats, I had accidentally dropped the '-vn' option from the
FFMPEG_WF_ARGS variable without noticing.
2021-08-26 11:20:52 -04:00
Calvin Walton
02d5fe14a6 Don't re-parse the events xml for the has_screenshare_audio check 2021-08-19 10:58:04 -04:00
Mikhail Novosyolov
340b0771e5 Avoid race condition between redis and bbb-rap-resque-worker
Redis must be started before bbb-rap-resque-worker.service which will connect to Redis
2021-08-19 02:37:20 +03:00
germanocaumo
4392b0d462 feat(recording): process published external videos
Generate a external_videos.json file at the recordings with an array of
played external videos url and timestamp.

This file will be published along with the other presentation format files
and can be used to display at the playback.
2021-07-07 13:26:24 +00:00
Pedro Beschorner Marin
41daeca1a2 refactor(recording): callback url getter 2021-05-29 16:52:07 -03:00
Pedro Beschorner Marin
63dca7506e fix(recording): recording ready callback
Fetch for server's security salt at etc's bbb-web properties file.
2021-05-29 16:51:56 -03:00
Pedro Beschorner Marin
3b83bddd86 feat(events): store etherpad events file 2021-05-04 13:06:12 -03:00
Pedro Beschorner Marin
83b48d5ee8 fix(events): keep events using resque workflow 2021-05-04 13:01:32 -03:00
Calvin Walton
9f5832a5d3 Recording: bbb-record --rebuild restarts processing at the sanity step
Previously, bbb-record --rebuild was restarting recording processing
from scratch by creating the .../recording/<meeting_id>.done file. This
causes the recording to be reprocessed starting at the archive step.
However, re-running the archive step for an existing meeting is not
really supported! Ever since the segmented recording code was added, it
shouldn't /corrupt/ the recording files, but it's still not good.

And as a side-effect, re-running the archive step will re-create the
.norecord file for meetings without recording marks, meaning that you
cannot use bbb-record --rebuild to force a recording without marks to be
processed.

Switch bbb-record to restart recording processing at the sanity stage to
match the BBB 2.2 behaviour. Rather than have it insert tasks directly
into resque via redis-cli, it goes through a ruby wrapper that performs
input validation and uses the resque apis.
2021-04-29 11:10:32 -04:00
Calvin Walton
8098b6b3ad Recording: Halt processing after archive step for non-recorded meetings
In the case where a meeting had recording enabled (record=true on create
call) but the presenter did not start recording during the meeting,
recording processing needs to be stopped after the meeting data is
archived, but before the recording formats are processed.

In the current 2.3 code, processing is halted after the "sanity" step.
However, the 2.2 code stopped processing after the "archive" step
instead. The main difference is that the scripts in the "post_archive"
directory (which are actually post_sanity scripts) did not get run on
non-recorded meetings for 2.2. This behaviour should be preserved for
compatibility.

I have added a special exception to trigger halting processing for a
recording job without causing the entire resque job to be marked as
failed. It only causes the `schedule_next_step` method to be skipped, so
following jobs won't get automatically run. This fixes #11877
2021-04-28 15:53:20 -04:00
Calvin Walton
9e7cecb033 Split the EDL recording marks generation out to a helper function
This function is useful any place you want the matched recording marks
with timestamps rebased so 0 is the start of the meeting, I've used it
for chat analysis, for example.

There is no functional change here, it only exposes the extra function
for recording scripts or dropin/post scripts to use.
2021-04-14 13:40:01 -04:00
Sebastian Berm
90f65edef1
Updated usage
Updated usage as this was still copypasted from the other file (post_events.rb), while this is technically not correct.
2021-03-30 14:15:56 +02:00
Richard Alam
55a416050c - store status when recording has no start/stop marks 2021-03-26 13:39:27 -07:00
Richard Alam
77b105aea2 Track recording process status
- store recording process status into a redis list. This option
   needs to be enabled in bigbluebutton.yml
2021-03-25 12:25:30 -07:00
Richard Alam
54f4d43bea Merge branch 'develop' of github.com:bigbluebutton/bigbluebutton into keep-recording-status-files 2021-03-25 12:14:36 -07:00
germanocaumo
951700502d Recording: Ignore video in audio processing scripts (fix error with screenshare input) 2021-03-25 16:30:32 +00:00
Calvin Walton
331c63adec Don't print audio info for corrupt audio files
Fixes a crash: undefined method `[]' for nil:NilClass
that happens when a corrupt audio file is hit.
2021-03-24 17:02:47 -04:00
Anton Georgiev
a950c9af53
Merge pull request #11626 from prlanzarin/u23-recsa
screenshare: add rap processing for screen streams with audio (complements #11622)
2021-03-24 14:36:31 -04:00
germanocaumo
ea375d6c5e remove trailing whitespaces 2021-03-24 14:01:17 -03:00
germanocaumo
35104fba47 number of inputs for amix command, remove old java deskshare events 2021-03-24 13:35:00 -03:00
Pedro Beschorner Marin
0c4cf0135d Handle pad's events and Meteor's instances
Since Meteor was split in multiple process and events started to be
filtered by instances, all Etherpad's Redis events were being discarded.

Etherpad has a Redis' publisher plugin that is unaware of BigBlueButton's
existence. All the communication between them is kept simple with minimal
of internal data exchange. The concept of distincts subscribers at Meteor's
side broke part of this simplicity and, now, Etherpad has to know which
instance must receive it's messages. To provide such information I decided
to include Meteor's instance as part of the pad's id. Should look like:

 - [instanceId]padId for the shared notes
 - [instanceId]padId_cc_(locale) for the closed captions

With those changes the pad id generation made at the recording scripts had to
be re-done because there is no instance id available. Pad id is now recorded at
akka-apps and queried while archiving the shared notes.
2021-03-23 18:03:50 -03:00
Mario Jr
af4f9dbf26 Merge branch 'v2.2.x-release' into merge-2.2-develop 2021-03-23 17:10:28 -03:00
germanocaumo
136f43eb25 Remove screenshare audio specific ffmpeg codec in recording processing. 2021-03-23 14:49:39 -03:00
germanocaumo
95fabfe8c2 Merge branch 'develop' of https://github.com/bigbluebutton/bigbluebutton into u23-recsa 2021-03-23 14:47:20 -03:00
Pedro Beschorner Marin
e48f64b843 Avoid localhost at notes endpoint
Use 127.0.0.1 instead of localhost since Etherpad only listens for ipv4.
2021-03-22 16:41:26 -03:00
Richard Alam
7d95fd9189 Keep recording status files
We still use the recording status files to externally monitor the
 progress of the recordings. Let's keep these files for now until
 we figure out a different way to track the status of the recording.
2021-03-22 09:24:02 -07:00
Fred Dixon
3fdb60ffef
Merge pull request #11685 from kepstin/slide-gen-interpolate
Recording: Don't use string interpolation when generating commands for slide conversion
2021-03-18 17:40:04 -03:00
Calvin Walton
7fab16b2ca Recording: Don't use string interpolation generating commands for slide conversion
Just want to make sure that we don't get any bad filenames sneaking in
and causing havoc.
2021-03-18 11:51:40 -04:00
Calvin Walton
0559152dc7 Improvements for audio desync issues
This incorporates only the audio desync related changes from #11626
* Add the aresample filter with async option to fill in timestamp gaps
* Use the libopus decoder for opus audio instead of ffmpeg's builtin
  decoder
2021-03-18 11:18:39 -04:00
Calvin Walton
2a6b0b62c3 Rework the ffmpeg filter generation in the audio rendering.
This gives the following advantages over the previous code:

* The ffmpeg input filters are loaded from a filter "script" file instead
  of passed on the command line. This fixes some cases of recordings
  failing to process because the ffmpeg command line generated for the
  audio processing exceeded the max command line length limit. (Although
  that only really happens due to BBB bugs...)
* Use absolute positions when trimming audio segments for cuts.
  Previously segments were trimmed to the length of the segment, and the
  results were concatenated. There's some possibility of accumulated
  errors in the segment lengths causing audio desync over time. The new
  code incrementally concatenates the segments, and cuts each segment
  end based on the absolute time since the start of the meeting, to
  avoid error accumulation.
2021-03-18 11:17:50 -04:00
germanocaumo
409e3cbc27 read screenshare audio from archived dir insteaf of original path 2021-03-11 21:40:19 +00:00
germanocaumo
5b07244e1e Fix last commit 2021-03-11 21:38:59 +00:00
germanocaumo
4928ca91d1 Mix screenshare audio with mics again to avoid playback autoplay problems in iOS, fixed desync with aresample 2021-03-11 21:36:40 +00:00
germanocaumo
fdbbffb3aa Improve screenshare audio recording sync:
use libopus decoder and encoder, its better than built-in ffmpeg/flac
don't mix screenshare audio with mics, was generating desync with bad audio segments, encode it together with video file (TODO: needs adjustments in playback)
2021-03-11 21:32:02 +00:00
germanocaumo
0d48dd01cb Re-add screenshare audio recording processing 2021-03-11 21:09:07 +00:00
Andrei Bautu
18b3fc2684 Remove unused ffmpeg settings 2021-03-10 13:10:54 +02:00
Andrei Bautu
8cc99ef4ab Include comments about ffmpeg settings 2021-03-10 12:58:59 +02:00
Andrei Bautu
d71df37b8a Fix detection of empty video segments 2021-03-10 11:40:18 +02:00
Andrei Bautu
beb66512a0 Recording processing using MP4/OGG temporary files, stream copy, and customizable (lower) frame rates.
Discussion from https://github.com/bigbluebutton/bigbluebutton/issues/2483
2021-03-08 20:14:48 +02:00
Anton Georgiev
228bad03d5 Merge branch 'v2.2.x-release' of github.com:bigbluebutton/bigbluebutton into march4-merge 2021-03-04 21:25:47 +00:00
Calvin Walton
48956ce63f Add some extra docs/setup instructions to the analytics callback script 2021-03-02 16:19:26 -05:00
Pedro Beschorner Marin
c0a7f9cd92 Replace FNV32a pad's id generator with salted SHA1
When managing Etherpad's pads, Meteor makes API calls to initiate the closed captions
and shared notes modules. The pad id was being mapped to a shorter id than the meeting
id because of a Etherpad lenght limitation.

Changed to something less guessable.
2021-02-09 12:59:59 -03:00
dependabot[bot]
db55b0c4eb
Bump nokogiri from 1.10.8 to 1.11.0 in /record-and-playback/core
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.10.8 to 1.11.0.
- [Release notes](https://github.com/sparklemotion/nokogiri/releases)
- [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.10.8...v1.11.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-02-09 00:28:29 +00:00
Fred Dixon
e08ff14c52
Update events_worker.rb
Fix file existence test.
2020-12-20 18:38:18 -04:00
Jesus Federico
163d40652a
Update post_events_analytics_callback.rb 2020-12-10 17:23:01 -05:00
Fred Dixon
00bf08eea7 Fix permissions on systemd scripts for recording processing 2020-12-06 15:40:00 -06:00
Anton Georgiev
0c7ead1916 Merge branch 'v2.2.x-release' of github.com:bigbluebutton/bigbluebutton into oct16-merge 2020-10-21 14:48:02 +00:00
Calvin Walton
1866eb7194 Perform captions generation in UTF-16 encoding
The indexes returned in recording events from BBB refer to positions
within a UTF-16 encoded string. Rather than attempt to untangle this in
the server (which might have a performance cost), it's easier to switch
the caption processing code to operate in UTF-16 encoding as well to
make it work consistently.

The PyICU library provides a UnicodeString type which is a UTF-16 string
similar to Java and JavaScript, but which supports all the python
indexing methods. It's fairly straightforwards to swap it in in place of
the types used previously, and works natively as an input to the ICU
line break iterator too.

Fixes #10531
2020-09-25 12:39:18 -04:00
Calvin Walton
1268753519 Fix io deadlock in recording scripts process execution utilities
The previous implementation of the BigBlueButton.execute method runs the
process with separate stdout and stderr streams. It first reads all of
the output from stdout, then reads all of the output from stderr.

This can cause a deadlock if the process writes a lot of data to stderr.
The IO buffer for stderr could fill, blocking progress. But since it
hasn't closed stdout, the ruby script is still waiting on a read to
stdout.

Switch to an execution method (using IO.popen) that allows combining
stdout and stderr into a single stream, eliminating the issue.
2020-09-23 16:16:57 -04:00
hiroshisuga
5caf825d42
Update rap-starter.rb
probably a simple typo
2020-09-01 22:05:37 +09:00
Anton Georgiev
f9d1079b41
Merge pull request #10238 from kepstin/rec-fixes-develop
Events archiver: Strip more invalid characters
2020-08-25 08:36:20 -04:00
hiroshisuga
3cbe9abaf0 events_archiver.rb: Handle an empty meeting_metadata hash from redis
On my server 2.3 alpha, the method metadata_for(meeting_id) gives back {}
(empty Hash). Thus "return if meeting_metadata.nil?" does not occur.

Does @redis.hgetall give {} instead of nil, even though there is a comment in
node_modules/redis/lib/utils.js "hgetall converts its replies to an Object. If
the reply is empty, null is returned"???
2020-08-13 15:46:40 -04:00
hiroshisuga
dc0fc459e2 events_archiver.rb: Handle an empty meeting_metadata hash from redis
On my server 2.3 alpha, the method metadata_for(meeting_id) gives back {}
(empty Hash). Thus "return if meeting_metadata.nil?" does not occur.

Does @redis.hgetall give {} instead of nil, even though there is a comment in
node_modules/redis/lib/utils.js "hgetall converts its replies to an Object. If
the reply is empty, null is returned"???
2020-08-13 15:42:22 -04:00
Calvin Walton
659893051d Events archiver: Strip more invalid characters
Update the list of invalid characters based on what the XML
specification permits and discourages.

Use the ruby string `scrub` method to remove invalid characters that
can't be expressed in the `tr` syntax, like unpaired surrogates and
UTF-8 prefix bytes.
2020-08-11 14:15:29 -04:00
Jesus Federico
0bbe69b74d
added post_events scripts (example and analytics callback) (#10080)
* added post_events example and analytics callback

* updated dependency
2020-07-17 14:34:57 -04:00
Anton Georgiev
b0e1dc8378 Merge branch 'v2.2.x-release' of github.com:bigbluebutton/bigbluebutton into merge-2.2-into-2.3-july-6 2020-07-07 14:35:34 +00:00
Anton Georgiev
420f8bf0a4 Merge branch 'develop' of github.com:bigbluebutton/bigbluebutton into merge-2.2-into-2.3-july-6 2020-07-07 14:13:58 +00:00
Pedro Beschorner Marin
44fc68c07c Skip recording process step for norecord meetings 2020-07-01 12:33:41 -03:00
Pedro Beschorner Marin
526f79e8f2 Merge remote-tracking branch 'bigbluebutton/v2.2.x-release' into bigbluebutton/develop 2020-06-30 18:15:18 -03:00
dependabot[bot]
151de8f375
Bump rack from 2.1.1 to 2.2.3 in /record-and-playback/core
Bumps [rack](https://github.com/rack/rack) from 2.1.1 to 2.2.3.
- [Release notes](https://github.com/rack/rack/releases)
- [Changelog](https://github.com/rack/rack/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rack/rack/compare/2.1.1...2.2.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-06-26 01:19:32 +00:00
Calvin Walton
26f5450245 Fix removing reconnect indicator from usernames when counting participants 2020-06-24 11:23:59 -04:00
mw781
f60059c983 Ensure that files are handled safely 2 2020-06-17 11:13:07 +01:00
mw781
fea0ff3204 Ensure that files are handled safely
This commit fixes an issue with reading and writing files.
File.open is used which means that a file will remain open
unless explicilty closed or the program exit. This doesn't work
for an NFS mount as the scripts try to "rm -rf" when the file
is still open. This commit fixes that by replacing all .opens
with .reads
2020-06-17 11:09:09 +01:00
Joao Siebel
3e95ed0e4b Merge remote-tracking branch 'upstream/v2.2.x-release' into merge-2.2 2020-06-16 16:40:56 -03:00
hiroshisuga
024afe3d01
Bug? "default.pdf" never occurrs
The "originalFilename" tag is not present in "SharePresentationEvent", and thus presentation_filename would never be "default.pdf". As a consequence, the thumbnails are always generated from the default.pdf.
2020-06-14 17:35:26 +09:00
Felipe Cecagno
fc95e052a6 Sort sanity files so it processes older recordings first 2020-05-23 01:28:43 -03:00
Anton Georgiev
cc79c4b6ae merge 2.2.10 into 2.3 2020-05-05 19:52:44 +00:00
Pedro Beschorner Marin
d97f413ef6 Fix note id 2020-04-29 13:08:10 -03:00
Pedro Beschorner Marin
beda54fb09 Included Etherpad's data as events to be stored 2020-04-27 10:48:52 -03:00
Richard Alam
5bd5c03fde
Merge pull request #8950 from kepstin/archive-clean-meta
Strip control characters from user-provided metadata in events file
2020-04-01 13:32:02 -04:00
Calvin Walton
20b150e86b Strip control characters from user-provided metadata in events file 2020-04-01 13:21:54 -04:00
Calvin Walton
a5a46b2c0a Have the recording archive delete originals of archived media
After the last segment of a recording has been archived, it is safe to
delete the original files that were recorded by the various media
handling components. This patch deletes the freeswitch audio files and
kurento webcam/screenshare files after they have been archived.

It needs to be used in combination with some changes to users/groups and
directory permissions to allow the `bigbluebutton` user to delete files
that it could previously only read.
2020-03-27 15:22:53 -04:00
dependabot[bot]
ba91d99e7a
Bump nokogiri from 1.10.7 to 1.10.8 in /record-and-playback/core
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.10.7 to 1.10.8.
- [Release notes](https://github.com/sparklemotion/nokogiri/releases)
- [Changelog](https://github.com/sparklemotion/nokogiri/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.10.7...v1.10.8)

Signed-off-by: dependabot[bot] <support@github.com>
2020-03-03 03:01:48 +00:00
Fred Dixon
8777c2c9dc Bump dependency for nokogiri version 2020-02-29 08:56:33 -06:00
Leonardo Crauss Daronco
5bc3062d58 Fix the paths to the ruby scripts on the rap workers
Was pointing to the wrong directory when loading the ruby scripts. Also
made the directory easier to configure, it's all in a single place now.
2020-02-06 10:43:32 -03:00
Calvin Walton
9f9e2a0c47 rap: Fix require paths in Rakefile
I moved the location of the worker classes around, but forgot to update
the Rakefile to include them from the new location.
2020-01-28 12:43:28 -05:00
Calvin Walton
1a88830a27 RaP: Fix done filenames for segmented recordings
The done filenames all have to contain the break_timestamp to identify
the segment
2020-01-21 17:21:50 -05:00
Calvin Walton
c52a67186e RaP: Clean up resque worker code, add worker for keep_events feature
I've moved the workers code into the `lib` subdirectory with other library-ish
code; this puts it into the ruby load path used by most scripts so referencing
files is easier.

I've applied various style cleanups based on the rubocop config present.

The `events` processing step has been integrated as a new worker `EventsWorker`,
there is no longer a separate `events/events.rb` script. I've reworked the
`rap-starter.rb` script to check for the done files in both the events and
recorded status directories.
2020-01-21 17:14:39 -05:00
Calvin Walton
bc1b53f037 Update gems for record-and-playback 2020-01-21 17:13:16 -05:00
Calvin Walton
6e7f133f1f rap: add missing install sections to systemd service files 2020-01-21 12:23:47 -05:00
Fred Dixon
aa1eb7b258 Bump version of Rack 2020-01-19 08:20:23 -06:00
Calvin Walton
aee7baa76b Merge branch 'v2.0-rap-on-resque' of github.com:daronco/bigbluebutton 2020-01-17 17:40:08 -05:00
Calvin Walton
9907588b5e presentation recording: generate poll svg images without gnuplot
Write a tool that generates the poll svg images directly from the
BBB poll description. This avoids the issues with special characters
in the gnuplot labels, and gives us a lot more flexibility in how
the polls are formatted and styled.
2020-01-13 14:34:30 -05:00