Skip to content

Commit 36cea4f

Browse files
committed
feat(WIP): Add an option to export media to a pre-configured WS url.
1 parent 52ba365 commit 36cea4f

File tree

5 files changed

+29
-2
lines changed

5 files changed

+29
-2
lines changed

jicofo-selector/src/main/kotlin/org/jitsi/jicofo/bridge/colibri/Colibri2Session.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import org.jitsi.xmpp.extensions.colibri2.Colibri2Relay
3636
import org.jitsi.xmpp.extensions.colibri2.ConferenceModifiedIQ
3737
import org.jitsi.xmpp.extensions.colibri2.ConferenceModifyIQ
3838
import org.jitsi.xmpp.extensions.colibri2.Endpoints
39+
import org.jitsi.xmpp.extensions.colibri2.Export
3940
import org.jitsi.xmpp.extensions.colibri2.InitialLastN
4041
import org.jitsi.xmpp.extensions.colibri2.Media
4142
import org.jitsi.xmpp.extensions.colibri2.Sctp
@@ -48,6 +49,7 @@ import org.jivesoftware.smack.StanzaCollector
4849
import org.jivesoftware.smack.packet.ErrorIQ
4950
import org.jivesoftware.smack.packet.IQ
5051
import org.jivesoftware.smackx.muc.MUCRole
52+
import java.net.URI
5153
import java.util.Collections.singletonList
5254
import java.util.UUID
5355

@@ -57,6 +59,7 @@ class Colibri2Session(
5759
val bridge: Bridge,
5860
// Whether the session was constructed for the purpose of visitor nodes
5961
val visitor: Boolean,
62+
val audioExportUrl: URI?,
6063
parentLogger: Logger
6164
) : CascadeNode<Colibri2Session, Colibri2Session.Relay> {
6265
private val logger = createChildLogger(parentLogger).apply {
@@ -196,6 +199,10 @@ class Colibri2Session(
196199
setCreate(true)
197200
setConferenceName(colibriSessionManager.conferenceName)
198201
setRtcstatsEnabled(colibriSessionManager.rtcStatsEnabled)
202+
audioExportUrl?.let {
203+
logger.warn("XXX adding export to colibri iq url=$it")
204+
addExport(Export(it, audio = true))
205+
}
199206
}
200207
}
201208

jicofo-selector/src/main/kotlin/org/jitsi/jicofo/bridge/colibri/ColibriV2SessionManager.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import org.jivesoftware.smack.packet.StanzaError.Condition.conflict
5252
import org.jivesoftware.smack.packet.StanzaError.Condition.item_not_found
5353
import org.jivesoftware.smack.packet.StanzaError.Condition.service_unavailable
5454
import org.json.simple.JSONArray
55+
import java.net.URI
5556
import java.util.Collections.singletonList
5657

5758
/**
@@ -68,6 +69,7 @@ class ColibriV2SessionManager(
6869
*/
6970
internal val meetingId: String,
7071
internal val rtcStatsEnabled: Boolean,
72+
private val audioExportUrl: URI?,
7173
private val bridgeVersion: String?,
7274
parentLogger: Logger
7375
) : ColibriSessionManager, Cascade<Colibri2Session, Colibri2Session.Relay> {
@@ -81,6 +83,8 @@ class ColibriV2SessionManager(
8183
logger.info("Using ${it.javaClass.name}")
8284
}
8385

86+
private var sessionForAudioRecording: Colibri2Session? = null
87+
8488
/**
8589
* The colibri2 sessions that are currently active, mapped by the relayId of the [Bridge] that they use.
8690
*/
@@ -241,7 +245,16 @@ class ColibriV2SessionManager(
241245
return Pair(session, false)
242246
}
243247

244-
session = Colibri2Session(this, bridge, visitor, logger)
248+
session = Colibri2Session(
249+
this,
250+
bridge,
251+
visitor,
252+
if (audioExportUrl != null && sessionForAudioRecording == null) audioExportUrl else null,
253+
logger
254+
)
255+
if (audioExportUrl != null && sessionForAudioRecording == null) {
256+
sessionForAudioRecording = session
257+
}
245258
return Pair(session, true)
246259
}
247260

jicofo-selector/src/main/resources/reference.conf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,9 @@ jicofo {
398398
# via the room-metadata service
399399
enable-live-room = false
400400
}
401+
recording {
402+
multi-track-recorder-url-template = "wss://example.com/recorder/MEETING_ID"
403+
}
401404

402405
xmpp {
403406
// Whether to use JitsiXmppStringprep to validate JIDs. If set to false uses the default validation in Smack.

jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.jivesoftware.smackx.caps.packet.*;
4646
import org.jxmpp.jid.*;
4747

48+
import java.net.*;
4849
import java.util.*;
4950
import java.util.concurrent.*;
5051
import java.util.concurrent.atomic.*;
@@ -328,12 +329,15 @@ private ColibriSessionManager getColibriSessionManager()
328329
{
329330
// We initialize colibriSessionManager only after having joined the room, so meetingId must be set.
330331
String meetingId = Objects.requireNonNull(this.meetingId);
332+
URI multiTrackRecorderUrl = RecordingConfig.config.multiTrackRecorderUrl(meetingId);
333+
// TODO update presence to reflect
331334
colibriSessionManager = new ColibriV2SessionManager(
332335
jicofoServices.getXmppServices().getServiceConnection().getXmppConnection(),
333336
jicofoServices.getBridgeSelector(),
334337
getRoomName().toString(),
335338
meetingId,
336339
config.getRtcStatsEnabled(),
340+
multiTrackRecorderUrl,
337341
jvbVersion,
338342
logger);
339343
colibriSessionManager.addListener(colibriSessionManagerListener);

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@
175175
<dependency>
176176
<groupId>${project.groupId}</groupId>
177177
<artifactId>jitsi-xmpp-extensions</artifactId>
178-
<version>1.0-80-g0ce9883</version>
178+
<version>1.0-SNAPSHOT</version>
179179
</dependency>
180180
<dependency>
181181
<groupId>org.slf4j</groupId>

0 commit comments

Comments
 (0)