【问题标题】:Need a way to retrieve the current playing song from Zune and Windows Media Player with Python需要一种使用 Python 从 Zune 和 Windows Media Player 检索当前播放歌曲的方法
【发布时间】:2013-10-29 00:43:38
【问题描述】:

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

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

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

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

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。

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

Zune

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

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

所以我可以通过为日期创建一个正则表达式来确定专辑标题的时间(它始终存在),然后等待几秒钟找到标题和艺术家。

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

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

所以,继续下一个方法。

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

这是我在我的程序的工作版本中使用的解决方案,但许多用户报告说它根本不起作用,什么也没发生。我检查了程序,它并没有一直可靠地更改注册表。我不知道为什么,我不知道如何解决它。所以,这个方案也是-scrapped-。

是不是它使用了名称“MsnMsgrUIManager”#000000"> 导致 zune 软件向其发送有关哪首歌的信息 玩?有没有办法在没有这种信息的情况下获取这些信息 破解?

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

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

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

可能需要查看的其他方向

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

其他的,真的。

【问题讨论】:

  • 你考虑过尝试从zune进程的内存中读取数据吗?在python中似乎有一个(过时的)库可以做到这一点,名为pymem
  • @goncalopp 我没有,我会调查一下。
  • 似乎可以使用 dll 访问正在运行的 WMP 实例,但我认为这并不容易,请参阅here。也许您可以从source of the "CurrentTrack" plugin for Pidgin 获得其他灵感。公平警告:它在 C++ 中,并且有作者评论:“这个解决方案很糟糕......但直到我弄清楚如何使用 COM API......”

标签: python windows winapi wmp zune


【解决方案1】:

我有 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) 从 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 7 进行了测试,并且运行了 WMP(如果没有运行媒体播放器进程,则什么都不做)。

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

【讨论】:

  • 不幸的是,这个解释对我来说太模糊了,我完全不知道第一步该做什么。而且很少有关于将 COM 与脚本语言(当然尤其是 python)结合使用的文档。编辑:如果你不能用 Python 帮助我,我会打开一个新问题,将问题重定向到 python win32api 用户。
  • @Azeirah 我对 Python 无能为力。剩下两种选择:1) 用 C++ 构建一个 DLL(或 EXE),它是一个 COM 服务器,可从 Python 调用。或者 2) 直接在 Python 中实现整个事情,如果可以在 Python 中实现一个从 IDispatch 继承的接口。
  • 我知道这已经有一段时间了,但是我仍然有这个问题。我现在对 C++、python 和所有东西有了更多的了解。如果您仍然拥有此答案中提到的 c++ 代码,您可以将其发送到我的电子邮件吗?电子邮件@martijnbrekelmans.com
  • 放假时间,来,下周做一些考古工作。如果我似乎忘记了,戳我。
  • 嘿,这是你的戳:)
【解决方案2】:

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

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

这样您就可以从 GUI 获取信息。

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

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

这是 C++,但此时您可以包装本机代码。 这样,您必须自己提取 ID3 标签。可能值得一试,因为这将是一个通用的解决方案。

【讨论】:

  • 检索所有文件实际上听起来像是一个不错的备份计划。但是,WMP 经常打开两个文件,因此很难使用。如果一切都失败了,我想我会对此进行更多研究。
  • 它不会查询所有文件,只查询正在播放的文件。 WMP 的播放列表中显示每首歌曲,但仅打开当前播放的歌曲以供连续阅读。我建议的第二个解决方案只查找一个打开的文件句柄。对了,你觉得 pywinauto 怎么样?
猜你喜欢
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多