From c8706e6714a120ff7fc471365fefb5c2926c78ad Mon Sep 17 00:00:00 2001 From: mintroini Date: Mon, 12 Jun 2023 15:34:03 -0400 Subject: [PATCH 1/5] Add Spotify widget --- widget_spotify.go | 175 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 widget_spotify.go diff --git a/widget_spotify.go b/widget_spotify.go new file mode 100644 index 0000000..a3b74e6 --- /dev/null +++ b/widget_spotify.go @@ -0,0 +1,175 @@ +package main + +import ( + "errors" + "fmt" + "github.com/nfnt/resize" + "image" + "image/color" + "image/draw" + "net/http" + "strings" + "time" +) + +// SpotifyWidget is a widget that displays album art and current track position +type SpotifyWidget struct { + *BaseWidget + + fontsize float64 + color color.Color + flatten bool +} + +// NewSpotifyWidget returns a new SpotifyWidget. +func NewSpotifyWidget(bw *BaseWidget, opts WidgetConfig) (*SpotifyWidget, error) { + bw.setInterval(time.Duration(opts.Interval)*time.Millisecond, 0) + + var fontsize float64 + _ = ConfigValue(opts.Config["fontsize"], &fontsize) + var color color.Color + _ = ConfigValue(opts.Config["color"], &color) + var flatten bool + _ = ConfigValue(opts.Config["flatten"], &flatten) + + if color == nil { + color = DefaultColor + } + + w := &SpotifyWidget{ + BaseWidget: bw, + fontsize: fontsize, + color: color, + flatten: flatten, + } + + return w, nil +} + +// Parse a string like (00:00/00:00) and return the first set of numbers 00:00 +func extractFirstTimeSection(input string) (string, error) { + // Remove the parentheses and split the string into two parts + parts := strings.Split(strings.Trim(input, "()"), "/") + + // Check if the input string has the correct format + if len(parts) != 2 { + return "", fmt.Errorf("invalid input format") + } + + // Return the first time section + return parts[0], nil +} + +// LoadImage loads an image from disk. +func (w *SpotifyWidget) LoadImage(path string) (image.Image, error) { + path, err := expandPath(w.base, path) + if err != nil { + return nil, err + } + icon, err := loadImage(path) + if err != nil { + return nil, err + } + + return icon, nil +} + +// LoadImageFromURL loads an image from a URL +func (w *SpotifyWidget) LoadImageFromURL(URL string) (image.Image, error) { + //Get the response bytes from the url + response, err := http.Get(URL) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return nil, errors.New("received non 200 response code") + } + + img, _, err := image.Decode(response.Body) + if err != nil { + return nil, err + } + + return img, err +} + +// Update renders the widget. +func (w *SpotifyWidget) Update() error { + size := int(w.dev.Pixels) + margin := size / 18 + height := size - (margin * 2) + img := image.NewRGBA(image.Rect(0, 0, size, size)) + + status, err := runCommand("spotifycli --playbackstatus") + if err != nil { + icon, err := loadImage("assets/spotify/off.png") + if err != nil { + return err + } + drawImage(img, icon, size, image.Pt(0, 0)) + return w.render(w.dev, img) + } + + position, err := runCommand("spotifycli --position") + if err != nil { + return err + } + + url, err := runCommand("spotifycli --arturl") + if err != nil { + return err + } + + icon, err := w.LoadImageFromURL(url) + if err != nil { + return err + } + + iconsize := int((float64(height) / 3.0) * 2.0) + bounds := img.Bounds() + + // spotifycli --position returns a string with the following format + // (00:00/00:00), so we need to extract the first part to get the + // current playback position + position, err = extractFirstTimeSection(position) + if err != nil { + return err + } + + if icon != nil { + + icon = resize.Resize(uint(size), uint(size), icon, resize.Bilinear) + draw.Draw(img, img.Bounds(), icon, image.Pt(0, margin), draw.Over) + + if err != nil { + return err + } + + if status == string("▮▮") { + pauseIcon, err := loadImage("assets/spotify/pause.png") + pauseIcon = resize.Resize(uint(size), uint(size), pauseIcon, resize.Bilinear) + draw.Draw(img, img.Bounds(), pauseIcon, image.Pt(0, margin), draw.Over) + + if err != nil { + return err + } + + } + + bounds.Min.Y += iconsize + margin + bounds.Max.Y -= margin + } + + drawString(img, + bounds, + ttfFont, + position, + w.dev.DPI, + w.fontsize, + w.color, + image.Pt(-1, -1)) + + return w.render(w.dev, img) +} From dc98c509bffda378f0d8ab65b64d762047930572 Mon Sep 17 00:00:00 2001 From: mintroini Date: Mon, 12 Jun 2023 15:34:52 -0400 Subject: [PATCH 2/5] Add example spotify deck --- decks/spotify.deck | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 decks/spotify.deck diff --git a/decks/spotify.deck b/decks/spotify.deck new file mode 100644 index 0000000..e0364d6 --- /dev/null +++ b/decks/spotify.deck @@ -0,0 +1,29 @@ +[[keys]] + index = 0 + [keys.widget] + id = "button" + [keys.widget.config] + fontsize = 8 + label = "<<" + [keys.action] + exec = "spotifycli --prev" + +[[keys]] + index = 1 + [keys.widget] + id = "spotify" + interval = 500 + [keys.widget.config] + fontsize = 8 + [keys.action] + exec = "spotifycli --playpause" + +[[keys]] + index = 2 + [keys.widget] + id = "button" + [keys.widget.config] + fontsize = 8 + label = ">>" + [keys.action] + exec = "spotifycli --next" From e7b2c897d8da67656c8fe01560801e99dd2fd94c Mon Sep 17 00:00:00 2001 From: mintroini Date: Mon, 12 Jun 2023 15:36:18 -0400 Subject: [PATCH 3/5] add spotify case in NewWidget --- widget.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/widget.go b/widget.go index 60764b1..3c643e2 100644 --- a/widget.go +++ b/widget.go @@ -124,6 +124,9 @@ func NewWidget(dev *streamdeck.Device, base string, kc KeyConfig, bg image.Image case "weather": return NewWeatherWidget(bw, kc.Widget) + + case "spotify": + return NewSpotifyWidget(bw, kc.Widget) } // unknown widget ID From e09bcd01e9d46b4ae4b2f8b43998e4b9ccaef6df Mon Sep 17 00:00:00 2001 From: mintroini Date: Mon, 12 Jun 2023 15:37:06 -0400 Subject: [PATCH 4/5] add spotify assets --- assets/spotify/off.png | Bin 0 -> 10815 bytes assets/spotify/on.png | Bin 0 -> 10055 bytes assets/spotify/pause.png | Bin 0 -> 4223 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/spotify/off.png create mode 100644 assets/spotify/on.png create mode 100644 assets/spotify/pause.png diff --git a/assets/spotify/off.png b/assets/spotify/off.png new file mode 100644 index 0000000000000000000000000000000000000000..360090b41f5acee5e388ef76df6ca08a0e2fd388 GIT binary patch literal 10815 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 literal 0 HcmV?d00001 diff --git a/assets/spotify/pause.png b/assets/spotify/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..18c5f403425fd9f5de9cd5f5bcdcd445e6f9e46e GIT binary patch literal 4223 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 II=CzU2M6TIsQ>@~ literal 0 HcmV?d00001 From dbb9cfc69edc845354dba6697252db300629be37 Mon Sep 17 00:00:00 2001 From: mintroini Date: Mon, 12 Jun 2023 16:18:28 -0400 Subject: [PATCH 5/5] Updated instructions for spotify widget --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index c8ac30b..a31ed00 100644 --- a/README.md +++ b/README.md @@ -284,6 +284,25 @@ corresponding icons with correct names need to be placed in `~/.local/share/deckmaster/themes/[theme]`. The default icons with their respective names can be found [here](https://github.com/muesli/deckmaster/tree/master/assets/weather). +#### Spotify + +A widget that displays the current album and track position. + +```toml +[keys.widget] + id = "spotify" + interval = 500 + [keys.widget.config] + fontsize = 8 + color = "#ffffff" + +``` + +This widget depends on the [spotifycli](https://github.com/pwittchen/spotify-cli-linux) application for Linux. + +The widget will display the album along with the track position of the current song. The album art is loaded directly +from the url provided by the spotify via the spotifycli cli. + ### Actions You can hook up any key with several actions. A regular keypress will trigger