From c92bfbb591b60db1d198d1f214219ffdc618bcba Mon Sep 17 00:00:00 2001
From: Richard Alam <ritzalam@gmail.com>
Date: Tue, 4 Jun 2019 10:56:40 -0700
Subject: [PATCH]  - deploy recording scripts in proper location  - log upload
 captions params

---
 .../org/bigbluebutton/api/MeetingService.java | 15 ++++
 bigbluebutton-web/build.gradle                |  3 +
 .../controllers/RecordingController.groovy    | 28 +++++---
 record-and-playback/deploy.sh                 | 69 +++++++++++++++----
 4 files changed, 94 insertions(+), 21 deletions(-)

diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java
index 6ed1a8de06..4cfa808e38 100755
--- a/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java
@@ -410,6 +410,21 @@ public class MeetingService implements MessageListener {
   public String putRecordingTextTrack(String recordId, String kind, String lang, File file, String label,
           String origFilename, String trackId, String contentType, String tempFilename) {
 
+    Map<String, Object> logData = new HashMap<>();
+    logData.put("recordId", recordId);
+    logData.put("kind", kind);
+    logData.put("lang", lang);
+    logData.put("label", label);
+    logData.put("origFilename", origFilename);
+    logData.put("contentType", contentType);
+    logData.put("tempFilename", tempFilename);
+    logData.put("logCode", "recording_captions_uploaded");
+    logData.put("description", "Captions for recording uploaded.");
+
+    Gson gson = new Gson();
+    String logStr = gson.toJson(logData);
+    log.info(" --analytics-- data={}", logStr);
+
       UploadedTrack track = new UploadedTrack(recordId, kind, lang, label, origFilename, file, trackId,
               getCaptionTrackInboxDir(), contentType, tempFilename);
       return recordingService.putRecordingTextTrack(track);
diff --git a/bigbluebutton-web/build.gradle b/bigbluebutton-web/build.gradle
index 03b25c8d1b..5dfb4f6434 100755
--- a/bigbluebutton-web/build.gradle
+++ b/bigbluebutton-web/build.gradle
@@ -84,6 +84,9 @@ dependencies {
   compile "org.libreoffice:ridl:5.4.2"
   compile "org.libreoffice:juh:5.4.2"
   compile "org.libreoffice:jurt:5.4.2"
+  // https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
+  compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.4'
+
   //--- BigBlueButton Dependencies End
   console "org.grails:grails-console"
   profile "org.grails.profiles:web"
diff --git a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/RecordingController.groovy b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/RecordingController.groovy
index 546b1de23a..51ccee962c 100755
--- a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/RecordingController.groovy
+++ b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/RecordingController.groovy
@@ -9,7 +9,7 @@ import org.bigbluebutton.api.ApiErrors
 import org.bigbluebutton.api.ApiParams
 import org.apache.commons.lang3.StringUtils
 import org.json.JSONArray
-
+import org.springframework.web.multipart.commons.CommonsMultipartFile
 
 class RecordingController {
   private static final String CONTROLLER_NAME = 'RecordingController'
@@ -108,6 +108,8 @@ class RecordingController {
     }
 
     String recordId = StringUtils.strip(params.recordID)
+    log.debug("Captions for recordID: " + recordId)
+
 
     if (!paramsProcessorUtil.isChecksumSame(API_CALL, params.checksum, request.getQueryString())) {
       invalid("checksumError", "You did not pass the checksum security check")
@@ -127,22 +129,28 @@ class RecordingController {
     }
 
     String captionsKind = StringUtils.strip(params.kind)
+    log.debug("Captions kind: " + captionsKind)
+
     def isAllowedKind = captionsKind in ['subtitles', 'captions']
     if (!isAllowedKind) {
       respondWithError("invalidKind", "Invalid kind parameter, expected='subtitles|captions' actual=" + captionsKind)
       return
     }
-
-    Locale locale;
+    
+    Locale locale
     if (StringUtils.isEmpty(params.lang)) {
       respondWithError("paramError", "Missing param lang.")
       return
     }
 
     String paramsLang = StringUtils.strip(params.lang)
+    log.debug("Captions lang: " + paramsLang)
+
+    Locale paramLocale = Locale.forLanguageTag(paramsLang)
+    log.debug("Captions locale: " + paramLocale.toString())
 
     Collection<Locale> locales = new ArrayList<>()
-    locales.add(Locale.forLanguageTag(paramsLang))
+    locales.add(paramLocale)
     try {
       List<Locale.LanguageRange> languageRanges = Locale.LanguageRange.parse(paramsLang)
       locale = Locale.lookup(languageRanges, locales)
@@ -155,10 +163,8 @@ class RecordingController {
       return
     }
 
-    String contentType = request.getContentType()
-
     String captionsLang = locale.toString()
-    String captionsLabel = captionsLang
+    String captionsLabel = paramLocale.getDisplayLanguage()
 
     if (!StringUtils.isEmpty(params.label)) {
       captionsLabel = StringUtils.strip(params.label)
@@ -166,6 +172,12 @@ class RecordingController {
 
     def uploadedCaptionsFile = request.getFile('file')
     if (uploadedCaptionsFile && !uploadedCaptionsFile.empty) {
+      CommonsMultipartFile contentType = uploadedCaptionsFile.contentType
+      def fileContentType = null
+      if (contentType != null) {
+        fileContentType = contentType.getContentType()
+      }
+      log.debug("Captions content type: " + fileContentType)
       def origFilename = uploadedCaptionsFile.getOriginalFilename()
       def trackId = recordId + "-" + System.currentTimeMillis()
       def tempFilename = trackId + "-track.txt"
@@ -175,7 +187,7 @@ class RecordingController {
       uploadedCaptionsFile.transferTo(captionsFile)
 
       String result = meetingService.putRecordingTextTrack(recordId, captionsKind,
-          captionsLang, captionsFile, captionsLabel, origFilename, trackId, contentType, tempFilename)
+          captionsLang, captionsFile, captionsLabel, origFilename, trackId, fileContentType, tempFilename)
 
       response.addHeader("Cache-Control", "no-cache")
       withFormat {
diff --git a/record-and-playback/deploy.sh b/record-and-playback/deploy.sh
index ba7a0e00f8..a29d8c9d1a 100755
--- a/record-and-playback/deploy.sh
+++ b/record-and-playback/deploy.sh
@@ -40,22 +40,65 @@ function deploy_format() {
 
 deploy_format "presentation"
 
-sudo mkdir -p /var/bigbluebutton/captions/
-sudo mkdir -p /var/bigbluebutton/events/
-sudo mkdir -p /var/bigbluebutton/playback/
-sudo mkdir -p /var/bigbluebutton/recording/raw/
-sudo mkdir -p /var/bigbluebutton/recording/process/
-sudo mkdir -p /var/bigbluebutton/recording/publish/
-sudo mkdir -p /var/bigbluebutton/recording/status/ended/
-sudo mkdir -p /var/bigbluebutton/recording/status/recorded/
-sudo mkdir -p /var/bigbluebutton/recording/status/archived/
-sudo mkdir -p /var/bigbluebutton/recording/status/processed/
-sudo mkdir -p /var/bigbluebutton/recording/status/sanity/
+CAPTIONS_DIR=/var/bigbluebutton/captions/
+if [ ! -d "$CAPTIONS_DIR" ]; then
+  sudo mkdir -p $CAPTIONS_DIR
+fi
+
+EVENTS_DIR=/var/bigbluebutton/events/
+if [ ! -d "$EVENTS_DIR" ]; then
+  sudo mkdir -p $EVENTS_DIR
+fi
+
+PLAYBACK_DIR=/var/bigbluebutton/playback/
+if [ ! -d "$PLAYBACK_DIR" ]; then
+  sudo mkdir -p $PLAYBACK_DIR
+fi
+
+REC_RAW_DIR=/var/bigbluebutton/recording/raw/
+if [ ! -d "$REC_RAW_DIR" ]; then
+  sudo mkdir -p $REC_RAW_DIR
+fi
+
+REC_PROC_DIR=/var/bigbluebutton/recording/process/
+if [ ! -d "$REC_PROC_DIR" ]; then
+  sudo mkdir -p $REC_PROC_DIR
+fi
+
+REC_PUB_DIR=/var/bigbluebutton/recording/publish/
+if [ ! -d "$REC_PUB_DIR" ]; then
+  sudo mkdir -p $REC_PUB_DIR
+fi
+
+REC_STATUS_ENDED_DIR=/var/bigbluebutton/recording/status/ended/
+if [ ! -d "$REC_STATUS_ENDED_DIR" ]; then
+  sudo mkdir -p $REC_STATUS_ENDED_DIR
+fi
+
+REC_STATUS_RECORDED_DIR=/var/bigbluebutton/recording/status/recorded/
+if [ ! -d "$REC_STATUS_RECORDED_DIR" ]; then
+  sudo mkdir -p $REC_STATUS_RECORDED_DIR
+fi
+
+REC_STATUS_ARCHIVED_DIR=/var/bigbluebutton/recording/status/archived/
+if [ ! -d "$REC_STATUS_ARCHIVED_DIR" ]; then
+  sudo mkdir -p $REC_STATUS_ARCHIVED_DIR
+fi
+
+REC_STATUS_PROCESSED_DIR=/var/bigbluebutton/recording/status/processed/
+if [ ! -d "$REC_STATUS_PROCESSED_DIR" ]; then
+  sudo mkdir -p $REC_STATUS_PROCESSED_DIR
+fi
+
+REC_STATUS_SANITY_DIR=/var/bigbluebutton/recording/status/sanity/
+if [ ! -d "$REC_STATUS_SANITY_DIR" ]; then
+  sudo mkdir -p $REC_STATUS_SANITY_DIR
+fi
 
 sudo mv /usr/local/bigbluebutton/core/scripts/*.nginx /etc/bigbluebutton/nginx/
 sudo service nginx reload
 sudo chown -R bigbluebutton:bigbluebutton /var/bigbluebutton/ /var/log/bigbluebutton/
 sudo chown -R red5:red5 /var/bigbluebutton/screenshare/
 
-cd /usr/local/bigbluebutton/core/
-sudo bundle install
\ No newline at end of file
+#cd /usr/local/bigbluebutton/core/
+#sudo bundle install
\ No newline at end of file
-- 
GitLab