我想为VLC编写一个非常简单的插件,在播放,暂停或停止媒体时发出Web请求。它与scrobbling插件非常相似。
我看到VLC支持插件和扩展(这是非常简单的Lua脚本),但我无法找到有关如何执行此操作的任何信息。
我想我需要编写一个注册一些回调的插件 - 我是对的吗?关于如何实现这一点的任何想法?想出这个似乎是一场艰难的战斗。我可以使用Python吗?
答案 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
注意:
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)
activate()
将被称为vlc.msg
来电),请打开工具>消息( Ctrl + M ),将级别设置为调试并按" lua" 在新项目播放时执行某些操作:
input-listener
添加到插件的功能input_changed()
vlc.input.item()
获取当前项目(名称,URI,元数据等)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