lua: add mpv/lua directories to the lua path

Signed-off-by: wm4 <wm4@nowhere>
This commit is contained in:
Otto Modinos 2014-09-24 21:17:49 +03:00 committed by wm4
parent 34fc0720f7
commit cbfb6de667
2 changed files with 33 additions and 3 deletions

View File

@ -2,9 +2,14 @@ LUA SCRIPTING
=============
mpv can load Lua scripts. Scripts in ``~/.mpv/lua/`` will be loaded on program
start, or if passed to ``--lua``. mpv provides the built-in module ``mp``, which
provides functions to send commands to the mpv core and to retrieve information
about playback state, user settings, file information, and so on.
start, or if passed to ``--lua``. mpv appends ``~/.mpv/lua`` to the end of
lua's path so you can import them too. Since it's added to the end, don't name
scripts you want to import the same as lua libraries because they will be
overshadowed by them.
mpv provides the built-in module ``mp``, which provides functions to send
commands to the mpv core and to retrieve information about playback state, user
settings, file information, and so on.
These scripts can be used to control mpv in a similar way to slave mode.
Technically, the Lua code uses the client API internally.

View File

@ -215,6 +215,28 @@ static int load_scripts(lua_State *L)
return 0;
}
static void set_path(lua_State *L)
{
void *tmp = talloc_new(NULL);
lua_getglobal(L, "package"); // package
lua_getfield(L, -1, "path"); // package path
const char *path = lua_tostring(L, -1);
char *newpath = talloc_strdup(tmp, path ? path : "");
char **luadir = mp_find_all_config_files(tmp, get_mpctx(L)->global, "lua");
for (int i = 0; luadir && luadir[i]; i++) {
newpath = talloc_asprintf_append(newpath, ";%s",
mp_path_join(tmp, bstr0(luadir[i]), bstr0("?.lua")));
}
lua_pushstring(L, newpath); // package path newpath
lua_setfield(L, -3, "path"); // package path
lua_pop(L, 2); // -
talloc_free(tmp);
}
static int run_lua(lua_State *L)
{
struct script_ctx *ctx = lua_touserdata(L, -1);
@ -268,6 +290,9 @@ static int run_lua(lua_State *L)
assert(lua_gettop(L) == 0);
set_path(L);
assert(lua_gettop(L) == 0);
// run this under an error handler that can do backtraces
lua_pushcfunction(L, error_handler); // errf
lua_pushcfunction(L, load_scripts); // errf fn