Delirios de un Informático

Mejorando “Global hotkeys” para Spotify en Linux

Hace más o menos un mes que publiqué un enrevesado modo para controlar Spotify mediante Python for Windows. Es enrevesado porque requiere llamar a un script interpretado por Python que a su vez debe ser ejecutado por Wine, lo que en momentos con un poco de carga provoca que la acción tarde varios segundos en realizarse. Por eso, y combinando el truco del notificador mejorado para detectar la posición del icono de Spotify en la barra de tareas, he programado un script en bash que a diferencia del anterior chanchullo no hace uso de Wine y sí de comandos nativos de Linux.

El script se basa en el simplísimo concepto de simular un movimiento de ratón hasta el icono de Spotify, un click para mostrar el menú y otro para elegir la opción. Debido a que se puede detectar la posición del icono y dónde hacer click debido al tamaño fijo de la tipografía de Wine, se puede automatizar el proceso con el siguiente código:

#!/bin/bash

# detects current mouse coordinates
export MOUSEX=`xdotool getmouselocation | awk '{print $1}' | sed -e 's/^x://'`
export MOUSEY=`xdotool getmouselocation | awk '{print $2}' | sed -e 's/^y://'`

# detects Spotify tray icon coordinates
export TRAY=`wmctrl -l -p | grep "lateral superior" | awk '{print $1}'`
export SPTFP=`xwininfo -id $TRAY -tree | grep "explorer.exe" | awk '{print $8}'`
export SPTFX=`echo $SPTFP | awk -F "+" '{print $2+=9}'`
export SPTFY=`echo $SPTFP | awk -F "+" '{print $3+=12}'`

# moves mouse to Spotify tray icon and simulates right click
xte "mousemove $SPTFX $SPTFY" "mousedown 3" "mouseup 3"

# waits for menu to open
sleep 0.01

# generates new X position
let NSPTFX=$SPTFX+50

# generates new Y position
case $1 in
	'open')
		let NSPTFY=$SPTFY+40
		;;	

	'play')
		let NSPTFY=$SPTFY+60
		;;	

	'stop')
		let NSPTFY=$SPTFY+60
		;;	

	'next')
		let NSPTFY=$SPTFY+80
		;;

	'prev')
		let NSPTFY=$SPTFY+100
		;;

	'exit')
		let NSPTFY=$SPTFY+120
		;;
esac

# moves mouse to menu item an simulates left click
xte "mousemove $NSPTFX $NSPTFY" "mousedown 1" "mouseup 1"

# restores previous mouse coordinates
xte "mousemove $MOUSEX $MOUSEY"

Sólo requiere los comandos xdotool, xte y wmctrl. El resto puede implementarse del mismo modo que el anterior controlador de Spotify, para detectar las pulsaciones de teclas y enviarlas a este script :).

6 comentarios en “Mejorando “Global hotkeys” para Spotify en Linux”

Arnau dice:

Hola,

he probado tu script pero no consigo ejecutarlo ya que el programa xwininfo da error…
Cuando ejecuto el programa me sale:

narnau@superlinux:~/Programes/spotify$ ./spotify.sh
xwininfo: error: Invalid window id format: -tree.

Es decir, que no le hace mucho caso a $TRAY y se piensa que la id del programa que busca es -tree…
Que estoy haciendo mal?

Muchas gracias!

admin dice:

¿Qué versión de xwininfo tienes?

Diego dice:

Hola!

Quería, ante todo, agradecerte enormemente la inmensa ayuda que me has prestado con tu script para controlar Spotify.

A parte de eso, sólo comentar que personalmente prefiero la anterior opción a través de python, wine y toda la parafernalia. Me va de perlas cuando juego a WoW con Spotify, ya que el script en bash no funcionaba. Te comento que usando Ubuntu 10.04 y Wine 1.1.42 no he tenido ningún problema instalando Python, las extensiones y pytify, todo a la primera. Ah, y que uso la configuración de combinaciones de teclas que trae ubuntu en lugar de xbindkeys y va de maravilla. Lo comento por si esto ayuda a alguien 😉

Muchas gracias de nuevo.

¡Salud!

admin dice:

La versión en Bash funciona sólo si no tienes nada a pantalla completa. Es más eficiente ya que no tiene que interpretarse un script Python sobre Wine de cada vez, pero tiene ese inconveniente.

Me alegro de que se hayan solucionado los problemas de instalación de Python y las extensiones, evita depender de una instalación de Windows 🙂

Guille dice:

Hola! Muchísimas gracias por tu aportación 😀 Ahora soy un poquito más feliz