-
Notifications
You must be signed in to change notification settings - Fork 1
/
autopause.go
69 lines (56 loc) · 1.14 KB
/
autopause.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
package main
import (
"bufio"
"fmt"
"os/exec"
"strings"
)
type PlayerStatus struct {
player string
status string
}
func autopause(players []string) {
statusChan := make(chan PlayerStatus)
playerStatus := map[string]string{}
for _, v := range players {
go watchStatus(v, statusChan)
}
stopped := ""
stopper := ""
for val := range statusChan {
if val.status == "Playing" {
for p, s := range playerStatus {
if s == "Playing" {
stopped = p
stopper = val.player
pause(p)
}
}
} else if val.player != stopped && stopped != "" {
s := status(stopper)
if s != "Playing" && s != "Paused" {
play(stopped)
stopped = ""
stopper = ""
}
}
playerStatus[val.player] = val.status
}
}
func watchStatus(player string, statusChan chan PlayerStatus) {
cmd := exec.Command("playerctl", fmt.Sprintf("--player=%s", player), "status", "-F")
pipe, err := cmd.StdoutPipe()
if err != nil {
panic(err)
}
scanner := bufio.NewScanner(pipe)
go func() {
for scanner.Scan() {
statusChan <- PlayerStatus{
player: player,
status: strings.TrimSpace(scanner.Text()),
}
}
}()
cmd.Start()
}