+ Temporary: Artist & Track work (if spotify_wsl is removed)

This commit is contained in:
luisegarduno 2024-04-06 19:05:41 -04:00
parent 9e43d85312
commit 6942548282
2 changed files with 48 additions and 69 deletions

View file

@ -3,45 +3,38 @@
package segments
import (
"encoding/json"
"strings"
"github.com/jandedobbeleer/oh-my-posh/src/shell"
)
type Metadata struct {
TrackID string `json:"mpris:trackid"`
Length uint64 `json:"mpris:length"`
ArtURL string `json:"mpris:artUrl"`
Album string `json:"xesam:album"`
AlbumArtist []string `json:"xesam:albumArtist"`
Artist []string `json:"xesam:artist"`
AutoRating float64 `json:"xesam:autoRating"`
DiscNumber int32 `json:"xesam:discNumber"`
Title string `json:"xesam:title"`
TrackNumber int32 `json:"xesam:trackNumber"`
URL string `json:"xesam:url"`
}
func (s *Spotify) Enabled() bool {
var err error
running := s.runLinuxScriptCommand("")
func (s *Spotify) Enable() bool {
tlist, _ := s.env.RunCommand("dbus-send", "--print-reply", "--dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata")
// Split the output into lines
lines := strings.Split(tlist, "\n")
// Extract the JSON-formatted data
var jsonData string
for _, line := range lines {
if strings.Contains(line, "variant") {
jsonData = strings.TrimSpace(line[len(" variant array ["):])
break
}
if strings.HasPrefix(running, "ERROR") {
return false
}
if strings.Contains(running, "Error.ServiceUnknown") || strings.HasSuffix(running, "-") {
s.Status = stopped
return false
}
s.Status = playing
if err != nil {
s.Status = stopped
return false
}
if s.Status == stopped {
return false
}
var metadata []Metadata
// Parsing JSON data from the output string
if err := json.Unmarshal([]byte(jsonData), &metadata); err != nil {
return true
}
return false
s.Artist = s.runLinuxScriptCommand(" | awk -F '\"' 'BEGIN {RS=\"entry\"}; /'xesam:artist'/ {a=$4} END {print a}'")
s.Track = s.runLinuxScriptCommand(" | awk -F '\"' 'BEGIN {RS=\"entry\"}; /'xesam:title'/ {t=$4} END {print t}'")
s.resolveIcon()
return true
}
func (s *Spotify) runLinuxScriptCommand(command string) string {
val := s.env.RunShellCommand(shell.BASH, "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata"+command)
return val
}

View file

@ -1,61 +1,47 @@
//go:build !darwin && !windows
//go:build linux && !darwin && !windows
package segments
import (
"errors"
"testing"
"github.com/jandedobbeleer/oh-my-posh/src/mock"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/shell"
"github.com/stretchr/testify/assert"
)
func TestSpotifyLinux(t *testing.T) {
cases := []struct {
Case string
ExpectedString string
ExpectedEnabled bool
Title string
Artist string
Track string
Error error
Running bool
Expected string
Status string
Artist string
Track string
Error error
}{
{
Case: "Playing",
ExpectedString: "Sarah, the Illstrumentalist - Snow in Stockholm",
ExpectedEnabled: true,
Title: "Snow in Stockholm - Sarah, the Illstrumentalist",
Artist: "Sarah, the Illstrumentalist",
Track: "Snow in Stockholm",
},
{
Case: "Stopped",
ExpectedEnabled: true,
ExpectedString: "-",
},
{Running: false, Expected: "\uE602 -", Error: errors.New("oops")},
{Running: true, Expected: "\uE602 Candlemass - Spellbreaker", Status: "playing", Artist: "Candlemass", Track: "Spellbreaker"},
{Running: true, Expected: "\uE602 Candlemass - Spellbreaker", Status: "paused", Artist: "Candlemass", Track: "Spellbreaker"},
}
for _, tc := range cases {
env := new(mock.MockedEnvironment)
env.On("RunCommand", "dbus-send", []string{
"--print-reply",
"--dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata",
}).Return(tc.Track+" "+tc.Artist, nil)
env.On("IsWsl").Return(false)
env.On("RunShellCommand", shell.BASH, "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata").Return(tc.Status, nil)
env.On("RunShellCommand", shell.BASH, "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata | awk -F '\"' 'BEGIN {RS=\"entry\"}; /'xesam:artist'/ {a=$4} END {print a}'").Return(tc.Artist, nil)
env.On("RunShellCommand", shell.BASH, "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata | awk -F '\"' 'BEGIN {RS=\"entry\"}; /'xesam:title'/ {t=$4} END {print t}'").Return(tc.Track, nil)
s := &Spotify{
env: env,
props: properties.Map{},
MusicPlayer: MusicPlayer{
Artist: tc.Artist,
Track: tc.Track,
},
}
enable := s.Enable()
enable := s.Enabled()
assert.True(t, enable)
if tc.ExpectedEnabled {
assert.True(t, s.Enable())
assert.Equal(t, tc.ExpectedString, renderTemplate(env, s.Template(), s))
if tc.Running {
assert.True(t, s.Enabled())
assert.Equal(t, tc.Expected, renderTemplate(env, s.Template(), s))
}
}
}