From 99dc857d4191ee82e4da2f72772199af90714bc8 Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Sun, 10 Dec 2023 21:33:54 +0100 Subject: [PATCH 1/2] add mpd status messages --- NOTES.md | 11 ++ favicon.xcf | Bin 0 -> 27944 bytes flake.lock | 18 ++-- mpd.go | 190 +++++++++++++++++++++++++++++++++++ server.go | 244 +++++++++++---------------------------------- static/favicon.ico | Bin 0 -> 67814 bytes static/test.html | 71 +++++++++++++ 7 files changed, 338 insertions(+), 196 deletions(-) create mode 100644 favicon.xcf create mode 100644 mpd.go create mode 100644 static/favicon.ico create mode 100644 static/test.html diff --git a/NOTES.md b/NOTES.md index d3ce923..793ee3e 100644 --- a/NOTES.md +++ b/NOTES.md @@ -18,3 +18,14 @@ - [ ] save playlist - [ ] delete playlist +# mpd state + +- [x] state ("play", "stop", "pause") +- [x] repeat +- [ ] shuffle +- [ ] xfade +- [x] volume +- [x] track length/progress + - [x] track progress (seek) +- [ ] track name + diff --git a/favicon.xcf b/favicon.xcf new file mode 100644 index 0000000000000000000000000000000000000000..65f9164de573be349169f8d00295bb7666f678c2 GIT binary patch literal 27944 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

E1%_!FS`mfag-+wQwvN19-{9=-5e!JG3 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 100 || level < 0 { + return c.String(http.StatusBadRequest, "Volume must be between 0 and 100") + } + + err = conn.SetVolume(level) + if err != nil { + log.Fatalln(err) + } + + return c.String(http.StatusOK, "") +} diff --git a/server.go b/server.go index 80d1eec..aa1a168 100644 --- a/server.go +++ b/server.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "fmt" "github.com/fhs/gompd/v2/mpd" "github.com/labstack/echo-contrib/echoprometheus" @@ -9,9 +10,9 @@ import ( "golang.org/x/net/websocket" "log" "net/http" - "strconv" + "os" + "os/exec" "strings" - "time" ) func main() { @@ -56,17 +57,25 @@ func main() { g.GET("/random", toggleRandom) g.GET("/volume/:level", setVolume) + g.GET("/download", downloadTrack) + e.GET("/ws", wsServe) - e.Logger.Fatal(e.StartTLS(":1323", "cert.pem", "key.pem")) - //e.Logger.Fatal(e.Start(":1323")) + //e.Logger.Fatal(e.StartTLS(":1323", "cert.pem", "key.pem")) + e.Logger.Fatal(e.Start(":1323")) } func wsServe(c echo.Context) error { - fmt.Println("wsServe") websocket.Handler(func(ws *websocket.Conn) { defer ws.Close() - fmt.Println("handler") + + // Connect to MPD server + mpdConn, err := mpd.Dial("tcp", "localhost:6600") + if err != nil { + log.Fatalln(err) + } + defer mpdConn.Close() + for { // Read msg := "" @@ -75,205 +84,66 @@ func wsServe(c echo.Context) error { c.Logger().Error(err) break } else { - if strings.HasPrefix(strings.ToUpper(msg), "MPD#") { - // Forward MPD communication - // TODO: forward request to mpd and response back to client - err := websocket.Message.Send(ws, "MPD command received, processing... processing...") + log.Println(msg) + if strings.ToLower(msg) == "#status" { + // TODO: Get current MPD status and return it + status, err := mpdConn.Status() + if err != nil { + log.Fatalln(err) + } + jsonData, err := json.Marshal(status) + if err != nil { + log.Fatalln(err) + } + err = websocket.Message.Send(ws, fmt.Sprintf("{\"mpd_status\":%s}", string(jsonData))) if err != nil { c.Logger().Error(err) } - } else if strings.HasPrefix(strings.ToUpper(msg), "YT#") { + } else if strings.HasPrefix(strings.ToLower(msg), "#download ") { // Download video link as audio file + uri := strings.SplitN(msg, " ", 2)[1] // TODO: implement yt-dlp integration - err := websocket.Message.Send(ws, "YT-DLP command received, processing... processing...") + err := websocket.Message.Send(ws, fmt.Sprintf("Downloading %s", uri)) if err != nil { c.Logger().Error(err) } } } - //fmt.Println(msg) } }).ServeHTTP(c.Response(), c.Request()) return nil } -// API calls +func downloadTrack(c echo.Context) error { + // yt-dlp \ + // --no-wait-for-video \ + // --no-playlist \ + // --windows-filenames \ + // --newline \ + // --extract-audio \ + // --audio-format mp3 \ + // --audio-quality 0 \ + // -f bestaudio/best \ + // ${video_url} -func previousTrack(c echo.Context) error { - // Connect to MPD server - conn, err := mpd.Dial("tcp", "localhost:6600") - if err != nil { - log.Fatalln(err) - } - defer conn.Close() - - err = conn.Previous() - if err != nil { + cmd := exec.Command( + "yt-dlp", + "--no-wait-for-video", + "--no-playlist", + "--windows-filenames", + "--newline", + "--extract-audio", + "--audio-format", "mp3", + "--audio-quality", "0", + "--format", "bestaudio/best", + c.Param("url"), + ) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { log.Fatalln(err) } - return c.String(http.StatusNoContent, "") -} - -func nextTrack(c echo.Context) error { - // Connect to MPD server - conn, err := mpd.Dial("tcp", "localhost:6600") - if err != nil { - log.Fatalln(err) - } - defer conn.Close() - - err = conn.Next() - if err != nil { - log.Fatalln(err) - } - - return c.String(http.StatusNoContent, "") -} - -func stopPlayback(c echo.Context) error { - // Connect to MPD server - conn, err := mpd.Dial("tcp", "localhost:6600") - if err != nil { - log.Fatalln(err) - } - defer conn.Close() - - err = conn.Stop() - if err != nil { - log.Fatalln(err) - } - - return c.String(http.StatusNoContent, "") -} - -func resumePlayback(c echo.Context) error { - // Connect to MPD server - conn, err := mpd.Dial("tcp", "localhost:6600") - if err != nil { - log.Fatalln(err) - } - defer conn.Close() - - err = conn.Pause(false) - if err != nil { - log.Fatalln(err) - } - - return c.String(http.StatusNoContent, "") -} - -func pausePlayback(c echo.Context) error { - // Connect to MPD server - conn, err := mpd.Dial("tcp", "localhost:6600") - if err != nil { - log.Fatalln(err) - } - defer conn.Close() - - err = conn.Pause(true) - if err != nil { - log.Fatalln(err) - } - - return c.String(http.StatusNoContent, "") -} - -func seek(c echo.Context) error { - // Connect to MPD server - conn, err := mpd.Dial("tcp", "localhost:6600") - if err != nil { - log.Fatalln(err) - } - defer conn.Close() - - seconds, err := strconv.Atoi(c.Param("seconds")) - if err != nil { - log.Fatalln(err) - } - - if seconds < 0 { - return c.String(http.StatusBadRequest, "seconds must be positive integer") - } - - err = conn.SeekCur(time.Duration(seconds)*time.Second, false) - if err != nil { - log.Fatalln(err) - } - - return c.String(http.StatusNoContent, "") -} - -func toggleRepeat(c echo.Context) error { - // Connect to MPD server - conn, err := mpd.Dial("tcp", "localhost:6600") - if err != nil { - log.Fatalln(err) - } - defer conn.Close() - - status, err := conn.Status() - if err != nil { - log.Fatalln(err) - } - if status["repeat"] == "1" { - err = conn.Repeat(false) - } else { - err = conn.Repeat(true) - } - if err != nil { - log.Fatalln(err) - } - - return c.String(http.StatusNoContent, "") -} - -func toggleRandom(c echo.Context) error { - // Connect to MPD server - conn, err := mpd.Dial("tcp", "localhost:6600") - if err != nil { - log.Fatalln(err) - } - defer conn.Close() - - status, err := conn.Status() - if err != nil { - log.Fatalln(err) - } - if status["toggleRandom"] == "1" { - err = conn.Random(false) - } else { - err = conn.Random(true) - } - if err != nil { - log.Fatalln(err) - } - - return c.String(http.StatusNoContent, "") -} - -func setVolume(c echo.Context) error { - // Connect to MPD server - conn, err := mpd.Dial("tcp", "localhost:6600") - if err != nil { - log.Fatalln(err) - } - defer conn.Close() - - level, err := strconv.Atoi(c.Param("level")) - if err != nil { - log.Fatalln(err) - } - - if level > 100 || level < 0 { - return c.String(http.StatusBadRequest, "Volume must be between 0 and 100") - } - - err = conn.SetVolume(level) - if err != nil { - log.Fatalln(err) - } - - return c.String(http.StatusNoContent, "") + return c.String(http.StatusAccepted, "") } diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6681b0e8122e0b2e2e9061e0d35bd90590142923 GIT binary patch literal 67814 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%0DAjME$u`MQ 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 literal 0 HcmV?d00001 diff --git a/static/test.html b/static/test.html new file mode 100644 index 0000000..ed7c9e9 --- /dev/null +++ b/static/test.html @@ -0,0 +1,71 @@ + + + + API test + + + + + + + + + From af8b50d464f2167936febf3b612f4a3e04929824 Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Tue, 26 Dec 2023 17:23:53 +0100 Subject: [PATCH 2/2] add config file --- config.ini | 12 ++++++++++++ go.mod | 1 + go.sum | 2 ++ server.go | 38 ++++++++++++++++++++++++++++++++++++-- 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 config.ini diff --git a/config.ini b/config.ini new file mode 100644 index 0000000..3f54744 --- /dev/null +++ b/config.ini @@ -0,0 +1,12 @@ +[mpd] +host = localhost +port = 6600 +#username = +#pasword = + +[ui] +hostname = localhost +port = 8080 +tls = no +cert = cert.pem +key = key.pem diff --git a/go.mod b/go.mod index 25cad23..a81631f 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/labstack/echo-contrib v0.15.0 github.com/labstack/echo/v4 v4.11.2 golang.org/x/net v0.17.0 + gopkg.in/ini.v1 v1.67.0 ) require ( diff --git a/go.sum b/go.sum index c6db544..153f4b9 100644 --- a/go.sum +++ b/go.sum @@ -80,6 +80,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/server.go b/server.go index aa1a168..fbd02c5 100644 --- a/server.go +++ b/server.go @@ -8,6 +8,7 @@ import ( "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" "golang.org/x/net/websocket" + "gopkg.in/ini.v1" "log" "net/http" "os" @@ -15,7 +16,37 @@ import ( "strings" ) +type Config struct { + MPD struct { + Hostname string `ini:"hostname"` + Port int `ini:"port"` + Username string `ini:"username"` + Password string `ini:"password"` + } `ini:"mpd"` + UI struct { + Hostname string `ini:"hostname"` + Port int `ini:"port"` + Tls bool `ini:"tls"` + Certificate string `ini:"cert"` + Key string `ini:"key"` + } `ini:"ui"` +} + func main() { + iniData, err := ini.Load("config.ini") + if err != nil { + fmt.Printf("Fail to read configuration file: %v", err) + os.Exit(1) + } + + var config Config + + err = iniData.MapTo(&config) + if err != nil { + fmt.Printf("Fail to parse configuration file: %v", err) + os.Exit(1) + } + e := echo.New() e.Use(middleware.Logger()) e.Use(middleware.Recover()) @@ -61,8 +92,11 @@ func main() { e.GET("/ws", wsServe) - //e.Logger.Fatal(e.StartTLS(":1323", "cert.pem", "key.pem")) - e.Logger.Fatal(e.Start(":1323")) + if config.UI.Tls { + e.Logger.Fatal(e.StartTLS(fmt.Sprintf("%s:%d", config.UI.Hostname, config.UI.Port), config.UI.Certificate, config.UI.Key)) + } else { + e.Logger.Fatal(e.Start(fmt.Sprintf("%s:%d", config.UI.Hostname, config.UI.Port))) + } } func wsServe(c echo.Context) error {