From a21c2cbd142a9b6bcc6f78817d9a1456a81d816c Mon Sep 17 00:00:00 2001 From: Milos Pesic Date: Fri, 9 Oct 2026 11:15:44 +0200 Subject: [PATCH] egressobs: report audio_only for v2 MediaSource without video Co-Authored-By: Claude Opus 5.5 --- .changeset/egressobs-media-audio-only.md | 6 ++ observability/egressobs/egress.go | 3 +- observability/egressobs/egress_test.go | 74 +++++++++++++++++++++++- 3 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 .changeset/egressobs-media-audio-only.md diff --git a/.changeset/egressobs-media-audio-only.md b/.changeset/egressobs-media-audio-only.md new file mode 100644 index 000000000..d1e49b84f --- /dev/null +++ b/.changeset/egressobs-media-audio-only.md @@ -0,0 +1,6 @@ +--- +"github.com/livekit/protocol": patch +"@livekit/protocol": patch +--- + +`egressobs.GetAudioOnly` reports `true` for v2 egress and replay requests with a `MediaSource` that has no video selector diff --git a/observability/egressobs/egress.go b/observability/egressobs/egress.go index 059f12370..10bd51808 100644 --- a/observability/egressobs/egress.go +++ b/observability/egressobs/egress.go @@ -201,5 +201,6 @@ func GetAudioOnly(info *livekit.EgressInfo) bool { } func getAudioOnlyV2(r egress.EgressRequest) bool { - return r.GetTemplate().GetAudioOnly() || r.GetWeb().GetAudioOnly() + return r.GetTemplate().GetAudioOnly() || r.GetWeb().GetAudioOnly() || + (r.GetMedia() != nil && r.GetMedia().GetVideo() == nil) } diff --git a/observability/egressobs/egress_test.go b/observability/egressobs/egress_test.go index 0a65f1eb3..9642632df 100644 --- a/observability/egressobs/egress_test.go +++ b/observability/egressobs/egress_test.go @@ -242,12 +242,67 @@ func TestGetAudioOnly(t *testing.T) { audioOnly: true, }, { - name: "v2 Media returns false", + name: "v2 Media audio routes only", info: &livekit.EgressInfo{ Request: &livekit.EgressInfo_Egress{ Egress: &livekit.StartEgressRequest{ Source: &livekit.StartEgressRequest_Media{ - Media: &livekit.MediaSource{}, + Media: &livekit.MediaSource{ + Audio: &livekit.AudioConfig{ + Routes: []*livekit.AudioRoute{{ + Match: &livekit.AudioRoute_ParticipantIdentity{ParticipantIdentity: "caller"}, + Channel: livekit.AudioChannel_AUDIO_CHANNEL_LEFT, + }}, + }, + }, + }, + }, + }, + }, + audioOnly: true, + }, + { + name: "v2 Media capture all audio", + info: &livekit.EgressInfo{ + Request: &livekit.EgressInfo_Egress{ + Egress: &livekit.StartEgressRequest{ + Source: &livekit.StartEgressRequest_Media{ + Media: &livekit.MediaSource{ + Audio: &livekit.AudioConfig{CaptureAll: true}, + }, + }, + }, + }, + }, + audioOnly: true, + }, + { + name: "v2 Media video track", + info: &livekit.EgressInfo{ + Request: &livekit.EgressInfo_Egress{ + Egress: &livekit.StartEgressRequest{ + Source: &livekit.StartEgressRequest_Media{ + Media: &livekit.MediaSource{ + Video: &livekit.MediaSource_VideoTrackId{VideoTrackId: "TR_video"}, + Audio: &livekit.AudioConfig{CaptureAll: true}, + }, + }, + }, + }, + }, + audioOnly: false, + }, + { + name: "v2 Media participant video", + info: &livekit.EgressInfo{ + Request: &livekit.EgressInfo_Egress{ + Egress: &livekit.StartEgressRequest{ + Source: &livekit.StartEgressRequest_Media{ + Media: &livekit.MediaSource{ + Video: &livekit.MediaSource_ParticipantVideo{ + ParticipantVideo: &livekit.ParticipantVideo{Identity: "speaker"}, + }, + }, }, }, }, @@ -267,6 +322,21 @@ func TestGetAudioOnly(t *testing.T) { }, audioOnly: true, }, + { + name: "Replay Media audio only", + info: &livekit.EgressInfo{ + Request: &livekit.EgressInfo_Replay{ + Replay: &livekit.ExportReplayRequest{ + Source: &livekit.ExportReplayRequest_Media{ + Media: &livekit.MediaSource{ + Audio: &livekit.AudioConfig{CaptureAll: true}, + }, + }, + }, + }, + }, + audioOnly: true, + }, { name: "Track request returns false", info: &livekit.EgressInfo{