Skip to content

Instantly share code, notes, and snippets.

@9072997
Created October 1, 2020 20:04
Show Gist options
  • Save 9072997/fb4fa282fcc486071b89cfc19e105ae0 to your computer and use it in GitHub Desktop.
Save 9072997/fb4fa282fcc486071b89cfc19e105ae0 to your computer and use it in GitHub Desktop.
Advertise an AirTame AirPlay server via mDNS (in case it is on a diffrent VLAN)
package main
import (
"fmt"
"strings"
"github.com/9072997/jgh"
"github.com/godbus/dbus"
"github.com/holoplot/go-avahi"
)
func advertiseAirplay(hostname, ip, mac string) {
// mac address without :
bareMac := strings.ReplaceAll(mac, ":", "")
conn, err := dbus.SystemBus()
jgh.PanicOnErr(err)
a, err := avahi.ServerNew(conn)
jgh.PanicOnErr(err)
eg, err := a.EntryGroupNew()
jgh.PanicOnErr(err)
err = eg.AddAddress( // add "A" record
avahi.InterfaceUnspec, // all interfaces
avahi.ProtoInet, // ipv4 only
0, // flags?
hostname+".local.", // host
ip, // ip
)
jgh.PanicOnErr(err)
err = eg.AddService( // airtunes service
avahi.InterfaceUnspec, // all interfaces
avahi.ProtoInet, // ipv4 only
0, // flags?
bareMac+"@"+hostname, // hostname
"_raop._tcp", // service name
"local", // domain
hostname+".local.", // fqdn
7000, // port
[][]byte{
[]byte("am=AppleTV5,3"),
[]byte("ch=2"),
[]byte("cn=0,1,2,3"),
[]byte("da=true"),
[]byte("et=0,3,5"),
[]byte("ft=0xA7FFFF7,0xE"),
[]byte("md=0,1,2"),
[]byte("pk=6DA52274AD060BD57E30D0B072370C198AD7A41CB9D44DBC058DE2AA5FB2DDFE"),
[]byte("pw=false"),
[]byte("rhd=5.6.0.0"),
[]byte("sf=0x4"),
[]byte("sr=44100"),
[]byte("ss=16"),
[]byte("sv=false"),
[]byte("tp=UDP"),
[]byte("txtvers=1"),
[]byte("vn=65537"),
[]byte("vs=220.68"),
[]byte("vv=2"),
},
)
jgh.PanicOnErr(err)
err = eg.AddService( // airplay service
avahi.InterfaceUnspec, // all interfaces
avahi.ProtoInet, // ipv4 only
0, // flags?
hostname, // hostname
"_airplay._tcp", // service name
"local", // domain
hostname+".local.", // fqdn
7000, // port
[][]byte{
[]byte("deviceid=" + mac),
[]byte("features=0xA7FFFF7,0xE"),
[]byte("flags=0x4"),
[]byte("model=AppleTV5,3"),
[]byte("pi=6b448552-85ce-4143-a896-e28d12e8a0ab"),
[]byte("pk=6DA52274AD060BD57E30D0B072370C198AD7A41CB9D44DBC058DE2AA5FB2DDFE"),
[]byte("pw=0"),
[]byte("srcvers=220.68"),
[]byte("vv=2"),
},
)
jgh.PanicOnErr(err)
err = eg.Commit()
jgh.PanicOnErr(err)
fmt.Println("Advertiseing:", hostname, ip, mac)
}
func main() {
advertiseAirplay("tech-conf", "10.64.16.97", "38:4b:76:e0:0d:9a")
select {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment