Вам повезло, что вы хотите использовать VLC, потому что вы можете получить доступ к данным без каких-либо хакерских действий, таких как поиск указателей в памяти процесса VLC, чтобы выяснить, где хранится название песни.Вместо этого мы сделаем это «хакерским» способом, где не будет взлома, просто тупо найди название и извлеки название песни.
Откройте любую песню в 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 и толькоВы можете сделать это, если хотите.
Это очень странно, и не гарантированно будет работать где-либо, кроме окон, где 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 других платформ, если вы все еще хотите это сделать ...