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

时间:2013-04-03 18:41:24

标签: lua vlc

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

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

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

1 个答案:

答案 0 :(得分: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

注意:

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

执行命令

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

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

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

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

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

在这个例子中,我只是发送了一个破旧的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