需要使用Python从Zune和Windows Media Player中检索当前正在播放的歌曲

我的应用程序从众多音乐播放器中检索当前正在播放的歌曲。 但是,我在实现Zune和Windows Media Player时遇到了很大的麻烦。

我已经做了很多关于这个主题的search,不幸的是,这只是让我越来越困惑。

我通常会为我的其他应用程序做什么:

  1. 每4秒迭代所有打开的窗口
  2. 获取所有窗口的标题
  3. 检查模式的标题(即, " - Spotify "
  4. 如果有,请调整输出的标题。

WMP标题中没有当前正在播放的歌曲。

Zune可以,但是它在标题,专辑和艺术家之间每隔几秒就会旋转一下。 尽pipe可能,但用我目前的方法进行跟踪是非常不可靠的。

Windows媒体播放器

我也尝试使用COM组件的Windows媒体播放器。

 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 

这是一个大问题,它需要你以编程方式启动WMP,这对用户来说是非常不友好的

那么,我发现了什么? 这个SOpostredirect到WMP.dll。 但据我所读,它有COM相同的问题,你必须以编程方式启动它。 如果不是的话,我真的很喜欢一些关于如何在python中使用dll的方法。

会有另外一个不太好的解决scheme,那就是为WMP编写一个插件,让我的用户下载这个插件并从插件中检索数据。 我宁愿不去那里,因为我没有使用任何C语言的经验,也不想为此插入文档。

Zune播放器

一种方法是循环三个标题状态,确定当前处于哪个状态,并find另外两个状态的位置。

IE:前5秒的标题是:Super_song下5秒的标题是:通过Power_artist下5秒的标题是:Good_album(date)

所以我可以通过为date(总是存在)制定一个正则expression式来确定专辑的标题,然后等待几秒钟,find标题和艺术家。

这显然不是一个很好的解决scheme,因为它需要一段时间,也不是很可靠,(如果歌曲名称包含date,例如)

接下来的问题是,它也不一致,有时候标题只是保持Zune长达数分钟。 不知道为什么。

所以,继续下一个方法。

有这个应用程序称为ZuneNowPlaying 。 这个“不知何故”从Zune获取当前播放的歌曲,并把它放在registry中,这个东西不适用于我的马虎标题方法,因为它改变了registry,歌曲改变的瞬间。 立即。

这是我在我的程序工作版本中使用的解决scheme,但许多用户报告说,它根本没有工作,什么也没有发生。 而且我检查了程序,并且不能可靠地改变registry。 我不知道为什么,我不知道如何解决这个问题。 因此,这个解决scheme也被放弃了。

事实上,它使用的名称“MsnMsgrUIManager”#000000“>导致zune软件发送有关哪首歌正在播放的信息?有没有办法得到这种信息没有这种破解?

这是在Zune Now Playing应用程序的讨论中发现的。 来源不可用,至less我找不到它。 任何人都有更多的这个?

我听说的第三种方法是再一次,一个DLL。 它被称为ZuneShell.dll。 我不记得我在哪里阅读,也不能通过谷歌find它,因为所有的结果是“是ZuneShell.dll病毒?”。

再一次,我遇到了这个问题,即使我有文档,我也不知道如何处理这个问题,如果这个问题甚至是我一直在寻找的。

备选方向,也许看看

在浏览这个主题的同时,我也看到有人谈论直接从GUI中获取数据。 我不确定我的记忆是多么的合理,可能甚至是正确的,但是如果有可能的话,有人可以重新指引我呢?

别的,真的。

Solutions Collecting From Web of "需要使用Python从Zune和Windows Media Player中检索当前正在播放的歌曲"

我用C ++编写代码来打印当前在WMP中播放的媒体名称。 这是一个简单的控制台应用程序(78行代码)。

脚步:

1)实现了一个基本的COM对象实现IUnknown,IOleClientSite,IServiceProvider和IWMPRemoteMediaServices。 使用ATL模板CComObjectRootEx这很简单(你的里程可能会有所不同)。 需要(简单)代码的唯一方法是IServiceProvider :: QueryService和IWMPRemoteMediaServices :: GetServiceType。 所有其他方法可能会返回E_NOTIMPL

2)实例化“WMPlayer.OCX”COM对象(在我的情况下,通过CoCreateInstance)

3)通过QueryInterface从对象中检索一个IOleObject接口指针

4) Instanciate在1)中看到的类(我使用CComObject <> :: CreateInstance模板)

5)使用从3)得到的接口的SetClientSite方法,将一个指针传递给你的OleClientSite实现。

6)在SetClientSite调用期间,WMP会回调你:fisrt询问一个IServiceProvider接口指针,然后调用QueryService方法,询问一个IWMPRemoteMediaServices接口指针。 返回你的IWMPRemoteMediaServices的实现,第三,你将通过GetServiceType再次被调用。 您必须然后返回“远程”。 您现在连接到WMP运行实例

7)查询COM对象的IWMPMedia接口指针

8)如果7)没有给NULL,请阅读IWMPMedia :: name属性。

9)完成

以上所有内容都是使用VS2010 / Windows Seven进行测试,并且运行WMP(如果没有运行媒体播放器进程,则什么也不做)。

我不知道是否可以/想要在Python中实现COM接口和对象。 如果您对我的C ++代码感兴趣,请告诉我。 您可以在C ++ DLL中使用该代码,然后从Python中调用它。

我刚刚找到一个很酷的Python工具,可以查询任何程序的所有控件。 简单,直接,易于阅读。 它在这里:

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

有了这个,你可以从GUI获取信息。

您也可以抓取加载的文件列表。 它适用于大多数媒体播放器。 你可以像这样以编程方式获得这个信息:

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

这是C ++,但在这一点上,你可以包装本地代码。 这样你必须自己提取ID3标签。 值得一试,因为这将是一个通用的解决方案。