“Lo que estás escuchando” de Winamp en Python
February 2, 2008La conocida opción del MSN Messenger ‘Lo que estoy escuchando’ originalmente funcionaban con Windows Media Player, lo que propició a la escritura de plugins que extendían esta función para que soportara a Winamp y a otros reproductores.
Confesaré que como programador siempre he tenido curiosidad de saber cómo implementar esta función para mis propios programas. Después de chequear el CVS de Emesene, he aprendido como hacerlo y basándome en su código (Para algo el código es libre… para aprender) he creado mi propia version de esa extensión, como siempre en Python.
Aquí les va:
#.- coding: iso8859-1 .-
# ***********
# GetWinampText - version 1.0 por BrunoProg64
# ***********
# Algunas porciones se basan en el código del plugin CurrentSong, parte
# del proyecto emesene (http://emesene.org) licenciado bajo la GPL.
# ************# Código bajo licencia GPL 2.0 o superior…
import re
try:
import win32api
import win32gui
except:
print “No se han instalado las extensiones Win32API o no es un sistema Windows”class Winamp():
def __init__(self):
self.winampid = None
self.winamptext = ‘’
self.winampsong = ‘’def IsWinampRunning(self):
#buscamos el ID del Winamp. Aunque en este caso sólo el del Winamp 1 - 2.x
self.winampid = win32gui.FindWindow(’Winamp v1.x’, None) #tomado del código de emesene.orgif self.winampid == 0:
return False
else:
return Truedef GetWinampText(self):
self.winamptext = win32gui.GetWindowText(self.winampid)
#ahora le quitamos la coletilla “winamp”
self.winamptext = self.winamptext.replace(’- Winamp’, ‘’) #adaptado del código de emesene.orgreturn self.winamptext
def GetWinampSong(self):
#aqui simplemente obteemos la letra de la funcion GetWinampText()
if self.IsWinampRunning() == True:
tmp = self.GetWinampText()
#ahora debemos eliminar ese molesto “1. [Cancion]”
#una expresion regular para esto seria ‘[0-9][\.] ‘
# ya que el formato es [num]. [cancion]
#ejemplo: 122. Digimon Adventure - Butterfly (Chosen Boys Version)pattern = re.compile(’[0-9][\.] ‘)
final = pattern.split(tmp)[1]return final
else:
return ‘Ninguna cancion’# *******
# Una prueba de las funciones
# *********def main():
print “Que estoy escuchando?? - 2008 por BrunoProg64″
print “—————-\n\n”winamp = Winamp()
print winamp.IsWinampRunning()
if winamp.IsWinampRunning() == True:
print “Winamp se esta ejecutando”
print “El titulo de la ventana es ” + winamp.GetWinampText()
print “El titulo de la cancion es ” + winamp.GetWinampSong()
a = winamp.GetWinampSong()else:
print “No hay Winamp. Asegurese tener la version 2.9 como maximo”if __name__ == “__main__”: main()
Vamos a explicarlo paso por paso como solemos hacer en ese blog:
- Importamos libreías: Se importan 2 librerías del API de Windows, que para poder usar debemos instalar en nuestra PC. También importamos la librería de expresiones regulares, ya que le necesitaremos más adelante.
Podemos encontrar las extensiones API para Python desde aquí.
- Creamos la Clase: En esta clase creamos tres funciones, la primera IsWinampRunning servirá para saber si está funcionando el Winamp. En este caso podemos buscar una ventana bajo Windows mediante su nombre de clase y en el caso de Winamp, ese nombre es ‘Winamp v1.x’ (Sólo funciona hasta la version 2.x, pero es la que más se usa).
La segunda función GetWinampText obtiene el texto de la barra de título de Winamp y le elimina la terminación ‘- Winamp’.
La tercera función GetWinampSong obtiene el texto y lo formatea adecuadamente para presentación.
- El Problema del Formato: Al ser una ventana, en Winamp una canción sigue esta estructura:
[NumeroPlayer]. [Artista] - [Canción]
Un ejemplo tomado de mi reproductor:
122. Adventure Boys & Digimon - ButterFly - Winamp
Entonces, en la función GetWinampText eliminamos la coletilla ‘- Winamp’, usando replace() y sustituyendo esa cadena por un caracter truncado.
Siguiendo con nuestro ejemplo, el título quedaría:
122. Adventure Boys & Digimon - ButterFly
Sin embargo también debemos eliminar el ‘122.’ de nuestro título si queremos que sea utilizable por algun programa. Para este caso ya no vale un replace() si no… nos serviremos de las expresiones regulares.
Una expresion regular es una expresión que indica un patrón de búsqueda. Ya que recién las estoy aprendiendo, solo les recomiendo el tutorial de Bulma para saber más de ellas.
Pues bien, dicho esto vamos de lleno a la expresión regular usada. En nuestro caso será:
[0-9][\.]
Esta expresión busca las cadenas que tengan numeros y que sean seguidas de un punto y un espacio en blanco (Nótese el espacio en blanco dejado a propósito). En una cadena tipo Winamp el único que satisface eso es la numeración, por lo que podemos filtrarlo con split().
Finalmente creamos un main para probar nuestra creación. Debería aparecer el título de la canción en consola.
Pueden bajar el .py de este artículo aquí.
Agradecer a emesene por el código fuente que me permitió aprender como realizar esto.
Y como siempre… si hubiera algún error o similar, simplemente hágamenlo saber.




