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