Módulo Polybar Spotify

November 29, 20224 minutes

Si usas polybar, supongo que alguna vez habrás pensado en poner un módulo para poder controlar spotify y ver que canción está sonando. En este post vas a aprender como hacerlo

Módulo Polybar Spotify

¿Qué es?

Es un simple módulo para la polybar que muestra que canción se está reproduciendo y se pueden añadir botones para pausar y pasar canciones.

¿Como añadirlo a la polybar?

Para añadirlo a la polybar se tienen que seguir los siguientes dos pasos: irte al archivo donde tengas los módulos de la polybar, en mi caso ~/.config/polybar/modules.ini, y abajo del todo copiar lo siguiente

Módulos

Módulo Song

  • Añádelo si quieres que salga la canción que se està reproduciendo…
[module/song]
type = custom/script
exec = ~/.config/bin/song.sh
interval = 1
format-prefix = "  "
format = <label>

Módulo Previous

  • Añádelo si quieres tener el botón para reproducir la canción anterior
[module/previous]
type = custom/script
exec = ~/.config/bin/previous.sh
interval = 1
;format-prefix = "  "
format = <label>
click-left = dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous

Módulo Next

  • Añádelo si quieres tener el botón para reproducir la canción siguiente
[module/next]
type = custom/script
exec = ~/.config/bin/next.sh
interval = 1
;format-prefix = "  "
format = <label>
click-left = dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next

Módulo Play

  • Añádelo si quieres tener el botón para parar y reproducir una canción
[module/play]
type = custom/script
exec = ~/.config/bin/play.sh
interval = 1
;format-prefix = "  "
format = <label>
click-left = dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause

Archivos

Para que los módulos funcionen hay que poner los siguientes archivos en la carpeta ~/.config/bin/ ¡Acuérdate de darle permisos de ejecución a todos con chmod +x!

song.sh

  • Contenido del archivo song.sh
#!/bin/bash

if [[ "$(dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames)" == *org.mpris.MediaPlayer2.spotify* ]]; then
	artist=$(dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' | awk '/artist/{getline; getline; split($0,a,"\""); print a[2]}')
	song=$(dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' | awk '/title/{getline; split($0,a,"\""); print a[2]}')
	echo $song - $artist
else 
	echo ""
fi

next.sh

  • Contenido del archivo next.sh
#!/bin/bash

if [[ "$(dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames)" == *org.mpris.MediaPlayer2.spotify* ]]; then
        echo ""
else 
        echo ""
fi

previous.sh

  • Contenido del archivo previous.sh
#!/bin/bash

if [[ "$(dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames)" == *org.mpris.MediaPlayer2.spotify* ]]; then
        echo ""
else 
        echo ""
fi

play.sh

  • Contenido del archivo play.sh
#!/bin/bash

if [[ "$(dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames)" == *org.mpris.MediaPlayer2.spotify* ]]; then
        echo ""
else 
        echo ""
fi

¡Novedad Animated Song!

Algunas personas que usaron estos módulos me comentaron que al escuchar canciones muy largas, les ocupaba mucho espacio en la polybar, por eso hice con la ayuda de b3nder0n el siguiente script, que básicamente lo que hace es animar el texto de la canción para que solo ocupe x caracteres previamente definidos…

Configuración

Para su configuración es casi igual que los otros módulos, los pasos son los siguientes

Archivos

Para su correcto funcionamiento hay que crear los siguientes archivos ~/.config/bin/ y no te olvides de darles permiso de ejecución con chmod

animated.sh
  • Contenido del animated.sh
#!/bin/bash

lenght=15

if [[ "$(dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames)" == *org.mpris.MediaPlayer2.spotify* ]]; then
	artist=$(dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' | awk '/artist/{getline; getline; split($0,a,"\""); print a[2]}')
	song=$(dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' | awk '/title/{getline; split($0,a,"\""); print a[2]}')
	text="阮 $song - $artist "
    num_char=$(echo -n $text | wc -c)
	text2=${text// /#}
    

    if [[ $lenght < $num_char ]];then
        letter=$(cat ~/.config/bin/progress.txt)
        times=0
        result=()
        for (( i=0 ; i < ${#text} ; i++ )) {
            a[$i]=${text2:i:1}
        }

        until [ $lenght -lt $times ]; do
            letter=$(($letter + 1))
            times=$(($times + 1))
            if [[ $letter -lt $num_char ]]; then
                result+=(${a[$letter]})
            
            else
                letter=-1

            fi
            
        done

        echo $(($letter - $times + 1)) > ~/.config/bin/progress.txt
	    echo ${result[@]} | tr -d " " | tr "#" " " 

    else
        echo $text
    fi

else 
	echo ""
fi
progress.txt
  • Hace falta crear un archivo llamado progress.txt, tambien en ~/.config/bin/

Módulo

Para su correcto funcionamiento hay que añadirlo abajo del todo en el archivo de módulos de la polybar, en mi caso ~/.config/polybar/modules.ini y después activarlo en el config.ini

[module/animated-song]
type = custom/script
exec = ~/.config/bin/animated.sh
interval = 1
format = <label>
  • Para graduar la velocidad se tiene que cambiar el valor de interval, el número de interval equivale a la velocidad por carácter.

  • Para modificar el máximo de caracteres se tiene que especificar en la variable lenght del animated.sh