gpt4 book ai didi

lua - 如何为 VLC 编写响应播放、暂停和停止事件的插件?

转载 作者:行者123 更新时间:2023-12-04 07:24:35 26 4
gpt4 key购买 nike

我想为 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

笔记:
  • VLC 将调用 activate() , deactivate() , meta_changed()在插件生命周期的某个时刻。您不需要包含它们,但 VLC 会用无用的“未找到函数”消息填充您的调试日志。
  • 如果插件的功能包含 playing-listener , VLC 将期望 playing_changed()钩子(Hook)并在适当的时候调用它(即使代码注释说钩子(Hook)名称是“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到插件的功能。
  • 添加对应的钩子(Hook)input_changed() .
  • 使用 vlc.input.item() 获取当前项目(名称、URI、元数据等)。
  • 您可以将正在播放的内容发布到 HTTP 服务器。 VLC 提供 vlc.net ,这意味着您必须为套接字编程。幸运的是,扩展 vlsub ,默认情况下与 VLC 一起提供,具有 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

    关于lua - 如何为 VLC 编写响应播放、暂停和停止事件的插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15795385/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com