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



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

我已经在这个主题上做了很多谷歌搜索,不幸的是,它只会让我越来越困惑。

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

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

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

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

Windows Media Player

我还尝试将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,这将非常不友好

那么,我发现了什么?此帖子重定向至WMP.dll。但据我所知,它与 COM 有相同的问题,您必须以编程方式启动它。如果没有,我真的很想得到一些关于如何在 python 中使用 dll 的说明。

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

祖恩

一种方法是循环浏览三个标题状态,确定它当前处于哪个状态并找到其他两个状态的位置。

即:前 5 秒标题为:Super_song接下来的 5 秒标题是:通过Power_artist接下来的 5 秒标题为:Good_album(日期)

因此,我可以通过为日期(始终存在)制作正则表达式来确定专辑标题何时出现,然后通过等待几秒钟找到标题和艺术家。

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

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

因此,继续使用下一种方法。

有一个名为ZuneNowPlaying的应用程序。这个"不知何故"从 Zune 获取当前播放的歌曲并将其放入注册表中,这个东西不适用于我草率的标题方法,因为它会在歌曲更改的瞬间更改注册表。马上。

这是我在程序的工作版本中使用的解决方案,但许多用户报告说它根本不起作用,什么也没发生。我检查了程序,它不能一直可靠地更改注册表。我不知道为什么,我不知道如何解决它。因此,该解决方案也被废弃。

它是否使用名称"MsnMsgrUIManager"#000000"> 导致 Zune 软件向其发送有关哪首歌曲的信息 玩?有没有办法在没有这种的情况下获得这些信息 砍?

这可以在 Zune Now Play 应用程序的讨论中找到。不幸的是,来源不可用,至少我找不到它。有人对此有更多了解吗?

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

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

可能要研究的替代方向

在浏览这个主题时,我看到人们谈论直接从GUI检索数据。我不确定我的记忆有多合法,可能甚至有多正确,但如果有可能,有人可以将我重定向到更多关于这一点的信息吗?

别的什么,真的。

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

步骤:

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

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

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

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

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

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

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

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

9) 完成

以上所有内容都通过VS2010/Windows Seven和WMP运行进行了测试(如果没有媒体播放器进程运行,则什么都不做)。

我不知道yoy是否可以/想要在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标签。可能值得一试,因为它将是一个通用的解决方案。

相关内容

  • 没有找到相关文章

最新更新