diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java b/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java index 11bb7e24..f705b546 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java @@ -451,7 +451,7 @@ public abstract class SessionManager { this.closeSessionAndEmptyCollections(session, reason); if (recordingService.sessionIsBeingRecorded(session.getSessionId())) { - recordingService.stopRecording(session, reason); + recordingService.stopRecording(session, null, reason); } return participants; diff --git a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java index 3113e251..ce2c5f76 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java @@ -180,7 +180,7 @@ public class KurentoSessionManager extends SessionManager { .equals(remainingParticipants.iterator().next().getParticipantPublicId())) { log.info("Last participant left. Stopping recording for session {}", sessionId); - recordingService.stopRecording(session, reason); + recordingService.stopRecording(session, null, reason); evictParticipant(session.getParticipantByPublicId(ProtocolElements.RECORDER_PARTICIPANT_PUBLICID), null, null, "EVICT_RECORDER"); } diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/ComposedRecordingService.java b/openvidu-server/src/main/java/io/openvidu/server/recording/ComposedRecordingService.java index 46f26b9b..f80aefa7 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/ComposedRecordingService.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/ComposedRecordingService.java @@ -155,10 +155,24 @@ public class ComposedRecordingService { return recording; } - public Recording stopRecording(Session session, String reason) { - Recording recording = this.sessionsRecordings.remove(session.getSessionId()); - String containerId = this.sessionsContainers.remove(session.getSessionId()); - this.startedRecordings.remove(recording.getId()); + public Recording stopRecording(Session session, String recordingId, String reason) { + Recording recording; + String containerId; + + if (session == null) { + log.warn( + "Existing recording {} does not have an active session associated. This usually means the recording" + + " layout did not join a recorded participant and therefore the session closed before" + + " stopping the recording container", + recordingId); + recording = this.startedRecordings.remove(recordingId); + containerId = this.sessionsContainers.remove(recording.getSessionId()); + this.sessionsRecordings.remove(recording.getSessionId()); + } else { + recording = this.sessionsRecordings.remove(session.getSessionId()); + containerId = this.sessionsContainers.remove(session.getSessionId()); + this.startedRecordings.remove(recording.getId()); + } if (containerId == null) { @@ -250,7 +264,9 @@ public class ComposedRecordingService { throw new OpenViduException(Code.RECORDING_REPORT_ERROR_CODE, "There was an error generating the metadata report file for the recording"); } - this.sessionHandler.sendRecordingStoppedNotification(session, recording, reason); + if (session != null) { + this.sessionHandler.sendRecordingStoppedNotification(session, recording, reason); + } } return recording; } @@ -465,8 +481,7 @@ public class ComposedRecordingService { private boolean isFileFromRecording(File file, String recordingId, String recordingName) { return (((recordingId + ".info").equals(file.getName())) || ((RECORDING_ENTITY_FILE + recordingId).equals(file.getName())) - || (recordingName + ".mp4").equals(file.getName()) - || (recordingId + ".jpg").equals(file.getName())); + || (recordingName + ".mp4").equals(file.getName()) || (recordingId + ".jpg").equals(file.getName())); } private String getFreeRecordingId(String sessionId, String shortSessionId) { diff --git a/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java b/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java index 0a66a571..59d0d58a 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java +++ b/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java @@ -336,7 +336,9 @@ public class SessionRestController { recordingLayout = RecordingLayout.valueOf(recordingLayoutString); } - customLayout = (customLayout == null) ? session.getSessionProperties().defaultCustomLayout() : customLayout; + customLayout = (customLayout == null || customLayout.isEmpty()) + ? session.getSessionProperties().defaultCustomLayout() + : customLayout; Recording startedRecording = this.recordingService.startRecording(session, new RecordingProperties.Builder() .name(name).recordingLayout(recordingLayout).customLayout(customLayout).build()); @@ -368,11 +370,14 @@ public class SessionRestController { Session session = sessionManager.getSession(recording.getSessionId()); - Recording stoppedRecording = this.recordingService.stopRecording(session, "recordingStoppedByServer"); + Recording stoppedRecording = this.recordingService.stopRecording(session, recording.getId(), + "recordingStoppedByServer"); - sessionManager.evictParticipant( - session.getParticipantByPublicId(ProtocolElements.RECORDER_PARTICIPANT_PUBLICID), null, null, - "EVICT_RECORDER"); + if (session != null) { + sessionManager.evictParticipant( + session.getParticipantByPublicId(ProtocolElements.RECORDER_PARTICIPANT_PUBLICID), null, null, + "EVICT_RECORDER"); + } return new ResponseEntity<>(stoppedRecording.toJson().toString(), getResponseHeaders(), HttpStatus.OK); }