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 } args := []string{ "-re", "-i", url, } for _, target := range targets { ip, err := toLinkLocal(target) if err != nil { return err } args = append(args, "-acodec") args = append(args, "flac") args = append(args, "-f") args = append(args, "ogg") args = append(args, fmt.Sprintf( "tcp://[%s%%%s]:%d", ip, iface.Name, streamingPort, )) } return exec.CommandContext(ctx, "ffmpeg", args...).Run() }