current actual spotify na barra de status do dwm

6

Estou tentando fazer com que a faixa atual seja reproduzida no spotify em minha barra de status do dwm. Cheguei ao ponto em que recebo as informações com esse comando.

enter code heredbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata'

O resultado é este:

method return sender=:1.0 -> dest=:1.15 reply_serial=2
variant       array [
     dict entry(
        string "mpris:artUrl"
        variant                string "http://open.spotify.com/thumb/45656b0961cba1598d127c3404ad276acb8e961b"
     )
     dict entry(
        string "mpris:length"
        variant                uint64 308000000
     )
     dict entry(
        string "mpris:trackid"
        variant                string "spotify:track:7oGXMMrB78C5tQhumQ2jfZ"
     )
     dict entry(
        string "xesam:album"
        variant                string "Chopin"
     )
     dict entry(
        string "xesam:artist"
        variant                array [
              string "Frederic Chopin"
           ]
     )
     dict entry(
        string "xesam:autoRating"
        variant                double 0.57
     )
     dict entry(
        string "xesam:contentCreated"
        variant                string "2009-01-01T00:00:00"
     )
     dict entry(
        string "xesam:discNumber"
        variant                int32 0
     )
     dict entry(
        string "xesam:title"
        variant                string "Waltz No. 1 in E flat Major, Op. 18"
     )
     dict entry(
        string "xesam:trackNumber"
        variant                int32 8
     )
     dict entry(
        string "xesam:url"
        variant                string "spotify:track:7oGXMMrB78C5tQhumQ2jfZ"
     )
  ]

Então, minha pergunta é como obter a entrada "xesam: artist" e "xesam: title" do resultado para que eu possa colocá-la na minha barra de status?

    
por lup3x 29.11.2013 / 23:40

5 respostas

4

Isso seria muito mais simples se fosse JSON bem formatado, então você poderia usar uma ferramenta como jshon para interrogar de forma inteligente os dados .

É possível usar awk , mas depende da saída consistente:

awk 'BEGIN {RS=" entry\("; FS="\""}; /artist/ {artist = $4}; /title/ {title = $4} END { print artist": "title}' spotify_output                      
Frederic Chopin: Waltz No. 1 in E flat Major, Op. 18

Essencialmente, o arquivo é dividido alterando o separador de registro ( RS ) para os vários blocos de entrada ( entry( ) e os campos dentro desses registros são delimitados alterando o separador de campo ( FS ) de o padrão (um espaço) para as marcas de aspas ( " ) que contêm os valores que você está procurando.

De lá, é apenas correspondência de padrões (por exemplo, /artist/ ).

    
por 18.06.2014 / 00:28
4

Se você precisar apenas do artista e do título, sugiro usar xprop para obter a propriedade _NET_WM_ICON_NAME do Spotify.

xprop -name "Spotify Free - Linux Preview" _NET_WM_ICON_NAME

oferece:

_NET_WM_ICON_NAME(UTF8_STRING) = "Spotify - Stereophonics – Indian Summer"

você pode usar cut para obter a parte entre aspas:

xprop -name "Spotify Free - Linux Preview" _NET_WM_ICON_NAME|\
cut -d "\"" -f 2

pule a parte inicial "Spotify - " novamente usando o corte:

xprop -name "Spotify Free - Linux Preview" _NET_WM_ICON_NAME|\
cut -d "\"" -f 2|cut -b 11-

O artista e o título são separados por este traço: . Note que é diferente disso: -

Você pode usar o awk para separar os dois:

xprop -name "Spotify Free - Linux Preview" _NET_WM_ICON_NAME|\
cut -d "\"" -f 2|cut -b 11-|awk -F " – " '{print $1}'

apresenta o artista: "Stereophonics"

xprop -name "Spotify Free - Linux Preview" _NET_WM_ICON_NAME|\
cut -d "\"" -f 2|cut -b 11-|awk -F " – " '{print $2}'

dá-lhe o título: "Indian Summer"

    
por 10.08.2014 / 19:55
0

Aqui está uma solução baseada em sp pelo usuário do GitHub wandernauta :

SP_VERSION="0.1"
SP_DEST="org.mpris.MediaPlayer2.spotify"
SP_PATH="/org/mpris/MediaPlayer2"
SP_MEMB="org.mpris.MediaPlayer2.Player"

SPOTIFY_METADATA="$(dbus-send                                                 \
 --print-reply                                  '# We need the reply.'       \
 --dest=$SP_DEST                                                             \
 $SP_PATH                                                                    \
 org.freedesktop.DBus.Properties.Get                                         \
 string:"$SP_MEMB" string:'Metadata'                                         \
 | grep -Ev "^method"                           '# Ignore the first line.'   \
 | grep -Eo '("(.*)")|(\b[0-9][a-zA-Z0-9.]*\b)' '# Filter interesting fiels.'\
 | sed -E '2~2 a|'                              '# Mark odd fields.'         \
 | tr -d '\n'                                   '# Remove all newlines.'     \
 | sed -E 's/\|/\n/g'                           '# Restore newlines.'        \
 | sed -E 's/(xesam:)|(mpris:)//'               '# Remove ns prefixes.'      \
 | sed -E 's/^"//'                              '# Strip leading...'         \
 | sed -E 's/"$//'                              '# ...and trailing quotes.'  \
 | sed -E 's/\"+/|/'                             '# Regard "" as seperator.'  \
 | sed -E 's/ +/ /g'                            '# Merge consecutive spaces.'\
)"

TrackArtist=$(echo "$SPOTIFY_METADATA" | sed -n 's/artist|//p')
TrackTitle=$(echo "$SPOTIFY_METADATA" | sed -n 's/title|//p')
    
por 30.01.2015 / 04:58
0

Eu usei o wmctrl da seguinte maneira:

wmctrl -lx | grep spotify | cut -c X-

onde X é algum número que funciona;)

    
por 04.04.2018 / 13:51
0

Instalei playerctl para essa tarefa (e para gerenciar o spotify com chaves dwm como META + F8 (alternar reprodução)).

Então pode-se usar por exemplo assim:

status=$(playerctl -p spotify status)
artist=$(playerctl -p spotify metadata artist)
album=$(playerctl -p spotify metadata album)
title=$(playerctl -p spotify metadata title)
length=$(playerctl -p spotify metadata mpris:length | sed 's/.\{6\}$//')
if [[ "$status" == "Playing" ]] ; then status="▶" ; else status="◼" ; fi

echo "$artist/$album/$title [$status] ${length}s"

$length é um pouco mais interessante. O valor normal (extraído de metadata ) é:

'mpris:length': <uint64 379093000>,

Descobri que os últimos 6 caracteres (093000) não são importantes (?) e os restantes são a duração da música em segundos, daí o sed . Você também pode alterar isso em minutes:seconds usando este código aqui . Eu testei com algumas músicas de exemplo (também mais longas) e funciona. Infelizmente não encontrei uma fonte adequada para minhas suposições ou os caracteres restantes.

    
por 26.06.2018 / 17:57