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