gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:28:29 26 4
gpt4 key购买 nike

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

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

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

  • 每 4 秒遍历所有打开的窗口
  • 获取所有窗口的标题
  • 检查模式的标题(即," - Spotify ")
  • 如果它在那里,调整输出的标题。

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

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

    Windows 媒体播放器

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

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

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

    Zune

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

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

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

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

    下一个问题是它也不一致,有时标题只是在 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 是病毒吗?”。

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

    其他方向可以查看

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

    还有什么,真的。

    最佳答案

    我有 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 接口(interface)指针

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

    5) 使用您在 3) 处获得的接口(interface)中的 SetClientSite 方法,将指针传递给您的 OleClientSite 实现。

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

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

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

    9) 完毕

    以上都是用VS2010/Windows 7测试的,运行WMP(如果没有运行媒体播放器进程,什么都不做)。

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

    关于python - 需要一种使用 Python 从 Zune 和 Windows Media Player 中检索当前播放歌曲的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19452001/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com