diff --git a/backend/player/player.go b/backend/player/player.go
new file mode 100644
index 0000000..214ce45
--- /dev/null
+++ b/backend/player/player.go
@@ -0,0 +1,58 @@
+package player
+
+import (
+ "context"
+ "fmt"
+ "os"
+ "time"
+
+ "github.com/gopxl/beep/mp3"
+ "github.com/gopxl/beep/speaker"
+)
+
+type Player struct {
+ ctx context.Context
+ state PlayerState
+}
+
+type PlayerState int
+
+const (
+ Playing PlayerState = iota
+ Paused
+ Stopped
+)
+
+func NewPlayer() *Player {
+ return &Player{}
+}
+
+func (p *Player) Init(ctx context.Context) {
+ p.ctx = ctx
+ p.state = Stopped
+}
+
+func (p *Player) ChangeState(desiredState PlayerState) error {
+ return nil
+}
+
+func (p *Player) Play() error {
+ f, err := os.Open("test_data/music_library_test/03 anything.mp3")
+ if err != nil {
+ return fmt.Errorf("Failed to open file %w", err)
+ }
+
+ streamer, format, err := mp3.Decode(f)
+ if err != nil {
+ return fmt.Errorf("Failed to decode mp3 %w", err)
+ }
+ defer streamer.Close()
+
+ err = speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))
+ if err != nil {
+ return fmt.Errorf("Failed to initialize speaker %w", err)
+ }
+ speaker.Play(streamer)
+ select {}
+ return nil
+}
diff --git a/frontend/index.html b/frontend/index.html
index c4bfe31..74948e5 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -46,6 +46,11 @@
+
+
+