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

Aze*_*rah 9 python windows winapi wmp zune

我的应用程序从众多音乐播放器中检索当前播放的歌曲.但是,我在实现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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Zune播放器

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

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

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

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

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

所以,继续下一个方法.

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

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

事实上,它使用名称"MsnMsgrUIManager"#000000">导致zune软件向其发送有关正在播放哪首歌的信息?有没有办法在没有这种黑客的情况下获取此信息?

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

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

再一次,我碰到,我不知道如何与这个工作,即使这个问题如果我上它有文档,哎呀,如果它甚至就是我一直在寻找.

可能会考虑的替代方向

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

还有别的,真的.

Kob*_*r42 1

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

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

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

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

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

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