From b52c705d68fb49e16febc296d0cf5e1e0d599e4a Mon Sep 17 00:00:00 2001 From: prlanzarin <prlanzarin@inf.ufrgs.br> Date: Thu, 26 Jul 2018 20:08:50 +0000 Subject: [PATCH] Refactored SFU recording path handling and fixed WebRTC screenshare recordings --- labs/bbb-webrtc-sfu/lib/base/BaseProvider.js | 9 ++++++++ .../lib/mcs-core/lib/media/MCSApiStub.js | 6 ++--- .../lib/mcs-core/lib/media/MediaController.js | 4 ++-- .../mcs-core/lib/model/RecordingSession.js | 23 +++---------------- .../lib/mcs-core/lib/model/SfuUser.js | 4 ++-- .../lib/screenshare/screenshare.js | 4 +++- labs/bbb-webrtc-sfu/lib/video/video.js | 6 ++++- 7 files changed, 27 insertions(+), 29 deletions(-) diff --git a/labs/bbb-webrtc-sfu/lib/base/BaseProvider.js b/labs/bbb-webrtc-sfu/lib/base/BaseProvider.js index 45dcfe1c33..0d7bf23b3a 100644 --- a/labs/bbb-webrtc-sfu/lib/base/BaseProvider.js +++ b/labs/bbb-webrtc-sfu/lib/base/BaseProvider.js @@ -4,6 +4,7 @@ const C = require('../bbb/messages/Constants'); const Logger = require('../utils/Logger'); const EventEmitter = require('events').EventEmitter; const errors = require('../base/errors'); +const config = require('config'); module.exports = class BaseProvider extends EventEmitter { constructor () { @@ -53,4 +54,12 @@ module.exports = class BaseProvider extends EventEmitter { } = error; return type && id && role && streamId && code && reason; } + + getRecordingPath (room, subPath, recordingName) { + const format = config.get('recordingFormat'); + const basePath = config.get('recordingBasePath'); + const timestamp = (new Date()).getTime(); + + return `${basePath}/${subPath}/${room}/${recordingName}-${timestamp}.${format}` + } }; diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MCSApiStub.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MCSApiStub.js index c6b48ebdd6..1c3d5befea 100644 --- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MCSApiStub.js +++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MCSApiStub.js @@ -92,13 +92,13 @@ module.exports = class MCSApiStub extends EventEmitter { } } - async startRecording(userId, mediaId, recordingName) { + async startRecording(userId, mediaId, recordingPath) { try { - const answer = await this._mediaController.startRecording(userId, mediaId, recordingName); + const answer = await this._mediaController.startRecording(userId, mediaId, recordingPath); return (answer); } catch (error) { - throw (this._handleError(error, 'startRecording', { userId, mediaId, recordingName })); + throw (this._handleError(error, 'startRecording', { userId, mediaId, recordingPath})); } } diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js index 70bc2c61fb..32db2a5107 100644 --- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js +++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js @@ -215,13 +215,13 @@ module.exports = class MediaController { } } - async startRecording (userId, sourceId, recordingName) { + async startRecording (userId, sourceId, recordingPath) { Logger.info("[mcs-controller] startRecording ", sourceId); try { const user = await this.getUserMCS(userId); const sourceSession = this.getMediaSession(sourceId); - const session = await user.addRecording(recordingName); + const session = await user.addRecording(recordingPath); const answer = await user.startSession(session.id); await sourceSession.connect(session._mediaElement); diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/RecordingSession.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/RecordingSession.js index a9bea76d37..b358f70ec0 100644 --- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/RecordingSession.js +++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/RecordingSession.js @@ -9,9 +9,9 @@ const config = require('config'); const MediaSession = require('./MediaSession'); module.exports = class RecordingSession extends MediaSession { - constructor(emitter, room, recordingName) { - let uri = RecordingSession.getRecordingPath(room, 'medium', recordingName); - let options = { + constructor(emitter, room, recordingPath) { + const uri = recordingPath; + const options = { mediaProfile: config.get('recordingMediaProfile'), uri: uri, stopOnEndOfStream: true @@ -21,23 +21,6 @@ module.exports = class RecordingSession extends MediaSession { this.filename = uri; } - static getRecordingPath (room, profile, recordingName) { - const format = config.get('recordingFormat'); - const basePath = config.get('recordingBasePath'); - const timestamp = (new Date()).getTime(); - - let isScreenshare = (name) => { - return name.match(/^[0-9]+-SCREENSHARE$/); - }; - - if (isScreenshare(recordingName)) { - return `${basePath}/screenshare/${room}/${recordingName}-${timestamp}.${format}` - } else { - return `${basePath}/recordings/${room}/${profile}-${recordingName}-${timestamp}.${format}`; - } - - } - async process () { const answer = await this._MediaServer.startRecording(this._mediaElement); return Promise.resolve({ recordingId: this.id, filename: this.filename, meetingId: this.room }); diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/SfuUser.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/SfuUser.js index a7f4dda513..afade7f933 100644 --- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/SfuUser.js +++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/SfuUser.js @@ -66,8 +66,8 @@ module.exports = class SfuUser extends User { return session; } - addRecording (recordingName) { - const session = new RecordingSession(this.emitter, this.roomId, recordingName); + addRecording (recordingPath) { + const session = new RecordingSession(this.emitter, this.roomId, recordingPath); this.emitter.emit(C.EVENT.NEW_SESSION+this.id, session.id); session.emitter.once(C.EVENT.MEDIA_SESSION_STOPPED, (sessId) => { diff --git a/labs/bbb-webrtc-sfu/lib/screenshare/screenshare.js b/labs/bbb-webrtc-sfu/lib/screenshare/screenshare.js index f9e71e626d..f2eaa8cc95 100644 --- a/labs/bbb-webrtc-sfu/lib/screenshare/screenshare.js +++ b/labs/bbb-webrtc-sfu/lib/screenshare/screenshare.js @@ -53,6 +53,7 @@ module.exports = class Screenshare extends BaseProvider { this._rtmpBroadcastStarted = false; this.recording = {}; this.isRecorded = false; + this._recordingSubPath = 'screenshare'; this._BigBlueButtonGW.on(C.RECORDING_STATUS_REPLY_MESSAGE_2x+meetingId, (payload) => { Logger.info("[Screenshare] RecordingStatusReply ", payload.recorded); @@ -192,7 +193,8 @@ module.exports = class Screenshare extends BaseProvider { async startRecording() { return new Promise(async (resolve, reject) => { try { - this.recording = await this.mcs.startRecording(this.mcsUserId, this._presenterEndpoint, this._voiceBridge); + const recordingPath = this.getRecordingPath(this._meetingId, this._recordingSubPath, this._voiceBridge); + this.recording = await this.mcs.startRecording(this.mcsUserId, this._presenterEndpoint, recordingPath); this.mcs.on('MediaEvent' + this.recording.recordingId, this.recordingState.bind(this)); this.sendStartShareEvent(); resolve(this.recording); diff --git a/labs/bbb-webrtc-sfu/lib/video/video.js b/labs/bbb-webrtc-sfu/lib/video/video.js index 21ee09befb..9250d86d90 100644 --- a/labs/bbb-webrtc-sfu/lib/video/video.js +++ b/labs/bbb-webrtc-sfu/lib/video/video.js @@ -31,6 +31,8 @@ module.exports = class Video extends BaseProvider { this.status = C.MEDIA_STOPPED; this.recording = {}; this.isRecorded = false; + this._recordingSubPath = 'recordings'; + this._cameraProfile = 'medium'; this.candidatesQueue = []; this.notFlowingTimeout = null; @@ -197,7 +199,9 @@ module.exports = class Video extends BaseProvider { async startRecording() { return new Promise(async (resolve, reject) => { try { - this.recording = await this.mcs.startRecording(this.userId, this.mediaId, this.id); + const recordingName = this._cameraProfile + '-' + this.id; + const recordingPath = this.getRecordingPath(this.meetingId, this._recordingSubPath, recordingName); + this.recording = await this.mcs.startRecording(this.userId, this.mediaId, recordingPath); this.mcs.on('MediaEvent' + this.recording.recordingId, this.recordingState.bind(this)); this.sendStartShareEvent(); resolve(this.recording); -- GitLab