package soundbox import ( "context" "fmt" "os/exec" "net" ) // streamingPort is the default network port a soundbox is listening to for // incoming audio stream data. const streamingPort = 5316 // StreamURLContext streams audio from a given URL to one or multiple soundbox // devices. The devices are referenced via their MAC addresses given by the // targets argument. The ctx argument is passed to cancel the streaming. func StreamURLContext(ctx context.Context, url string, targets []net.HardwareAddr) error { iface, err := getInterface() if err != nil { return err } cmd := []string{ "-re", "-i", url, } for _, target := range targets { ip, err := toLinkLocal(target) if err != nil { return err } cmd = append(cmd, "-acodec") cmd = append(cmd, "flac") cmd = append(cmd, "-f") cmd = append(cmd, "ogg") cmd = append(cmd, fmt.Sprintf( "tcp://[%s%%%s]:%d", ip, iface.Name, streamingPort, )) } return exec.CommandContext(ctx, "ffmpeg", cmd...).Run() }