add modules directory and lssi, the first module!

This commit is contained in:
2023-07-09 21:40:42 -04:00
parent 7f40900718
commit 663110af1e
3 changed files with 177 additions and 0 deletions

28
modules/README.md Normal file
View File

@ -0,0 +1,28 @@
# Modules
Modules are extentions to the EatIt plugin manager that aren't necessary for
running it. Every module will be in it's own sub directory in order to keep
documentation relative to the individual modules.
## List of modules
- `lssi.lua` Lua Script Script Injector for modifing files post install
## Installing
Installing a module can be done through EatIt like so:
```lua
plugins = { -- the plugins you want to load
{ 'https://git.squi.bid/eat-it',
file = 'modules/moddir/module.lua',
dir = 'scripts',
},
}
```
## For Devs
Please add a table in the global scope called 'mod' as this may be used in the
future. It should look like this:
```lua
mod = {
version = 'version',
author = 'autor name',
}
```

16
modules/lssi/LSSI.md Normal file
View File

@ -0,0 +1,16 @@
# Using lssi
Any plugin can be modified by lssi by doing the following in the eatit-cfg.lua:
```lua
plugins = { -- the plugins you want to load
{ 'https://git.squi.bid/eat-it',
file = 'eatit.lua',
dir = 'scripts',
lssi = {
-- code line
{ 'print("hello world")', 'G' },
}
},
}
```
The line option can be 'g' for top of file, 'G' for bottom of file, or any
number in between.

133
modules/lssi/lssi.lua Normal file
View File

@ -0,0 +1,133 @@
--[[
Eat It - a Mpv plugin manager
Copyright © 2023 squibid
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
]]
-- NOTE: This is a POC and will most likely be reimplimented using diff files
-- with git
-- or we might want to generate a diff file from the requested changes
-- and check if the diffs match in content
--[[
Lua Script Script Injector
Takes an input file and code then, it outputs a file with your code in there.
]]--
local mp = require('mp')
mod = {
version = 'ALPHA 1', -- the current version of lssi
author = 'squibid',
}
-- load the eatit config file
dofile(mp.command_native({'expand-path', '~~/eatit-cfg.lua'}))
-- helper functions
local function tablelength(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end
local function fileexists(name)
local f = io.open(name, 'r')
if f ~= nil then io.close(f) return true else return false end
end
local function logwrite(string)
if opts.logging.log then
io.write(os.date(opts.logging.logdate) .. ' ' .. string .. '\n')
end
end
local function openlog()
if opts.logging.log then -- log if asked to
-- get our logfile's full path
fn = mp.command_native({'expand-path', opts.logging.logfile})
f = io.open(fn, 'a') -- open file buffer
io.output(f) -- set it as default
end
end
local function closelog()
if opts.logging.log then
io.close(f)
end
end
local function inject(infile, l, outfile)
local inf = io.open(infile, 'r')
local infcont = {}
for i in inf:lines() do
table.insert(infcont, i)
end
inf:close()
-- don't do anything if there is already code injected into the file
if string.find(infcont[1], "-- code injected by lssi") then
logwrite('code is already injected into ' .. infile)
return
end
logwrite('Injecting code into ' .. infile)
for i in pairs(l) do
-- add requested line below existing line
if l[i][2] == 'G' then
infcont[tablelength(infcont)] = infcont[tablelength(infcont)] .. '\n' .. l[i][1]
elseif l[i][2] == 'g' then
infcont[1] = l[i][1] .. '\n' .. infcont[1]
else
infcont[l[i][2]] = (infcont[l[i][2]]) .. '\n' .. l[i][1]
end
end
local outf = io.open(outfile, 'w')
-- we inject metadata to prevent writing to the file more than once
infcont[1] = "-- code injected by lssi " .. mod.version .. '\n' .. infcont[1]
for i, v in ipairs(infcont) do
outf:write(v .. '\n')
end
io.close(outf)
end
local function checkandinject()
openlog()
for i = 1, tablelength(plugins) do
-- get the file we want to inject our code into
local f = mp.command_native({'expand-path', '~~/'}) ..
'/' .. plugins[i]['dir'] ..
'/' .. plugins[i]['file']
-- check if the plugin has been configured with lssi
if plugins[i]['lssi'] then
-- and the file we are trying to modify actually exists
if fileexists(f) then
-- inject it! no going back now
inject(f, plugins[i]['lssi'], f)
else
logwrite('Failed to inject code into "' ..
plugins[i]['file'] .. '" file does not exist')
end
end
end
closelog()
end
checkandinject()