需要一种方法从Zune和Windows Media Player使用Python检索当前播放的歌曲

我的应用程序从众多音乐播放器中检索当前播放的歌曲.但是,我在实现Zune和Windows Media Player方面遇到了很大麻烦.我已经做了很多关于这个主题的谷歌搜索,不幸的是它只是让我越来越困惑.我通常会为其他应用程序做些...

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

我已经做了很多关于这个主题的谷歌搜索,不幸的是它只是让我越来越困惑.

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

>每4秒对所有打开的窗口进行迭代
>获取所有窗口的标题
>检查模式的标题(即“ – Spotify”)
>如果有,请调整输出标题.

WMP标题中没有当前播放的歌曲.

Zune确实如此,但它在标题,专辑和艺术家之间每隔几秒钟就会旋转一次.尽管可能,但使用我当前的方法跟踪这是非常不可靠的.

Windows媒体播放器

我也试过在Windows媒体播放器上使用COM组件.

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,这对用户来说非常不友好

那么,我发现了什么? This SO post重定向到WMP.dll.但据我所知,它与COM有同样的问题,你必须以编程方式启动它.如果没有,我真的想要如何在python中使用该DLL的一些方向.

还有另外一个不那么hacky的解决方案,即为WMP编写插件,让我的用户下载该插件并从该插件中检索数据.我宁愿不去那里,因为我没有任何C语言的经验,也不想深入研究插件文档.

Zune播放器

一种方法是循环通过三个标题状态,确定它当前处于哪个状态并找到另外两个的位置.

IE:
前5秒标题是:Super_song
接下来的5秒标题是:By Power_artist
接下来的5秒标题是:Good_album(日期)

所以我可以通过制作日期的正则表达式(总是在那里)确定专辑标题的时间,然后等待几秒钟找到标题和艺术家.

这显然不是一个很好的解决方案,因为它需要一段时间而且它也不是非常可靠,(如果歌曲名称包含日期,那该怎么办)

接下来的问题是它也不一致,有时候标题只会持续几分钟.不知道为什么.

所以,继续下一个方法.

有一个名为ZuneNowPlaying的应用程序.这个“不知何故”从Zune获取当前播放的歌曲并将其放入注册表中,这个东西不能用我的草率标题方法,因为它在歌曲改变的瞬间改变了注册表.立即.

这是我在我的程序的工作版本中使用的解决方案,但许多用户报告说它根本不起作用,没有任何反应.我检查了程序,它不能一直可靠地更改注册表.我不知道为什么,我不知道如何解决它.因此,这个解决方案也被包括在内.

Is the fact that it is using the name “MsnMsgrUIManager”#000000”>
causing the zune software to send it information about which song is
playing? Is there a way to get this information without this kind of
hack?

这可以在Zune Now Playing应用程序的讨论中找到.遗憾的是,源代码不可用,至少我找不到它.有人对此有更多了解吗?

我听说过的第三种方法是dll.它被称为ZuneShell.dll.我不记得我在哪里读到它,也不能通过谷歌找到它,因为所有结果都是“ZuneShell.dll是病毒吗?”.

再一次,我遇到了一个问题,我不知道如何使用它,即使我有文档,哎呀,如果它甚至是我一直在寻找的.

可能会考虑的替代方向

在浏览这个主题时,我看到人们谈论直接从GUI中检索数据.我不确定我的记忆是多么合法,可能甚至是多么正确,但是如果有可能有人可以将我重新引导到更多这方面呢?

还有别的,真的.

解决方法:

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

脚步:

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

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

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

4)从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(如果没有运行Media Player进程,则不执行任何操作).

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

本文标题为:需要一种方法从Zune和Windows Media Player使用Python检索当前播放的歌曲

基础教程推荐