forked from ninjasphere/driver-upnp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
driver.go
112 lines (85 loc) · 2.23 KB
/
driver.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package main
import (
"time"
"github.com/davecgh/go-spew/spew"
"github.com/huin/goupnp"
"github.com/ninjasphere/go-ninja/api"
"github.com/ninjasphere/go-ninja/logger"
"github.com/ninjasphere/go-ninja/support"
"github.com/ninjasphere/goupnp/dcps/av"
)
var info = ninja.LoadModuleInfo("./package.json")
var log = logger.GetLogger(info.Name)
type Driver struct {
support.DriverSupport
devices map[string]*MediaPlayer
}
func NewDriver() (*Driver, error) {
driver := &Driver{
devices: make(map[string]*MediaPlayer),
}
err := driver.Init(info)
if err != nil {
log.Fatalf("Failed to initialize driver: %s", err)
}
err = driver.Export(driver)
if err != nil {
log.Fatalf("Failed to export driver: %s", err)
}
return driver, nil
}
func (d *Driver) getDevice(upnpDevice goupnp.Device) (*MediaPlayer, error) {
id := upnpDevice.UDN
player, ok := d.devices[id]
var err error
if !ok {
player, err = NewMediaPlayer(d, d.Conn, id, upnpDevice)
d.devices[id] = player
}
return player, err
}
func (d *Driver) Start(_ interface{}) error {
log.Infof("Driver Starting")
go func() {
for {
d.Search()
time.Sleep(time.Minute)
}
}()
return nil
}
func (d *Driver) Search() error {
transportClients, errors, err := av.NewAVTransport1Clients()
if err != nil {
log.Fatalf("Failed to find transport clients: %s", err)
}
for _, e := range errors {
log.Warningf("Error finding transport clients: %s", e)
}
for _, client := range transportClients {
spew.Dump(client)
device, err := d.getDevice(client.ServiceClient.RootDevice.Device)
if err != nil {
log.Warningf("Found a transport client, but couldn't create the device. %s", err)
continue
}
device.SetTransportClient(client)
}
renderingClients, errors, err := av.NewRenderingControl1Clients()
if err != nil {
log.Fatalf("Failed to find rendering clients: %s", err)
}
for _, e := range errors {
log.Warningf("Error finding rendering clients: %s", e)
}
for _, client := range renderingClients {
spew.Dump(client)
device, err := d.getDevice(client.ServiceClient.RootDevice.Device)
if err != nil {
log.Warningf("Found a rendering client, but couldn't create the device. %s", err)
continue
}
device.SetRenderingClient(client)
}
return nil
}