Necesita una forma de recuperar la canción en reproducción actual de Zune y Windows Media Player con Python

Una aplicación mía recupera la canción en reproducción actual de una multitud de reproductores de música. Sin embargo, estoy teniendo grandes problemas para implementar Zune y Windows Media Player.

He hecho muchas búsquedas en Google sobre el tema, desafortunadamente solo me está confundiendo más y más.

Lo que normalmente haría para mis otras aplicaciones:

  1. Iterar sobre todas las ventanas abiertas cada 4 segundos
  2. Obtén el titulo de todas las ventanas.
  3. Compruebe el título de un patrón (es decir, " - Spotify " )
  4. Si está ahí, ajusta el título para la salida.

WMP no tiene la canción en reproducción actual en el título.

Zune lo hace, pero está rotando cada pocos segundos entre título, álbum y artista. Lo que es muy poco confiable para rastrear con mi método actual, aunque sea posible.

reproductor de medios de Windows

También he intentado usar el componente COM para Windows Media Player.

 import win32com.client wmp = win32com.client.gencache.EnsureDispatch('WMPlayer.OCX') # some function I don't have here, it retrieves the current playing song # and other data 

El gran problema con eso requiere que inicie WMP programáticamente, lo que sería extremadamente hostil para el usuario.

Entonces, ¿qué he encontrado? Esta publicación SO se redirige a WMP.dll. Pero por lo que he leído, tiene el mismo problema que el COM, hay que iniciarlo programáticamente. Si no, realmente me gustaría recibir algunas instrucciones sobre cómo trabajar con esa dll en python.

Habría otra solución un poco menos intrépida, que es escribir un complemento para WMP, permitir a mis usuarios descargar ese complemento y recuperar los datos de ese complemento. Preferiría no ir allí, ya que no tengo experiencia con ninguno de los lenguajes C, ni tengo ganas de profundizar en la documentación del complemento para esto.

Zune

Un método sería pasar por los tres estados del título, determinar en qué estado se encuentra actualmente y encontrar la posición de los otros dos.

IE: Los primeros 5 segundos el título es: Super_song Los siguientes 5 segundos el título es: Por Power_artist Los siguientes 5 segundos el título es: Good_album (fecha)

Así que podría determinar cuándo es el título del álbum haciendo una expresión regular para la fecha (que siempre está ahí) y luego encontrar el título y el artista esperando unos segundos.

Esto obviamente no es una gran solución, ya que tomará un tiempo y tampoco es muy confiable (por ejemplo, si el nombre de la canción contiene una fecha)

El siguiente problema es que tampoco es consistente, a veces el título solo permanece en Zune durante minutos. No tengo idea de por qué.

Entonces, pase al siguiente método.

Hay una aplicación llamada ZuneNowPlaying . Este “de alguna manera” obtiene la canción que se reproduce actualmente de Zune y la coloca en el registro, esto no funciona con mi método de título descuidado, ya que cambia el registro en el momento en que cambia la canción. Inmediatamente.

Esta es la solución que usé en la versión de trabajo de mi progtwig, pero muchos usuarios informaron que simplemente no funcionó, no sucedió nada. Y verifiqué el progtwig y no cambia de manera confiable el registro todo el tiempo. No sé por qué, no sé cómo arreglarlo. Por lo tanto, esta solución también está descartada.

¿El hecho de que use el nombre “MsnMsgrUIManager” # 000000 “> hace que el software zune le envíe información sobre la canción que se está reproduciendo? ¿Hay alguna forma de obtener esta información sin este tipo de pirateo?

Eso se encuentra en la discusión de la aplicación Zune Now Playing. La fuente no está disponible desafortunadamente, al menos no puedo encontrarla. ¿Alguien tiene más sobre esto?

El tercer método que había escuchado era una vez más, un dll. ZuneShell.dll se llama. No recuerdo dónde lo leí, ni puedo encontrarlo a través de google, ya que todos los resultados son “¿ZuneShell.dll es un virus?”.

Una vez más, me encuentro con el problema de que no sabría cómo trabajar con esto, incluso si tuviera documentación, si es lo que he estado buscando.

Direcciones alternativas para tal vez mirar en

Mientras exploraba este tema, he visto a personas hablar sobre cómo recuperar datos directamente de las GUI. No estoy seguro de qué tan legítimo, posible o incluso cuán correcto es mi memoria, pero si es posible, ¿podría alguien redirigirme a más sobre esto?

Cualquier otra cosa, de verdad.

Tengo un código de trabajo en C ++ para imprimir el nombre de los medios que se reproducen actualmente en WMP. Es una aplicación de consola simple (78 líneas de código).

Pasos:

1) implementa un objeto COM básico que implementa IUnknown, IOleClientSite, IServiceProvider e IWMPRemoteMediaServices. Esto es sencillo (más o menos, su millaje puede variar) usando la plantilla ATL CComObjectRootEx. Los únicos métodos que necesitan código (simple) son IServiceProvider :: QueryService e IWMPRemoteMediaServices :: GetServiceType. Todos los otros métodos pueden devolver E_NOTIMPL

2) Crear una instancia del objeto COM “WMPlayer.OCX” (en mi caso, a través de CoCreateInstance)

3) Recuperar del objeto un puntero de interfaz IOleObject a través de QueryInterface

4) Instancia un objeto de la clase que se ve en 1) (uso la plantilla CComObject <> :: CreateInstance)

5) Use el método SetClientSite de la interfaz que obtuvo en 3), pasando un puntero a su implementación de OleClientSite.

6) Durante la llamada a SetClientSite, WMP le devolverá la llamada: fisrt solicitando un puntero de interfaz IServiceProvider, luego llamando al método QueryService, solicitando un puntero de interfaz IWMPRemoteMediaServices. Devuelva su implementación de IWMPRemoteMediaServices y, tercero, se lo llamará nuevamente a través de GetServiceType. A continuación, debe devolver “Remote”. Ahora estás conectado a la instancia en ejecución de WMP

7) Consultar el objeto COM para un puntero de interfaz IWMPMedia

8) Si 7) no dio NULL, lea la propiedad IWMPMedia :: name.

9) HECHO

Todo lo anterior se probó con VS2010 / Windows Seven y con WMP en ejecución (si no hay un proceso de Media Player en ejecución, simplemente no haga nada).

No sé si puede / quiere implementar la interfaz COM y el objeto en Python. Si está interesado en mi código C ++, hágamelo saber. Podría usar ese código en una DLL de C ++ y luego llamarlo desde python.

Acabo de encontrar una herramienta genial de Python que puede consultar todos los controles de cualquier progtwig. Simple, directo y fácil de leer. Esta aquí:

http://www.brunningonline.net/simon/blog/archives/winGuiAuto.py.html

Con eso puedes obtener la información de la GUI.

También puede tomar la lista de archivos cargados. Funciona para la mayoría de los reproductores multimedia. Puede obtener esta información programáticamente de esta manera:

http://www.codeproject.com/Articles/18975/Listing-Used-Files

Esto es C ++, pero en ese momento puede ajustar el código nativo. De esta manera tienes que extraer las tags ID3 tú mismo. Podría valer la pena, ya que sería una solución universal.