add modules directory and lssi, the first module!
This commit is contained in:
28
modules/README.md
Normal file
28
modules/README.md
Normal 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
16
modules/lssi/LSSI.md
Normal 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
133
modules/lssi/lssi.lua
Normal 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()
|
Reference in New Issue
Block a user