如何为VLC编写一个响应播放,暂停和停止事件的插件?

Mri*_*lla 8 lua vlc

我想为VLC编写一个非常简单的插件,在媒体播放,暂停或停止时发出Web请求.它与scrobbling插件非常相似.

我看到VLC支持插件和扩展(这是非常简单的Lua脚本),但我无法找到有关如何执行此操作的任何信息.

我想我需要编写一个注册一些回调的插件 - 我是对的吗?关于如何实现这一点的任何想法?想出这个似乎是一场艰难的战斗.我可以使用Python吗?

app*_*lue 7

我在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
Run Code Online (Sandbox Code Playgroud)

笔记:

  • VLC会叫activate(),deactivate(),meta_changed()在插件生命周期的某个点.您不需要包含它们,但VLC将使用无用的"未找到功能"消息填满您的调试日志.
  • 如果插件的功能包含playing-listener,VLC将指望playing_changed()挂钩并在适当时调用它.代码注释表示钩子名称是"status_changed".它在说谎.
  • vlc.playlist.status() 返回"已停止","正在播放","暂停"或"未知".

跑:

  • 将插件保存在.lua文件中,然后将其放入VLC的扩展文件夹中 :( %APPDATA%\vlc\lua\extensions\Windows)或~/.local/share/vlc/lua/extensions/(Linux)

  • 加载它:工具>插件和扩展,重新加载扩展(不需要重新启动VLC)

  • 激活它(View下有一个选项,以插件描述符中的title命名); activate()将被召唤
  • 要查看所有日志(vlc.msg调用),请打开工具>消息(Ctrl+ M),将级别设置为调试并按"lua"过滤

在新项目播放时执行某些操作:

  • 添加input-listener到插件的功能
  • 添加相应的钩子 input_changed()
  • 使用vlc.input.item()来获取当前项目(姓名,URI,元数据等)
  • 您可以将正在播放的内容发布到HTTP服务器.VLC提供vlc.net,这意味着您必须为套接字编程.您不想为套接字编程.幸运的是,默认情况下随VLC一起提供的扩展vlsub具有发送GET请求的实用方法.窃取那些.

在这个例子中,我只是发送一个破旧的GET:

http://127.0.0.1:5000/?name=MMFR.2015.720p.mp4
Run Code Online (Sandbox Code Playgroud)

我不关心重定向或阅读响应,因此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
Run Code Online (Sandbox Code Playgroud)

  • @Brad不幸的是,你不能。要加载扩展,VLC必须设置一个线程,一个事件循环,然后注册Lua挂钩,以便它们从VLC内核获取更新。这发生在C语言中。在加载接口时,VLC不会执行任何操作,您也无法从Lua接口脚本中获取任何信息。 (2认同)

fee*_*epk 2

您有两个选择:编写一个 lua 模块(查看 MSN 通知插件以获取示例代码)或编写一个 C 插件(类似于您已经找到的 scrobbler)。

我建议使用 lua 方式,因为它是跨平台兼容的,并且是一种更简单的语言。此外,除非您使用 Linux 或 OS X,否则为 VLC 编译 C 插件确实很痛苦。

目前,仅 VLC 之上的客户端应用程序支持 Python,但我们不支持在 VLC 内部使用它。