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

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()