diff --git a/jicofo-selector/src/main/kotlin/org/jitsi/jicofo/bridge/colibri/Colibri2Session.kt b/jicofo-selector/src/main/kotlin/org/jitsi/jicofo/bridge/colibri/Colibri2Session.kt index 3633b4e0d..c8e3ec147 100644 --- a/jicofo-selector/src/main/kotlin/org/jitsi/jicofo/bridge/colibri/Colibri2Session.kt +++ b/jicofo-selector/src/main/kotlin/org/jitsi/jicofo/bridge/colibri/Colibri2Session.kt @@ -36,6 +36,7 @@ import org.jitsi.xmpp.extensions.colibri2.Colibri2Relay import org.jitsi.xmpp.extensions.colibri2.ConferenceModifiedIQ import org.jitsi.xmpp.extensions.colibri2.ConferenceModifyIQ import org.jitsi.xmpp.extensions.colibri2.Endpoints +import org.jitsi.xmpp.extensions.colibri2.Export import org.jitsi.xmpp.extensions.colibri2.InitialLastN import org.jitsi.xmpp.extensions.colibri2.Media import org.jitsi.xmpp.extensions.colibri2.Sctp @@ -48,6 +49,7 @@ import org.jivesoftware.smack.StanzaCollector import org.jivesoftware.smack.packet.ErrorIQ import org.jivesoftware.smack.packet.IQ import org.jivesoftware.smackx.muc.MUCRole +import java.net.URI import java.util.Collections.singletonList import java.util.UUID @@ -57,6 +59,7 @@ class Colibri2Session( val bridge: Bridge, // Whether the session was constructed for the purpose of visitor nodes val visitor: Boolean, + val audioExportUrl: URI?, parentLogger: Logger ) : CascadeNode { private val logger = createChildLogger(parentLogger).apply { @@ -196,6 +199,10 @@ class Colibri2Session( setCreate(true) setConferenceName(colibriSessionManager.conferenceName) setRtcstatsEnabled(colibriSessionManager.rtcStatsEnabled) + audioExportUrl?.let { + logger.warn("XXX adding export to colibri iq url=$it") + addExport(Export(it, audio = true)) + } } } diff --git a/jicofo-selector/src/main/kotlin/org/jitsi/jicofo/bridge/colibri/ColibriV2SessionManager.kt b/jicofo-selector/src/main/kotlin/org/jitsi/jicofo/bridge/colibri/ColibriV2SessionManager.kt index c4df29f69..a190a088e 100644 --- a/jicofo-selector/src/main/kotlin/org/jitsi/jicofo/bridge/colibri/ColibriV2SessionManager.kt +++ b/jicofo-selector/src/main/kotlin/org/jitsi/jicofo/bridge/colibri/ColibriV2SessionManager.kt @@ -52,6 +52,7 @@ import org.jivesoftware.smack.packet.StanzaError.Condition.conflict import org.jivesoftware.smack.packet.StanzaError.Condition.item_not_found import org.jivesoftware.smack.packet.StanzaError.Condition.service_unavailable import org.json.simple.JSONArray +import java.net.URI import java.util.Collections.singletonList /** @@ -68,6 +69,7 @@ class ColibriV2SessionManager( */ internal val meetingId: String, internal val rtcStatsEnabled: Boolean, + private val audioExportUrl: URI?, private val bridgeVersion: String?, parentLogger: Logger ) : ColibriSessionManager, Cascade { @@ -81,6 +83,8 @@ class ColibriV2SessionManager( logger.info("Using ${it.javaClass.name}") } + private var sessionForAudioRecording: Colibri2Session? = null + /** * The colibri2 sessions that are currently active, mapped by the relayId of the [Bridge] that they use. */ @@ -241,7 +245,16 @@ class ColibriV2SessionManager( return Pair(session, false) } - session = Colibri2Session(this, bridge, visitor, logger) + session = Colibri2Session( + this, + bridge, + visitor, + if (audioExportUrl != null && sessionForAudioRecording == null) audioExportUrl else null, + logger + ) + if (audioExportUrl != null && sessionForAudioRecording == null) { + sessionForAudioRecording = session + } return Pair(session, true) } diff --git a/jicofo-selector/src/main/resources/reference.conf b/jicofo-selector/src/main/resources/reference.conf index fcba5ec29..0239dab9f 100644 --- a/jicofo-selector/src/main/resources/reference.conf +++ b/jicofo-selector/src/main/resources/reference.conf @@ -398,6 +398,9 @@ jicofo { # via the room-metadata service enable-live-room = false } + recording { + multi-track-recorder-url-template = "wss://example.com/recorder/MEETING_ID" + } xmpp { // Whether to use JitsiXmppStringprep to validate JIDs. If set to false uses the default validation in Smack. diff --git a/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java b/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java index d4e150335..39df8d5e0 100644 --- a/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java +++ b/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java @@ -45,6 +45,7 @@ import org.jivesoftware.smackx.caps.packet.*; import org.jxmpp.jid.*; +import java.net.*; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.*; @@ -328,12 +329,15 @@ private ColibriSessionManager getColibriSessionManager() { // We initialize colibriSessionManager only after having joined the room, so meetingId must be set. String meetingId = Objects.requireNonNull(this.meetingId); + URI multiTrackRecorderUrl = RecordingConfig.config.multiTrackRecorderUrl(meetingId); + // TODO update presence to reflect colibriSessionManager = new ColibriV2SessionManager( jicofoServices.getXmppServices().getServiceConnection().getXmppConnection(), jicofoServices.getBridgeSelector(), getRoomName().toString(), meetingId, config.getRtcStatsEnabled(), + multiTrackRecorderUrl, jvbVersion, logger); colibriSessionManager.addListener(colibriSessionManagerListener); diff --git a/pom.xml b/pom.xml index bf6a67b61..ec9cdf2aa 100644 --- a/pom.xml +++ b/pom.xml @@ -175,7 +175,7 @@ ${project.groupId} jitsi-xmpp-extensions - 1.0-80-g0ce9883 + 1.0-SNAPSHOT org.slf4j