Python - Как узнать, какая песня воспроизводится в медиаплеере (предпочтительно VLC) - PullRequest
0 голосов
/ 17 октября 2018

Я хочу сделать программу для чего-то, и это требует знания названия аудиофайла, который воспроизводится в данный момент в медиаплеере.Я, вероятно, буду использовать медиаплеер VLC.

Как мне добиться этого с помощью Python?

1 Ответ

0 голосов
/ 19 октября 2018

Вам повезло, что вы хотите использовать 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 других платформ, если вы все еще хотите это сделать ...

...