我想为某个东西制作程序,它需要知道媒体播放器中当前正在播放的音频文件的名称。我可能会使用VLC媒体播放器。
如何用Python实现呢?
答案 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 ...