我想为 VLC 编写一个非常简单的插件,它在播放、暂停或停止媒体时发出 Web 请求。它是一个非常类似于 scrobbling 的插件。
我看到 VLC 支持插件和扩展(它们是非常简单的 Lua 脚本),但我无法找到有关如何执行此操作的任何信息。
我想我需要编写一个注册一些回调的插件——对吗?关于我如何做到这一点的任何想法?弄清楚这一点似乎是一场艰苦的战斗。我可以使用 Python 做到这一点吗?
我在 Windows 上使用 VLC 2.2.1。
这是一个识别播放/暂停/停止事件的简单 Lua 插件:
function descriptor()
  return {
    title = "VLC Dummy Extension",
    capabilities = { "playing-listener" }
  }
end
function activate()
end
function deactivate()
end
function meta_changed()
end
function playing_changed()
  vlc.msg.dbg("[Dummy] Status: " .. vlc.playlist.status())
end
笔记:
activate(), 。您不需要包含它们,但 VLC 会用无用的“未找到函数”消息填充您的调试日志。deactivate()meta_changed()playing-listener,VLC 将期待playing_changed()钩子并在适当的时候调用它(即使代码注释说钩子名称是“status_changed”)。vlc.playlist.status()返回“停止”、“播放”、“暂停”或“未知”。跑:
%APPDATA%\vlc\lua\extensions\(Windows)或~/.local/share/vlc/lua/extensions/(Linux)。activate()将被调用。vlc.msg调用),请打开工具 > 消息 ( Ctrl+ M),将级别设置为调试并按“lua”过滤。每当播放新项目时执行以下操作:
input-listener到插件的功能。input_changed()。vlc.input.item()获取当前项目(名称、URI、元数据等)。vlc.net,这意味着您必须为套接字编程。幸运的是,默认情况下随 VLC 提供的扩展vlsub具有发送 GET 请求的实用方法。我们可以偷那些。在这个例子中,我只是发送一个线程 GET:
http://127.0.0.1:5000/?name=MMFR.2015.720p.mp4
如果我不关心重定向或阅读响应,get()它比 vlsub 的版本简单得多:
function descriptor()
  return {
    title = "VLC Dummy Extension",
    capabilities = { "input-listener" }
  }
end
function activate()
end
function deactivate()
end
function meta_changed()
end
function input_changed()
  if vlc.input.is_playing() and vlc.playlist.status() == "playing" then
    local item = vlc.input.item()
    if item then
      vlc.msg.dbg("[Dummy] Now playing: " .. item:name())
      get("http://127.0.0.1:5000/?name=" .. item:name())
    end
  end
end
function get(url)
  local u = vlc.net.url_parse(url)
  local host, port, path = u["host"], u["port"], u["path"]
  local header = {
    "GET "..path.." HTTP/1.1",
    "Host: "..host,
    "",
    ""
  }
  local request = table.concat(header, "\r\n")
  http_req(host, port, request)
end
function http_req(host, port, request)
  local fd = vlc.net.connect_tcp(host, port)
  if not fd then return false end
  local pollfds = {}
  pollfds[fd] = vlc.net.POLLIN
  vlc.net.send(fd, request)
  vlc.net.poll(pollfds)
  local chunk = vlc.net.recv(fd, 2048)
  while chunk do
    vlc.net.poll(pollfds)
    chunk = vlc.net.recv(fd, 1024)
  end
  vlc.net.close(fd)
end
您有两个选择:编写一个 lua 模块(查看 MSN 通知插件以获取示例代码)或编写一个 C 插件(类似于您已经找到的 scrobbler)。
我建议使用 lua 方式,因为它是跨平台兼容的,而且它是一种更简单的语言。此外,除非您使用 Linux 或 OS X,否则为 VLC 编译 C 插件真的很痛苦。
目前仅 VLC 之上的客户端应用程序支持 Python,但我们不支持在 VLC 内部使用它。