summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxengineering <me@xengineering.eu>2024-10-07 21:53:38 +0200
committerxengineering <me@xengineering.eu>2024-10-07 21:55:50 +0200
commitb03cf32bef7e34c4886a3b7300ffc0132b310a5b (patch)
tree33191d1c5bccb324d6b3e5b37f15296bbffb4031
parent293965c55615bb072843500cc3af44c0e266dfcd (diff)
downloadsoundbox-app-b03cf32bef7e34c4886a3b7300ffc0132b310a5b.tar
soundbox-app-b03cf32bef7e34c4886a3b7300ffc0132b310a5b.tar.zst
soundbox-app-b03cf32bef7e34c4886a3b7300ffc0132b310a5b.zip
Parse config at startup
-rw-r--r--config.go23
-rw-r--r--main.go36
2 files changed, 38 insertions, 21 deletions
diff --git a/config.go b/config.go
index a4f2805..e187827 100644
--- a/config.go
+++ b/config.go
@@ -3,15 +3,34 @@ package main
import (
"encoding/json"
"io"
+ "net"
"os"
"path/filepath"
)
const configPathRelative = `.config/soundbox/config.json`
+type MacAddress net.HardwareAddr
+
+func (m *MacAddress) UnmarshalJSON(data []byte) error {
+ var macStr string
+ err := json.Unmarshal(data, &macStr)
+ if err != nil {
+ return err
+ }
+
+ hwAddr, err := net.ParseMAC(macStr)
+ if err != nil {
+ return err
+ }
+
+ *m = MacAddress(hwAddr)
+ return nil
+}
+
type SoundboxConfig struct {
- Name string `json:"name"`
- Mac string `json:"mac"`
+ Name string `json:"name"`
+ Mac MacAddress `json:"mac"`
}
type URLConfig struct {
diff --git a/main.go b/main.go
index 94b94c7..8302155 100644
--- a/main.go
+++ b/main.go
@@ -20,7 +20,12 @@ import (
)
func main() {
- ui := NewUi()
+ config, err := loadConfig()
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ ui := NewUi(config)
go func() {
err := ui.Run()
if err != nil {
@@ -33,6 +38,7 @@ func main() {
type State struct {
sync.Mutex
+ Config GlobalConfig
Theme *material.Theme
Title string
UrlEditor widget.Editor
@@ -47,9 +53,11 @@ type Ui struct {
State State
}
-func NewUi() *Ui {
+func NewUi(config GlobalConfig) *Ui {
ui := Ui{}
+ ui.State.Config = config
+
ui.State.Theme = material.NewTheme()
ui.Window = new(app.Window)
@@ -95,7 +103,11 @@ func (ui *Ui) HandleInputs(gtx layout.Context) {
ui.State.PlayerCancel()
} else {
ui.State.PlayerContext, ui.State.PlayerCancel = context.WithCancel(context.Background())
- go play(ui.State.PlayerContext, ui.State.UrlEditor.Text(), ui)
+ var targets []net.HardwareAddr
+ for _, entry := range ui.State.Config.Soundboxes {
+ targets = append(targets, net.HardwareAddr(entry.Mac))
+ }
+ go play(ui.State.PlayerContext, ui.State.UrlEditor.Text(), targets, ui)
}
}
}
@@ -131,7 +143,7 @@ func (ui *Ui) Layout(gtx layout.Context) layout.Dimensions {
})
}
-func play(ctx context.Context, url string, ui *Ui) {
+func play(ctx context.Context, url string, targets []net.HardwareAddr, ui *Ui) {
setPlayingState := func(isPlaying bool) {
ui.State.Lock()
defer ui.Window.Invalidate()
@@ -148,21 +160,7 @@ func play(ctx context.Context, url string, ui *Ui) {
setPlayingState(true)
defer setPlayingState(false)
- config, err := loadConfig()
- if err != nil {
- log.Println(err)
- }
-
- var devices []net.HardwareAddr
- for _, entry := range config.Soundboxes {
- mac, err := net.ParseMAC(entry.Mac)
- if err != nil {
- log.Printf("Failed to parse MAC: %v", err)
- }
- devices = append(devices, mac)
- }
-
- err = soundbox.StreamURLContext(ctx, url, devices)
+ err := soundbox.StreamURLContext(ctx, url, targets)
if err != nil {
log.Println(err)
}