From 28dd6b6ae32e0cccdaf6486fb76c6b7f98647f27 Mon Sep 17 00:00:00 2001 From: Franck Cuny Date: Sat, 9 Oct 2021 17:20:22 -0700 Subject: scrobbler: watch for events and print song details We create a module "mpd" to interact with our MPD instance. For now we only have a single function to create a new client, which creates an actual client for mpd (and we ping the instance every 30 seconds), and a watcher to receive new events. The tool "scrobbler" then wait for new events and display songs information. --- internal/mpd/mpd.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 internal/mpd/mpd.go (limited to 'internal/mpd') diff --git a/internal/mpd/mpd.go b/internal/mpd/mpd.go new file mode 100644 index 0000000..8991adc --- /dev/null +++ b/internal/mpd/mpd.go @@ -0,0 +1,38 @@ +package mpd + +import ( + "log" + "time" + + "github.com/fhs/gompd/v2/mpd" +) + +type player struct { + Watcher *mpd.Watcher + Client *mpd.Client +} + +func NewMPD(net string, addr string) (*player, error) { + var ( + p player + err error + ) + + p.Watcher, err = mpd.NewWatcher(net, addr, "", "player") + if err != nil { + log.Fatalf("failed to create a watcher: %v", err) + } + + p.Client, err = mpd.Dial(net, addr) + if err != nil { + log.Fatalf("failed to start mpd client: %v", err) + } + + go func() { + for range time.Tick(30 * time.Second) { + p.Client.Ping() + } + }() + + return &p, nil +} -- cgit v1.2.3 From 14e16c0b3818a68cf3a1f26f9cd7461481d00e4d Mon Sep 17 00:00:00 2001 From: Franck Cuny Date: Sun, 10 Oct 2021 11:32:10 -0700 Subject: mpd: rename function to create the player --- internal/mpd/mpd.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'internal/mpd') diff --git a/internal/mpd/mpd.go b/internal/mpd/mpd.go index 8991adc..ed9d3c2 100644 --- a/internal/mpd/mpd.go +++ b/internal/mpd/mpd.go @@ -12,7 +12,7 @@ type player struct { Client *mpd.Client } -func NewMPD(net string, addr string) (*player, error) { +func NewPlayer(net string, addr string) (*player, error) { var ( p player err error -- cgit v1.2.3 From 5caeabc351feffb1769b842e8d79481f330c46d9 Mon Sep 17 00:00:00 2001 From: Franck Cuny Date: Sun, 10 Oct 2021 11:34:07 -0700 Subject: mpd: add function `Close` to the player Let's close both the watcher and the client, instead of leaking this interface to the user. --- internal/mpd/mpd.go | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'internal/mpd') diff --git a/internal/mpd/mpd.go b/internal/mpd/mpd.go index ed9d3c2..cebf2b2 100644 --- a/internal/mpd/mpd.go +++ b/internal/mpd/mpd.go @@ -36,3 +36,13 @@ func NewPlayer(net string, addr string) (*player, error) { return &p, nil } + +func (p *player) Close() error { + if err := p.Watcher.Close(); err != nil { + return err + } + if err := p.Client.Close(); err != nil { + return err + } + return nil +} -- cgit v1.2.3 From 7076c83408f4525140718d1b6cc7c90ae828b8f2 Mon Sep 17 00:00:00 2001 From: Franck Cuny Date: Sun, 10 Oct 2021 11:37:19 -0700 Subject: mpd: export the type Player --- internal/mpd/mpd.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'internal/mpd') diff --git a/internal/mpd/mpd.go b/internal/mpd/mpd.go index cebf2b2..5b57ee4 100644 --- a/internal/mpd/mpd.go +++ b/internal/mpd/mpd.go @@ -7,14 +7,14 @@ import ( "github.com/fhs/gompd/v2/mpd" ) -type player struct { +type Player struct { Watcher *mpd.Watcher Client *mpd.Client } -func NewPlayer(net string, addr string) (*player, error) { +func NewPlayer(net string, addr string) (*Player, error) { var ( - p player + p Player err error ) @@ -37,7 +37,7 @@ func NewPlayer(net string, addr string) (*player, error) { return &p, nil } -func (p *player) Close() error { +func (p *Player) Close() error { if err := p.Watcher.Close(); err != nil { return err } -- cgit v1.2.3