Skip to content

Commit dd41237

Browse files
committed
feat(room): add --track-name flag to lk room join
Tracks published via --publish previously had no way to set a name: file tracks were named after the file and socket tracks were unnamed, making them hard for subscribers to identify. Add a --track-name flag that overrides the published track name for file, socket, and simulcast publishes. Defaults are unchanged. Resolves #669
1 parent 241824e commit dd41237

3 files changed

Lines changed: 55 additions & 21 deletions

File tree

cmd/lk/join.go

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ func _deprecatedJoinRoom(ctx context.Context, cmd *cli.Command) error {
188188
_ = room.LocalParticipant.UnpublishTrack(pub.SID())
189189
}
190190
}
191-
if err = handlePublish(room, pub, fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete); err != nil {
191+
if err = handlePublish(room, pub, "", fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete); err != nil {
192192
return err
193193
}
194194
}
@@ -200,6 +200,7 @@ func _deprecatedJoinRoom(ctx context.Context, cmd *cli.Command) error {
200200

201201
func handlePublish(room *lksdk.Room,
202202
name string,
203+
trackName string,
203204
fps float64,
204205
h26xStreamingFormat string,
205206
attachFrameMetadata bool,
@@ -210,9 +211,23 @@ func handlePublish(room *lksdk.Room,
210211
if err != nil {
211212
return err
212213
}
213-
return publishSocket(room, mimeType, socketType, address, fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete)
214+
return publishSocket(room, mimeType, socketType, address, trackName, fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete)
215+
}
216+
return publishFile(room, name, trackName, fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete)
217+
}
218+
219+
// trackPublicationOptions builds publish options, preferring the user-provided
220+
// track name over the per-source default.
221+
func trackPublicationOptions(trackName, defaultName string, attachFrameMetadata bool) *lksdk.TrackPublicationOptions {
222+
name := defaultName
223+
if trackName != "" {
224+
name = trackName
225+
}
226+
return &lksdk.TrackPublicationOptions{
227+
Name: name,
228+
AttachUserTimestamp: attachFrameMetadata,
229+
AttachFrameId: attachFrameMetadata,
214230
}
215-
return publishFile(room, name, fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete)
216231
}
217232

218233
func publishDemo(room *lksdk.Room) error {
@@ -243,6 +258,7 @@ func publishDemo(room *lksdk.Room) error {
243258

244259
func publishFile(room *lksdk.Room,
245260
filename string,
261+
trackName string,
246262
fps float64,
247263
h26xStreamingFormat string,
248264
attachFrameMetadata bool,
@@ -290,11 +306,7 @@ func publishFile(room *lksdk.Room,
290306
if err != nil {
291307
return err
292308
}
293-
pub, err = room.LocalParticipant.PublishTrack(track, &lksdk.TrackPublicationOptions{
294-
Name: filename,
295-
AttachUserTimestamp: attachFrameMetadata,
296-
AttachFrameId: attachFrameMetadata,
297-
})
309+
pub, err = room.LocalParticipant.PublishTrack(track, trackPublicationOptions(trackName, filename, attachFrameMetadata))
298310
return err
299311
}
300312

@@ -336,6 +348,7 @@ func publishSocket(room *lksdk.Room,
336348
mimeType string,
337349
socketType string,
338350
address string,
351+
trackName string,
339352
fps float64,
340353
h26xStreamingFormat string,
341354
attachFrameMetadata bool,
@@ -362,13 +375,14 @@ func publishSocket(room *lksdk.Room,
362375
}
363376

364377
// Publish to room
365-
err = publishReader(room, sock, mime, fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete)
378+
err = publishReader(room, sock, mime, trackName, fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete)
366379
return err
367380
}
368381

369382
func publishReader(room *lksdk.Room,
370383
in io.ReadCloser,
371384
mime string,
385+
trackName string,
372386
fps float64,
373387
h26xStreamingFormat string,
374388
attachFrameMetadata bool,
@@ -409,10 +423,7 @@ func publishReader(room *lksdk.Room,
409423
if err != nil {
410424
return err
411425
}
412-
pub, err = room.LocalParticipant.PublishTrack(track, &lksdk.TrackPublicationOptions{
413-
AttachUserTimestamp: attachFrameMetadata,
414-
AttachFrameId: attachFrameMetadata,
415-
})
426+
pub, err = room.LocalParticipant.PublishTrack(track, trackPublicationOptions(trackName, "", attachFrameMetadata))
416427
if err != nil {
417428
return err
418429
}
@@ -519,7 +530,7 @@ type simulcastLayer struct {
519530
}
520531

521532
// handleSimulcastPublish handles publishing multiple H.264 streams as a simulcast track
522-
func handleSimulcastPublish(room *lksdk.Room, urls []string, fps float64, h26xStreamingFormat string, attachFrameMetadata bool, onPublishComplete func(*lksdk.LocalTrackPublication)) error {
533+
func handleSimulcastPublish(room *lksdk.Room, urls []string, trackName string, fps float64, h26xStreamingFormat string, attachFrameMetadata bool, onPublishComplete func(*lksdk.LocalTrackPublication)) error {
523534
// Parse all URLs
524535
var layers []simulcastLayer
525536
for _, url := range urls {
@@ -605,11 +616,7 @@ func handleSimulcastPublish(room *lksdk.Room, urls []string, fps float64, h26xSt
605616

606617
// Publish simulcast track
607618
var err error
608-
pub, err = room.LocalParticipant.PublishSimulcastTrack(tracks, &lksdk.TrackPublicationOptions{
609-
Name: "simulcast",
610-
AttachUserTimestamp: attachFrameMetadata,
611-
AttachFrameId: attachFrameMetadata,
612-
})
619+
pub, err = room.LocalParticipant.PublishSimulcastTrack(tracks, trackPublicationOptions(trackName, "simulcast", attachFrameMetadata))
613620
if err != nil {
614621
// Clean up tracks on publish failure
615622
for _, track := range tracks {

cmd/lk/join_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,27 @@ func TestParseSocketString(t *testing.T) {
8484
assert.Equal(t, err, nil, "Expected no error for valid vp8 TCP socket")
8585
}
8686

87+
func TestTrackPublicationOptions(t *testing.T) {
88+
// Default name is used when no override is given
89+
opts := trackPublicationOptions("", "video.h264", false)
90+
assert.Equal(t, "video.h264", opts.Name)
91+
assert.False(t, opts.AttachUserTimestamp)
92+
assert.False(t, opts.AttachFrameId)
93+
94+
// Override takes precedence over the default name
95+
opts = trackPublicationOptions("camera-main", "video.h264", false)
96+
assert.Equal(t, "camera-main", opts.Name)
97+
98+
// Socket publishes have no default name unless overridden
99+
opts = trackPublicationOptions("", "", false)
100+
assert.Equal(t, "", opts.Name)
101+
102+
opts = trackPublicationOptions("screen-share", "", true)
103+
assert.Equal(t, "screen-share", opts.Name)
104+
assert.True(t, opts.AttachUserTimestamp)
105+
assert.True(t, opts.AttachFrameId)
106+
}
107+
87108
func TestParseSimulcastURL(t *testing.T) {
88109
// Test TCP format
89110
parts, err := parseSimulcastURL("h264://localhost:8080/640x480")

cmd/lk/room.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ var (
160160
"Can publish from Unix or TCP socket using the format '<codec>:///<socket_path>' or '<codec>://<host:port>' respectively. Valid codecs are \"h264\", \"h265\", \"vp8\", \"opus\". " +
161161
"For simulcast: use 2-3 h264:// or h265:// URLs with format '<codec>://<host:port>/<width>x<height>' or '<codec>:///path/to/<socket_path>/<width>x<height>' (all layers must use the same codec; quality determined by width order)",
162162
},
163+
&cli.StringFlag{
164+
Name: "track-name",
165+
Usage: "`NAME` of the published track. Applies to all tracks published via --publish. " +
166+
"If unset, file tracks are named after the file and socket tracks are unnamed",
167+
},
163168
&cli.StringFlag{
164169
Name: "publish-data",
165170
Usage: "Publish user data to the room.",
@@ -996,6 +1001,7 @@ func joinRoom(ctx context.Context, cmd *cli.Command) error {
9961001

9971002
// Handle publishing
9981003
if len(publishUrls) > 0 {
1004+
trackName := cmd.String("track-name")
9991005
if simulcastMode {
10001006
// Handle simulcast publishing
10011007
fps := cmd.Float("fps")
@@ -1011,7 +1017,7 @@ func joinRoom(ctx context.Context, cmd *cli.Command) error {
10111017
}
10121018
}
10131019

1014-
if err = handleSimulcastPublish(room, publishUrls, fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete); err != nil {
1020+
if err = handleSimulcastPublish(room, publishUrls, trackName, fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete); err != nil {
10151021
return err
10161022
}
10171023
} else {
@@ -1029,7 +1035,7 @@ func joinRoom(ctx context.Context, cmd *cli.Command) error {
10291035
_ = room.LocalParticipant.UnpublishTrack(pub.SID())
10301036
}
10311037
}
1032-
if err = handlePublish(room, pub, fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete); err != nil {
1038+
if err = handlePublish(room, pub, trackName, fps, h26xStreamingFormat, attachFrameMetadata, onPublishComplete); err != nil {
10331039
return err
10341040
}
10351041
}

0 commit comments

Comments
 (0)