forked from dinofizz/diskplayer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdiskplayer.go
More file actions
157 lines (132 loc) · 3.22 KB
/
diskplayer.go
File metadata and controls
157 lines (132 loc) · 3.22 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package diskplayer
import (
"bufio"
"errors"
"fmt"
"github.com/zmb3/spotify"
"os"
"net/http"
"time"
)
// PlayPath will play an album or playlist by reading a Spotify URI from a file whose filepath is passed into the
// function.
// An error is returned if one is encountered.
func PlayPath(c Client, p string) error {
f, err := os.Open(p)
if err != nil {
return err
}
defer f.Close()
// TODO: scan them into different strings and call webhook with "event" string
s := bufio.NewScanner(f)
var l string
var lightColor string
if s.Scan() {
l = s.Text()
}
if s.Scan() {
lightColor = s.Text()
}
if l == "" {
return fmt.Errorf("unable to read line from path: %s", p)
}
if lightColor != "" {
//SetLight(lightColor)
}
return PlayUri(c, l)
}
// Set my smartbulb using ifttt and maker webhooks
func SetLight(color string) error {
url := fmt.Sprintf("https://maker.ifttt.com/trigger/%s/with/key/dvzmHn0VCQpK3mrPhZ0O96", color)
tr := &http.Transport{
MaxIdleConns: 2,
IdleConnTimeout: 3 * time.Second,
DisableCompression: true,
}
client := &http.Client{Transport: tr}
resp, err := client.Get(url)
if err != nil {
return err
}
fmt.Println(resp.Body)
resp.Body.Close()
return nil
}
// PlayURI will play the album or playlist Spotify URI that is passed in to the function.
// An error is returned if one is encountered.
func PlayUri(c Client, u string) error {
if u == "" {
return errors.New("spotify URI is required")
}
spotifyUri := spotify.URI(u)
n := ConfigValue(SPOTIFY_DEVICE_NAME)
ds, err := c.PlayerDevices()
if err != nil {
return err
}
activeID := activePlayerId(&ds)
playerID := diskplayerId(&ds, n)
if playerID == "" {
return fmt.Errorf("client identified by %s not found", n)
}
if activeID != "" && activeID != playerID {
err := c.Pause()
if err != nil {
return err
}
err = c.TransferPlayback(playerID, false)
if err != nil {
return err
}
}
o := &spotify.PlayOptions{
DeviceID: &playerID,
PlaybackContext: &spotifyUri,
}
c.Shuffle(true)
return c.PlayOpt(o)
}
// Pause will pause the Spotify playback if the Diskplayer is the currently active Spotify device.
// An error is returned if one is encountered.
func Pause(c Client) error {
n := ConfigValue(SPOTIFY_DEVICE_NAME)
ds, err := c.PlayerDevices()
if err != nil {
return err
}
activeID := activePlayerId(&ds)
if activeID == "" {
return nil
}
playerID := diskplayerId(&ds, n)
if playerID == "" {
return fmt.Errorf("client identified by %s not found", n)
}
if activeID == playerID {
err := c.Pause()
if err != nil {
return err
}
}
return nil
}
// activePlayerIds iterates through the provided player devices and returns the active ID. If there is no active
// Spotify client device the ID will be returned as a nil pointer.
func activePlayerId(ds *[]spotify.PlayerDevice) spotify.ID {
for _, d := range *ds {
if d.Active {
return d.ID
}
}
return ""
}
// diskplayerId returns the Spotify ID for the Spotify client whose name is provided in the parameter list,
// or a nil pointer if no matching device is found.
func diskplayerId(ds *[]spotify.PlayerDevice, n string) spotify.ID {
for _, d := range *ds {
if d.Name == n {
return d.ID
}
}
return ""
}