Python-如何知道正在媒体播放器(最好是VLC)中播放哪首歌

时间:2018-10-17 14:57:10

标签: python python-3.x audio vlc

我想为某个东西制作程序,它需要知道媒体播放器中当前正在播放的音频文件的名称。我可能会使用VLC媒体播放器。

如何用Python实现呢?

1 个答案:

答案 0 :(得分:0)

您很幸运地希望使用VLC,因为您可以毫无困难地访问数据,例如,在VLC进程存储器中查找指针以找出歌曲名称的存储位置。取而代之的是,我们将以“ hacky”的方式进行操作,而不会被黑客入侵,只需愚蠢地找到标题并提取歌曲名称即可。

在VLC中打开任何歌曲,然后检查标题是什么。

这就是filename - VLC media player,这正是您所需要的。

通常我不这样做,但是由于这是一个非常具体的问题,当您对win32 API不太了解时很难做到这一点,我将提供一个示例来说明如何实现。

遗憾的是,这在很大程度上取决于平台,但这是在Windows上执行此操作的一种方法(因为我不知道如何在其他任何平台上执行此操作):

您将需要ctypes模块。

import ctypes
from ctypes import c_int
from ctypes.wintypes import BOOL, HWND, LPARAM, LPWSTR


# You need to decorate function for callback
# to work, so I just put the decoration into another decorator
def win32_callback(callback):
    return ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM)(callback)


# We need to tell ctypes what arguments must be passed to actual win32 functions that we will be using
def init_user32():
    user32 = ctypes.windll.user32
    user32.EnumWindows.argtypes = [ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM), LPARAM]
    user32.GetWindowTextLengthW.argtypes = [HWND]
    user32.GetWindowTextW.argtypes = [HWND, LPWSTR, c_int]
    return user32


user32 = init_user32()


# Now, the actual logic:
@win32_callback 
def find_vlc_title(hwnd, lParam):
    length = user32.GetWindowTextLengthW(hwnd) + 1
    buff = ctypes.create_unicode_buffer(length)
    user32.GetWindowTextW(hwnd, buff, length)
    title = buff.value
    if "VLC" in title:
        print("vlc window title:", title)
        title_without_vlc = "-".join(title.split("-")[:-1])
        print("Remove vlc tag:", title_without_vlc)
        title_without_ext = ".".join(title.split(".")[:-1])
        print("Finally display actual song name without extension:", title_without_ext)
        # pass title_without_ext into a function, object or whatever you want there, win32 API isn't python friendly, and you can't just return it
        return False # Enumeration stops when we return False
    return True # keep Enumerating otherwise


if __name__ == "__main__":
    user32.EnumWindows(find_vlc_title, 0)

很多事情都是Windows特有的,要了解它们,您需要学习使用Win32 API的知识,并且只有您才能这样做。

这很容易破解,不能保证在Windows之外的任何地方都能正常工作。在Windows上,VLC会显示已打开文件的名称,并在文件末尾带有自己的“ VLC”标签。

我打开VLC并播放了随机歌曲,这就是我得到的:

$ python title.py
vlc window title: ParagonX9 - Blue Sky.mp3 - VLC leistuvė
Remove vlc tag: ParagonX9 - Blue Sky.mp3
Finally display actual song name without extension: ParagonX9 - Blue Sky

如果您仍然想要这样做,请获得其他平台的有趣学习API ...