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

2024-10-03 23:19:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我的一个应用程序从许多音乐播放器检索当前正在播放的歌曲。然而,我在实现Zune和Windows媒体播放器时遇到了很大的困难。在

我在谷歌上查了很多关于这个问题的东西,不幸的是,这只会让我越来越困惑。在

对于其他应用程序,我通常会做些什么:

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

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

Zune是的,但它每隔几秒钟就在标题、专辑和艺术家之间旋转。这是非常不可靠的跟踪我目前的方法,虽然有可能。在

Windows Media Player

我也尝试过使用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。在

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

Zune

一种方法是在三个标题状态之间循环,确定它当前处于哪个状态,然后找到另外两个状态的位置。在

即: 前5秒标题是:超级歌曲 接下来5秒的标题是:由力量艺术家 接下来的5秒标题是:好的专辑(日期)

所以我可以通过为日期创建一个regex来确定专辑的标题(它总是在那里),然后通过等待几秒钟找到标题和艺术家。在

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

下一个问题是它也不一致,有时标题只是停留在Zune几分钟。不知道为什么。在

所以,继续下一个方法。在

有一个应用程序叫做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病毒?“。在

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

可能要研究的其他方向

在浏览这个主题的时候,我看到有人在谈论直接从图形用户界面检索数据。我不知道我的记忆有多合法,有多可能,甚至有多正确,但是如果有可能的话,有没有人可以让我重新回到这方面的更多内容?在

还有什么,真的。在


Tags: the方法用户插件应用程序标题状态it
2条回答

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

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

有了它,你就可以从GUI中获取信息。在

您还可以获取已加载的文件列表。它适用于大多数媒体播放器。 您可以按如下方式以编程方式获取此信息:

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

这是C++,但在那个时候,可以封装本机代码。 这样您就必须自己提取ID3标记。可能值得一试,因为这将是一个普遍的解决方案。在

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

步骤:

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

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

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

4)从1中看到的类实例化一个对象(我使用CComObject<;>;::CreateInstance模板)

5)使用您在3处获得的接口中的SetClientSite方法,传递一个指向OleClientSite实现的指针。在

6)在SetClientSite调用期间,WMP将回调您:首先请求IServiceProvider接口指针,然后调用QueryService方法,请求IWMPRemoteMediaServices接口指针。返回IWMPRemoteMediaServices的实现,第三,将通过GetServiceType再次调用您。然后必须返回“Remote”。您现在已连接到WMP运行实例

7)查询COM对象以获取IWMPMedia接口指针

8)如果7)没有给出NULL,则读取IWMPMedia::name属性。在

9)完成

以上所有这些都在VS2010/windows7上进行了测试,并运行了WMP(如果没有运行媒体播放器进程,则什么也不做)。在

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

相关问题 更多 >