Skip to content

Commit 84a0991

Browse files
author
Antonio Serricchio
committed
Fixed: wait that recording file has size greater than zero
1 parent 10d82f9 commit 84a0991

File tree

5 files changed

+84
-20
lines changed

5 files changed

+84
-20
lines changed

openvidu-server/src/main/java/io/openvidu/server/OpenViduServer.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
import io.openvidu.server.kurento.kms.FixedOneKmsManager;
6565
import io.openvidu.server.kurento.kms.KmsManager;
6666
import io.openvidu.server.kurento.kms.LoadManager;
67-
import io.openvidu.server.recording.DummyRecordingDownloader;
67+
import io.openvidu.server.recording.ExternalizedRecordingDownloader;
6868
import io.openvidu.server.recording.DummyRecordingUploader;
6969
import io.openvidu.server.recording.RecordingDownloader;
7070
import io.openvidu.server.recording.RecordingUploader;
@@ -94,6 +94,8 @@ public class OpenViduServer implements JsonRpcConfigurer {
9494
@Autowired
9595
OpenviduConfig config;
9696

97+
private CustomFileManager fileManager = new LocalCustomFileManager();
98+
9799
@Bean
98100
@ConditionalOnMissingBean
99101
@DependsOn("openviduConfig")
@@ -174,7 +176,7 @@ public TokenRegister tokenRegister() {
174176
@ConditionalOnMissingBean
175177
@DependsOn("openviduConfig")
176178
public RecordingManager recordingManager() {
177-
return new RecordingManager(DockerManagerFactory.create(config), new LocalCustomFileManager());
179+
return new RecordingManager(DockerManagerFactory.create(config), fileManager);
178180
}
179181

180182
@Bean
@@ -212,7 +214,7 @@ public RecordingUploader recordingUpload() {
212214
@Bean
213215
@ConditionalOnMissingBean
214216
public RecordingDownloader recordingDownload() {
215-
return new DummyRecordingDownloader();
217+
return new ExternalizedRecordingDownloader(config, fileManager);
216218
}
217219

218220
@Bean
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* (C) Copyright 2017-2022 OpenVidu (https://openvidu.io)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*
16+
*/
17+
18+
package io.openvidu.server.recording;
19+
20+
import io.openvidu.server.config.OpenviduConfig;
21+
import io.openvidu.server.utils.CustomFileManager;
22+
import io.openvidu.server.utils.RecordingUtils;
23+
import org.slf4j.Logger;
24+
import org.slf4j.LoggerFactory;
25+
26+
import java.io.IOException;
27+
import java.util.Collection;
28+
29+
public class ExternalizedRecordingDownloader implements RecordingDownloader {
30+
31+
private static final Logger log = LoggerFactory.getLogger(ExternalizedRecordingDownloader.class);
32+
33+
private OpenviduConfig openviduConfig;
34+
private CustomFileManager fileManager;
35+
36+
public ExternalizedRecordingDownloader(OpenviduConfig openviduConfig, CustomFileManager fileManager) {
37+
this.openviduConfig = openviduConfig;
38+
this.fileManager = fileManager;
39+
}
40+
41+
@Override
42+
public void downloadRecording(Recording recording, Collection<RecorderEndpointWrapper> wrappers, Runnable callback) throws IOException {
43+
final String VIDEO_FILE = this.openviduConfig.getOpenViduRecordingPath(recording.getRecordingProperties().mediaNode()) + recording.getId() + "/"
44+
+ recording.getName() + RecordingUtils.getExtensionFromRecording(recording);
45+
try {
46+
this.fileManager.waitForFileToExistAndNotEmpty(recording.getRecordingProperties().mediaNode(), VIDEO_FILE);
47+
log.info("File {} exists and is not empty", VIDEO_FILE);
48+
callback.run();
49+
} catch (Exception e) {
50+
log.error("Recorder container failed generating video file (is empty) for session {}",
51+
recording.getSessionId());
52+
throw new IOException(e);
53+
}
54+
}
55+
56+
@Override
57+
public void cancelDownload(String recordingId) {
58+
}
59+
}

openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManagerUtils.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package io.openvidu.server.recording.service;
22

3-
import java.util.Set;
4-
5-
import org.springframework.http.HttpStatus;
6-
7-
import io.openvidu.java.client.Recording.OutputMode;
83
import io.openvidu.server.config.OpenviduConfig;
94
import io.openvidu.server.recording.Recording;
105
import io.openvidu.server.utils.JsonUtils;
6+
import org.springframework.http.HttpStatus;
7+
8+
import java.util.Set;
119

1210
public abstract class RecordingManagerUtils {
1311

@@ -31,16 +29,6 @@ public RecordingManagerUtils(OpenviduConfig openviduConfig, RecordingManager rec
3129

3230
protected abstract Set<String> getAllRecordingIdsFromStorage(String sessionIdPrefix);
3331

34-
protected String getExtensionFromRecording(Recording recording) {
35-
if (OutputMode.INDIVIDUAL.equals(recording.getOutputMode())) {
36-
return "zip";
37-
} else if (recording.hasVideo()) {
38-
return "mp4";
39-
} else {
40-
return "webm";
41-
}
42-
}
43-
4432
public String getFreeRecordingId(String sessionId) {
4533
Set<String> recordingIds = getAllRecordingIdsFromStorage(sessionId);
4634
return getNextAvailableRecordingId(sessionId, recordingIds);

openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManagerUtilsLocalStorage.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.HashSet;
55
import java.util.Set;
66

7+
import io.openvidu.server.utils.RecordingUtils;
78
import org.springframework.http.HttpStatus;
89

910
import io.openvidu.server.config.OpenviduConfig;
@@ -35,8 +36,8 @@ public HttpStatus deleteRecordingFromStorage(String recordingId) {
3536
@Override
3637
public String getRecordingUrl(Recording recording) {
3738
String basePath = RequestMappings.RECORDINGS.replaceFirst("^/", "") + "/";
38-
return openviduConfig.getFinalUrl() + basePath + recording.getId() + "/" + recording.getName() + "."
39-
+ this.getExtensionFromRecording(recording);
39+
return openviduConfig.getFinalUrl() + basePath + recording.getId() + "/" + recording.getName()
40+
+ RecordingUtils.getExtensionFromRecording(recording);
4041
}
4142

4243
@Override

openvidu-server/src/main/java/io/openvidu/server/utils/RecordingUtils.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import io.openvidu.java.client.RecordingProperties;
44
import io.openvidu.server.core.Session;
5+
import io.openvidu.server.recording.Recording;
6+
7+
import static io.openvidu.java.client.Recording.OutputMode.INDIVIDUAL;
8+
import static io.openvidu.server.recording.service.RecordingService.*;
59

610
public final class RecordingUtils {
711

@@ -15,4 +19,14 @@ public final static RecordingProperties RECORDING_PROPERTIES_WITH_MEDIA_NODE(Ses
1519
return recordingProperties;
1620
}
1721

22+
public static String getExtensionFromRecording(Recording recording) {
23+
if (INDIVIDUAL.equals(recording.getOutputMode())) {
24+
return INDIVIDUAL_RECORDING_COMPRESSED_EXTENSION;
25+
} else if (recording.hasVideo()) {
26+
return COMPOSED_RECORDING_EXTENSION;
27+
} else {
28+
return COMPOSED_RECORDING_AUDIO_ONLY_EXTENSION;
29+
}
30+
}
31+
1832
}

0 commit comments

Comments
 (0)