openvidu-server: if COMPOSED also if COMPOSED_QUICK_START

pull/508/head
pabloFuente 2020-07-02 11:22:50 +02:00
parent af9cbbf742
commit 476428b9ae
8 changed files with 45 additions and 34 deletions

View File

@ -46,8 +46,7 @@ public class CDREventRecording extends CDREventEnd {
json.addProperty("id", this.recording.getId()); json.addProperty("id", this.recording.getId());
json.addProperty("name", this.recording.getName()); json.addProperty("name", this.recording.getName());
json.addProperty("outputMode", this.recording.getOutputMode().name()); json.addProperty("outputMode", this.recording.getOutputMode().name());
if (io.openvidu.java.client.Recording.OutputMode.COMPOSED.equals(this.recording.getOutputMode()) if (RecordingUtils.IS_COMPOSED(this.recording.getOutputMode()) && this.recording.hasVideo()) {
&& this.recording.hasVideo()) {
json.addProperty("resolution", this.recording.getResolution()); json.addProperty("resolution", this.recording.getResolution());
json.addProperty("recordingLayout", this.recording.getRecordingLayout().name()); json.addProperty("recordingLayout", this.recording.getRecordingLayout().name());
if (RecordingLayout.CUSTOM.equals(this.recording.getRecordingLayout()) if (RecordingLayout.CUSTOM.equals(this.recording.getRecordingLayout())

View File

@ -42,7 +42,7 @@ public class CDREventRecordingStatus extends CDREventEnd {
json.addProperty("id", this.recording.getId()); json.addProperty("id", this.recording.getId());
json.addProperty("name", this.recording.getName()); json.addProperty("name", this.recording.getName());
json.addProperty("outputMode", this.recording.getOutputMode().name()); json.addProperty("outputMode", this.recording.getOutputMode().name());
if (io.openvidu.java.client.Recording.OutputMode.COMPOSED.equals(this.recording.getOutputMode()) if (RecordingUtils.IS_COMPOSED(this.recording.getOutputMode())
&& this.recording.hasVideo()) { && this.recording.hasVideo()) {
json.addProperty("resolution", this.recording.getResolution()); json.addProperty("resolution", this.recording.getResolution());
json.addProperty("recordingLayout", this.recording.getRecordingLayout().name()); json.addProperty("recordingLayout", this.recording.getRecordingLayout().name());

View File

@ -200,7 +200,7 @@ public class Session implements SessionInterface {
json.addProperty("mediaMode", this.sessionProperties.mediaMode().name()); json.addProperty("mediaMode", this.sessionProperties.mediaMode().name());
json.addProperty("recordingMode", this.sessionProperties.recordingMode().name()); json.addProperty("recordingMode", this.sessionProperties.recordingMode().name());
json.addProperty("defaultOutputMode", this.sessionProperties.defaultOutputMode().name()); json.addProperty("defaultOutputMode", this.sessionProperties.defaultOutputMode().name());
if (Recording.OutputMode.COMPOSED.equals(this.sessionProperties.defaultOutputMode())) { if (RecordingUtils.IS_COMPOSED(this.sessionProperties.defaultOutputMode())) {
json.addProperty("defaultRecordingLayout", this.sessionProperties.defaultRecordingLayout().name()); json.addProperty("defaultRecordingLayout", this.sessionProperties.defaultRecordingLayout().name());
if (RecordingLayout.CUSTOM.equals(this.sessionProperties.defaultRecordingLayout())) { if (RecordingLayout.CUSTOM.equals(this.sessionProperties.defaultRecordingLayout())) {
json.addProperty("defaultCustomLayout", this.sessionProperties.defaultCustomLayout()); json.addProperty("defaultCustomLayout", this.sessionProperties.defaultCustomLayout());

View File

@ -21,6 +21,7 @@ import com.google.gson.JsonObject;
import io.openvidu.java.client.RecordingLayout; import io.openvidu.java.client.RecordingLayout;
import io.openvidu.java.client.RecordingProperties; import io.openvidu.java.client.RecordingProperties;
import io.openvidu.server.utils.RecordingUtils;
public class Recording { public class Recording {
@ -71,7 +72,7 @@ public class Recording {
.valueOf(json.get("outputMode").getAsString()); .valueOf(json.get("outputMode").getAsString());
RecordingProperties.Builder builder = new RecordingProperties.Builder().name(json.get("name").getAsString()) RecordingProperties.Builder builder = new RecordingProperties.Builder().name(json.get("name").getAsString())
.outputMode(outputMode).hasAudio(this.hasAudio).hasVideo(this.hasVideo); .outputMode(outputMode).hasAudio(this.hasAudio).hasVideo(this.hasVideo);
if (io.openvidu.java.client.Recording.OutputMode.COMPOSED.equals(outputMode) && this.hasVideo) { if (RecordingUtils.IS_COMPOSED(outputMode) && this.hasVideo) {
this.resolution = json.get("resolution").getAsString(); this.resolution = json.get("resolution").getAsString();
builder.resolution(this.resolution); builder.resolution(this.resolution);
RecordingLayout recordingLayout = RecordingLayout.valueOf(json.get("recordingLayout").getAsString()); RecordingLayout recordingLayout = RecordingLayout.valueOf(json.get("recordingLayout").getAsString());
@ -188,8 +189,7 @@ public class Recording {
json.addProperty("id", this.id); json.addProperty("id", this.id);
json.addProperty("name", this.recordingProperties.name()); json.addProperty("name", this.recordingProperties.name());
json.addProperty("outputMode", this.getOutputMode().name()); json.addProperty("outputMode", this.getOutputMode().name());
if (io.openvidu.java.client.Recording.OutputMode.COMPOSED.equals(this.recordingProperties.outputMode()) if (RecordingUtils.IS_COMPOSED(this.recordingProperties.outputMode()) && this.hasVideo) {
&& this.hasVideo) {
json.addProperty("resolution", this.resolution); json.addProperty("resolution", this.resolution);
json.addProperty("recordingLayout", this.recordingProperties.recordingLayout().name()); json.addProperty("recordingLayout", this.recordingProperties.recordingLayout().name());
if (RecordingLayout.CUSTOM.equals(this.recordingProperties.recordingLayout())) { if (RecordingLayout.CUSTOM.equals(this.recordingProperties.recordingLayout())) {

View File

@ -76,7 +76,7 @@ import io.openvidu.server.utils.CustomFileManager;
import io.openvidu.server.utils.DockerManager; import io.openvidu.server.utils.DockerManager;
import io.openvidu.server.utils.JsonUtils; import io.openvidu.server.utils.JsonUtils;
import io.openvidu.server.utils.QuarantineKiller; import io.openvidu.server.utils.QuarantineKiller;
import org.springframework.http.ResponseEntity; import io.openvidu.server.utils.RecordingUtils;
public class RecordingManager { public class RecordingManager {
@ -161,8 +161,8 @@ public class RecordingManager {
this.dockerManager = new DockerManager(); this.dockerManager = new DockerManager();
this.composedRecordingService = new ComposedRecordingService(this, recordingDownloader, openviduConfig, cdr, this.composedRecordingService = new ComposedRecordingService(this, recordingDownloader, openviduConfig, cdr,
quarantineKiller); quarantineKiller);
this.composedQuickStartRecordingService = new ComposedQuickStartRecordingService(this, recordingDownloader, openviduConfig, cdr, this.composedQuickStartRecordingService = new ComposedQuickStartRecordingService(this, recordingDownloader,
quarantineKiller); openviduConfig, cdr, quarantineKiller);
this.singleStreamRecordingService = new SingleStreamRecordingService(this, recordingDownloader, openviduConfig, this.singleStreamRecordingService = new SingleStreamRecordingService(this, recordingDownloader, openviduConfig,
cdr, quarantineKiller); cdr, quarantineKiller);
@ -271,9 +271,9 @@ public class RecordingManager {
this.cdr.recordRecordingStarted(recording); this.cdr.recordRecordingStarted(recording);
this.cdr.recordRecordingStatusChanged(recording, null, recording.getCreatedAt(), this.cdr.recordRecordingStatusChanged(recording, null, recording.getCreatedAt(),
io.openvidu.java.client.Recording.Status.started); Status.started);
if (!(OutputMode.COMPOSED.equals(properties.outputMode()) && properties.hasVideo())) { if (!(RecordingUtils.IS_COMPOSED(properties.outputMode()) && properties.hasVideo())) {
// Directly send recording started notification for all cases except for // Directly send recording started notification for all cases except for
// COMPOSED recordings with video (will be sent on first RECORDER subscriber) // COMPOSED recordings with video (will be sent on first RECORDER subscriber)
this.sessionHandler.sendRecordingStartedNotification(session, recording); this.sessionHandler.sendRecordingStartedNotification(session, recording);
@ -319,7 +319,8 @@ public class RecordingManager {
recording = this.composedRecordingService.stopRecording(session, recording, reason, hasSessionEnded); recording = this.composedRecordingService.stopRecording(session, recording, reason, hasSessionEnded);
break; break;
case COMPOSED_QUICK_START: case COMPOSED_QUICK_START:
recording = this.composedQuickStartRecordingService.stopRecording(session, recording, reason, hasSessionEnded); recording = this.composedQuickStartRecordingService.stopRecording(session, recording, reason,
hasSessionEnded);
break; break;
case INDIVIDUAL: case INDIVIDUAL:
recording = this.singleStreamRecordingService.stopRecording(session, recording, reason, hasSessionEnded); recording = this.singleStreamRecordingService.stopRecording(session, recording, reason, hasSessionEnded);
@ -334,7 +335,8 @@ public class RecordingManager {
recording = this.sessionsRecordings.get(session.getSessionId()); recording = this.sessionsRecordings.get(session.getSessionId());
switch (recording.getOutputMode()) { switch (recording.getOutputMode()) {
case COMPOSED: case COMPOSED:
recording = this.composedRecordingService.stopRecording(session, recording, reason, kmsDisconnectionTime, true); recording = this.composedRecordingService.stopRecording(session, recording, reason, kmsDisconnectionTime,
true);
if (recording.hasVideo()) { if (recording.hasVideo()) {
// Evict the recorder participant if composed recording with video // Evict the recorder participant if composed recording with video
this.sessionManager.evictParticipant( this.sessionManager.evictParticipant(
@ -343,7 +345,8 @@ public class RecordingManager {
} }
break; break;
case COMPOSED_QUICK_START: case COMPOSED_QUICK_START:
recording = this.composedQuickStartRecordingService.stopRecording(session, recording, reason, kmsDisconnectionTime, true); recording = this.composedQuickStartRecordingService.stopRecording(session, recording, reason,
kmsDisconnectionTime, true);
if (recording.hasVideo()) { if (recording.hasVideo()) {
// Evict the recorder participant if composed recording with video // Evict the recorder participant if composed recording with video
this.sessionManager.evictParticipant( this.sessionManager.evictParticipant(
@ -371,15 +374,14 @@ public class RecordingManager {
return; return;
} }
} }
if (io.openvidu.java.client.Recording.OutputMode.INDIVIDUAL.equals(recording.getOutputMode())) { if (OutputMode.INDIVIDUAL.equals(recording.getOutputMode())) {
// Start new RecorderEndpoint for this stream // Start new RecorderEndpoint for this stream
log.info("Starting new RecorderEndpoint in session {} for new stream of participant {}", log.info("Starting new RecorderEndpoint in session {} for new stream of participant {}",
session.getSessionId(), participant.getParticipantPublicId()); session.getSessionId(), participant.getParticipantPublicId());
final CountDownLatch startedCountDown = new CountDownLatch(1); final CountDownLatch startedCountDown = new CountDownLatch(1);
this.singleStreamRecordingService.startRecorderEndpointForPublisherEndpoint(session, recordingId, profile, this.singleStreamRecordingService.startRecorderEndpointForPublisherEndpoint(session, recordingId, profile,
participant, startedCountDown); participant, startedCountDown);
} else if (io.openvidu.java.client.Recording.OutputMode.COMPOSED.equals(recording.getOutputMode()) } else if (RecordingUtils.IS_COMPOSED(recording.getOutputMode()) && !recording.hasVideo()) {
&& !recording.hasVideo()) {
// Connect this stream to existing Composite recorder // Connect this stream to existing Composite recorder
log.info("Joining PublisherEndpoint to existing Composite in session {} for new stream of participant {}", log.info("Joining PublisherEndpoint to existing Composite in session {} for new stream of participant {}",
session.getSessionId(), participant.getParticipantPublicId()); session.getSessionId(), participant.getParticipantPublicId());
@ -393,7 +395,7 @@ public class RecordingManager {
log.error("Cannot stop recording of existing stream {}. Session {} is not being recorded", streamId, log.error("Cannot stop recording of existing stream {}. Session {} is not being recorded", streamId,
session.getSessionId()); session.getSessionId());
} }
if (io.openvidu.java.client.Recording.OutputMode.INDIVIDUAL.equals(recording.getOutputMode())) { if (OutputMode.INDIVIDUAL.equals(recording.getOutputMode())) {
// Stop specific RecorderEndpoint for this stream // Stop specific RecorderEndpoint for this stream
log.info("Stopping RecorderEndpoint in session {} for stream of participant {}", session.getSessionId(), log.info("Stopping RecorderEndpoint in session {} for stream of participant {}", session.getSessionId(),
streamId); streamId);
@ -408,8 +410,7 @@ public class RecordingManager {
} catch (InterruptedException e) { } catch (InterruptedException e) {
log.error("Exception while waiting for state change", e); log.error("Exception while waiting for state change", e);
} }
} else if (io.openvidu.java.client.Recording.OutputMode.COMPOSED.equals(recording.getOutputMode()) } else if (RecordingUtils.IS_COMPOSED(recording.getOutputMode()) && !recording.hasVideo()) {
&& !recording.hasVideo()) {
// Disconnect this stream from existing Composite recorder // Disconnect this stream from existing Composite recorder
log.info("Removing PublisherEndpoint from Composite in session {} for stream of participant {}", log.info("Removing PublisherEndpoint from Composite in session {} for stream of participant {}",
session.getSessionId(), streamId); session.getSessionId(), streamId);
@ -431,8 +432,7 @@ public class RecordingManager {
} }
public Collection<Recording> getFinishedRecordings() { public Collection<Recording> getFinishedRecordings() {
return this.getAllRecordingsFromHost().stream() return this.getAllRecordingsFromHost().stream().filter(recording -> recording.getStatus().equals(Status.ready))
.filter(recording -> recording.getStatus().equals(io.openvidu.java.client.Recording.Status.ready))
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }
@ -469,7 +469,7 @@ public class RecordingManager {
if (recording == null) { if (recording == null) {
return HttpStatus.NOT_FOUND; return HttpStatus.NOT_FOUND;
} }
if (io.openvidu.java.client.Recording.Status.stopped.equals(recording.getStatus())) { if (Status.stopped.equals(recording.getStatus())) {
// Recording is being downloaded from remote host // Recording is being downloaded from remote host
log.warn("Cancelling ongoing download process of recording {}", recording.getId()); log.warn("Cancelling ongoing download process of recording {}", recording.getId());
this.recordingDownloader.cancelDownload(recording.getId()); this.recordingDownloader.cancelDownload(recording.getId());
@ -502,8 +502,7 @@ public class RecordingManager {
return null; return null;
} }
Recording recording = new Recording(json); Recording recording = new Recording(json);
if (io.openvidu.java.client.Recording.Status.ready.equals(recording.getStatus()) if (Status.ready.equals(recording.getStatus()) || Status.failed.equals(recording.getStatus())) {
|| io.openvidu.java.client.Recording.Status.failed.equals(recording.getStatus())) {
recording.setUrl(getRecordingUrl(recording)); recording.setUrl(getRecordingUrl(recording));
} }
return recording; return recording;
@ -517,7 +516,7 @@ public class RecordingManager {
} }
private String getExtensionFromRecording(Recording recording) { private String getExtensionFromRecording(Recording recording) {
if (io.openvidu.java.client.Recording.OutputMode.INDIVIDUAL.equals(recording.getOutputMode())) { if (OutputMode.INDIVIDUAL.equals(recording.getOutputMode())) {
return "zip"; return "zip";
} else if (recording.hasVideo()) { } else if (recording.hasVideo()) {
return "mp4"; return "mp4";

View File

@ -35,6 +35,7 @@ import io.openvidu.server.recording.RecordingDownloader;
import io.openvidu.server.utils.CommandExecutor; import io.openvidu.server.utils.CommandExecutor;
import io.openvidu.server.utils.CustomFileManager; import io.openvidu.server.utils.CustomFileManager;
import io.openvidu.server.utils.QuarantineKiller; import io.openvidu.server.utils.QuarantineKiller;
import io.openvidu.server.utils.RecordingUtils;
public abstract class RecordingService { public abstract class RecordingService {
@ -58,7 +59,8 @@ public abstract class RecordingService {
public abstract Recording startRecording(Session session, RecordingProperties properties) throws OpenViduException; public abstract Recording startRecording(Session session, RecordingProperties properties) throws OpenViduException;
public abstract Recording stopRecording(Session session, Recording recording, EndReason reason, boolean hasSessionEnded); public abstract Recording stopRecording(Session session, Recording recording, EndReason reason,
boolean hasSessionEnded);
/** /**
* Generates metadata recording file (".recording.RECORDING_ID" JSON file to * Generates metadata recording file (".recording.RECORDING_ID" JSON file to
@ -131,8 +133,8 @@ public abstract class RecordingService {
/** /**
* Returns a new available recording identifier (adding a number tag at the end * Returns a new available recording identifier (adding a number tag at the end
* of the sessionId if it already exists) and rebuilds RecordinProperties object * of the sessionId if it already exists) and rebuilds RecordingProperties
* to set the final value of "name" property * object to set the final value of "name" property
*/ */
protected PropertiesRecordingId setFinalRecordingNameAndGetFreeRecordingId(Session session, protected PropertiesRecordingId setFinalRecordingNameAndGetFreeRecordingId(Session session,
RecordingProperties properties) { RecordingProperties properties) {
@ -142,8 +144,7 @@ public abstract class RecordingService {
RecordingProperties.Builder builder = new RecordingProperties.Builder().name(recordingId) RecordingProperties.Builder builder = new RecordingProperties.Builder().name(recordingId)
.outputMode(properties.outputMode()).hasAudio(properties.hasAudio()) .outputMode(properties.outputMode()).hasAudio(properties.hasAudio())
.hasVideo(properties.hasVideo()); .hasVideo(properties.hasVideo());
if (io.openvidu.java.client.Recording.OutputMode.COMPOSED.equals(properties.outputMode()) if (RecordingUtils.IS_COMPOSED(properties.outputMode()) && properties.hasVideo()) {
&& properties.hasVideo()) {
builder.resolution(properties.resolution()); builder.resolution(properties.resolution());
builder.recordingLayout(properties.recordingLayout()); builder.recordingLayout(properties.recordingLayout());
if (RecordingLayout.CUSTOM.equals(properties.recordingLayout())) { if (RecordingLayout.CUSTOM.equals(properties.recordingLayout())) {

View File

@ -65,6 +65,7 @@ import io.openvidu.server.kurento.core.KurentoMediaOptions;
import io.openvidu.server.kurento.core.KurentoTokenOptions; import io.openvidu.server.kurento.core.KurentoTokenOptions;
import io.openvidu.server.recording.Recording; import io.openvidu.server.recording.Recording;
import io.openvidu.server.recording.service.RecordingManager; import io.openvidu.server.recording.service.RecordingManager;
import io.openvidu.server.utils.RecordingUtils;
/** /**
* *
@ -494,7 +495,7 @@ public class SessionRestController {
HttpStatus.BAD_REQUEST); HttpStatus.BAD_REQUEST);
} }
} }
if (OutputMode.COMPOSED.equals(finalOutputMode)) { if (RecordingUtils.IS_COMPOSED(finalOutputMode)) {
if (resolution != null && !sessionManager.formatChecker.isAcceptableRecordingResolution(resolution)) { if (resolution != null && !sessionManager.formatChecker.isAcceptableRecordingResolution(resolution)) {
return this.generateErrorResponse( return this.generateErrorResponse(
"Wrong \"resolution\" parameter. Acceptable values from 100 to 1999 for both width and height", "Wrong \"resolution\" parameter. Acceptable values from 100 to 1999 for both width and height",
@ -552,7 +553,7 @@ public class SessionRestController {
RecordingProperties.Builder builder = new RecordingProperties.Builder(); RecordingProperties.Builder builder = new RecordingProperties.Builder();
builder.outputMode( builder.outputMode(
finalOutputMode == null ? session.getSessionProperties().defaultOutputMode() : finalOutputMode); finalOutputMode == null ? session.getSessionProperties().defaultOutputMode() : finalOutputMode);
if (finalOutputMode.equals(OutputMode.COMPOSED)) { if (RecordingUtils.IS_COMPOSED(finalOutputMode)) {
if (resolution != null) { if (resolution != null) {
builder.resolution(resolution); builder.resolution(resolution);
} }

View File

@ -0,0 +1,11 @@
package io.openvidu.server.utils;
import io.openvidu.java.client.Recording.OutputMode;
public final class RecordingUtils {
public final static boolean IS_COMPOSED(OutputMode outputMode) {
return (OutputMode.COMPOSED.equals(outputMode) || OutputMode.COMPOSED_QUICK_START.equals(outputMode));
}
}