Delirios de un Informático

Global hotkeys para Spotify en Linux sobre Wine

Actualización: nuevo método más sencillo, rápido y ligero 🙂

Hace semanas que cada día estoy más enganchado a Spotify. Es un servicio muy bueno pero que como no, se ha olvidado de Linux, por lo que hay que utilizar Wine para ejecutar el cliente oficial. Al ser algo emulado tiene sus problemas y para mi el mayor es que no responda a las teclas multimedia para saltar a la siguiente canción o para pausar la reproducción. Tras trastear un rato y probar un par de plugins que requieren librerías que no funcionan sobre Wine, me topé con pytify, una pequeña librería en Python para Windows que permite controlar la reproducción y obtener los datos de la canción actual.

Para hacerla funcionar se necesita Python for Windows, Python for Windows Extensions y pytify. Este último ha de instalarse con el comando C:\Python26\python.exe setup.py install. El proceso sobre Wine me ha dado más de un problema (sobre todo al instalar las extensiones) por lo que al final he probado a instalarlo y probarlo todo en un Windows virtualizado y luego transferir los archivos a wine. Hay que transferir la carpeta C:\Python26 al directorio $HOME/.wine/drive_c/ y después enlazar dos librerías:

cd $HOME/.wine/drive_c/windows/system32
ln -s ../../Python26/Lib/site-packages/pywin32_system32/pythoncom26.dll .
ln -s ../../Python26/Lib/site-packages/pywin32_system32/pywintypes26.dll .

Con todas las librerías instaladas, ya se puede hacer uso del API de pytify con el siguiente script en Python:

import sys
from pytify import Spotify


spotify = Spotify()

if 'next' in sys.argv:
	spotify.next()
elif 'prev' in sys.argv:
	spotify.previous()
elif 'stop' in sys.argv:
	spotify.stop()
elif 'play' in sys.argv:
	spotify.playpause()
elif 'curr' in sys.argv:
	print spotify.getCurrentArtist() + ' - ' + spotify.getCurrentTrack()

El script debe llamarse del siguiente modo:

wine "$HOME/.wine/drive_c/Python26/python.exe" "$HOME/ruta-al-script/spotify.py" next

Luego sólo queda asignar las combinaciones de teclas para llamar al script, que con xbindkeys puede hacerse interceptando las teclas del siguiente modo (no se detectan con xbindkeys -k):

# Multimedia Play/Pause
"wine '/home/usuario/.wine/drive_c/Python26/python.exe' '/ruta-a-script/spotify.py' play"
	XF86AudioPlay

# Multimedia Stop
"wine '/home/usuario/.wine/drive_c/Python26/python.exe' '/ruta-a-script/spotify.py' stop"
	XF86AudioStop

# Multimedia Next
"wine '/home/usuario/.wine/drive_c/Python26/python.exe' '/ruta-a-script/spotify.py' next"
	XF86AudioNext

# Multimedia Previous
"wine '/home/usuario/.wine/drive_c/Python26/python.exe' '/ruta-a-script/spotify.py' prev"
	XF86AudioPrev

Es un poco enrevesado, pero funciona…

NOTA: es necesario tener instalado el paquete vcrun2008 que se puede instalar fácilmente con winetricks.

17 comentarios en “Global hotkeys para Spotify en Linux sobre Wine”

SiCkTiMe dice:

Muy bueno 😉 Lo utilizaré…

javi dice:

Ahora gracias a spotify.getCurrentArtist() & spotify.getCurrentTrack() podremos averiguar cuando está sonando la publi y silenciar esa salida de sonido . 😀

skuark dice:

Hola. Buen truco, gracias por la investigación y la documentación 😉

Yo estoy teniendo un problema al intentar echarlo a andar. Tal y como comentas, al final también he acabado instalándolo sobre Windows XP virtualizado. Una vez he visto que en windows funcionaba perfectamente el script, he movido Python26 a wine y he enlazado las dos librerías en system32 pero sigo teniendo un problema.

Al tratar de ejecutar el script en Linux me aparecen los siguientes errores:

fixme:actctx:parse_depend_manifests Could not find dependent assembly L”Microsoft.VC90.CRT”
err:module:import_dll Library python26.dll (which is needed by L”C:\\Python26\\python.exe”) not found
err:module:import_dll Library MSVCR90.dll (which is needed by L”C:\\Python26\\python.exe”) not found
err:module:LdrInitializeThunk Main exe initialization for L”C:\\Python26\\python.exe” failed, status c0000135

Ambos ficheros (python26.dll y MSVCR90.dll) los he podido encontrar en el Windows XP virtualizado, el primero en system32 y el segundo en un directorio extraño de Windows. Al copiarlos a system32 parecía que todo iba a funcionar, pero continuo teniendo los siguientes errores:

fixme:actctx:parse_depend_manifests Could not find dependent assembly L”Microsoft.VC90.CRT”
fixme:actctx:parse_depend_manifests Could not find dependent assembly L”Microsoft.VC90.CRT”
err:module:attach_process_dlls “MSVCR90.dll” failed to initialize, aborting
err:module:LdrInitializeThunk Main exe initialization for L”C:\\Python26\\python.exe” failed, status c0000142

¿Qué puede ser lo que me falte por instalar? Según he leído porai con winetricks se solucionaba pero lo he instalado y sigue sin funcionar.

Seguiré mirándolo y si consigo algo ya dejaré constancia por aquí 😉

admin dice:

skuark, deberás instalar mediante winetricks el paquete vcrun2008. A mi me función así sin problemas…

skuark dice:

Hola David. Efectivamente, instalando el vcrun2008 ha funcionado perfectamente. Un saludo, y muchas gracias por la ayuda 😉

admin dice:

Genial, fallo mio el no indicarlo en el post ya que tenía ese paquete instalado previamente. Lo he editado para añadirlo 🙂

Cristóbal dice:

Muchas gracias por el post, David! Llevo muuuucho tiempo esperando poder hacer esto 🙂

En la web del proyecto pytify he añadido una explicación de como hacer todo el proceso paso por paso (http://code.google.com/p/pytify/issues/detail?id=2).

Como explico en el otro post tuve problemas para instalar pywin, a pesar de haber instalado vcrun2008 anteriormente. No sé si es por haber hecho toda la instalación de Wine (en vez de instalarlo en Windows y pasarlo a Linux, como sugieres en tu post). Si a alguien se le ocurre alguna solución para esa cuestión (me daba el error de que no encontraba “vcvarsall.bat” al intentar instalar pywin, pero luego, al instalar otra cosa con winetricks, no sé como, saltaba la instalación de pywin y se terminaba de instalar… las cosas de Window$ :-S ).

Saludos!

admin dice:

El problema de vcvarsall.bat era el que me daba a mi, debido a que se necesita un compilador, bien Visual Studio (no instalable en Wine) o bien MiniGW o Cygwin. Probé MiniGW pero me fué imposible instalar correctamente.

Por cierto, guai lo del wiki de Pytify, no se me había ocurrido comentarlo ahí…

Cristóbal dice:

Con “winetricks vc2005express” se instala una versión gratis del compilador de Visual C++ y creo que al final fue eso lo que me permitió terminar la instalación de pywin. Si consigo reproducir la instalación lo comentaré, jeje.

Un saludo, y de nuevo gracias 😉

admin dice:

Gracias Cristóbal por el truco, pero no he conseguido terminar la instalación. Me falla al instalar el IDE y luego al instalar Pywin32. Uso Wine 1.0.1 porque con la versión 1.1.39 me fallaba Spotify por todos lados, ni siquiera me arrancaba…

Cristóbal dice:

Ojo, yo instalé primero vcrun2008, después pywin, y DESPUÉS de todo eso, el vc2005express y es entonces cuando (mágicamente) se terminó de instalar pywin (y luego terminó de instalarse vc2005express, puede que con error, no recuerdo). Para conseguir eso tuve que estar trasteando muuucho rato.

La única explicación que encuentro es que el “vcvarsall.bat” es un archivo que se crea en la instalación de ciertos programas de Window$ y se encarga de lanzar algún proceso que esté en alguna cola del registro de Window$ o en algún archivo de configuración. Cualquiera sabe :-S

Por cierto, yo también estoy usando Wine 1.0.1.

admin dice:

Curioso. Yo instaé vrun2008 – python – vc2005express – pywin32, quizas ese fuera el problema…