aboutsummaryrefslogtreecommitdiffstats
path: root/modules/lssi/lssi.lua
diff options
context:
space:
mode:
authorSquibid <me@zacharyscheiman.com>2023-07-09 21:40:42 -0400
committerSquibid <me@zacharyscheiman.com>2023-07-09 21:40:42 -0400
commit663110af1ee4073b55b1893050a1c36989ba56fc (patch)
treed07932a91175798b320408432931fe1577eadd19 /modules/lssi/lssi.lua
parent7f409007184d0d3ea5ae880f708b6284f99844d6 (diff)
downloadeat-it-663110af1ee4073b55b1893050a1c36989ba56fc.tar.gz
eat-it-663110af1ee4073b55b1893050a1c36989ba56fc.tar.bz2
eat-it-663110af1ee4073b55b1893050a1c36989ba56fc.zip
add modules directory and lssi, the first module!
Diffstat (limited to 'modules/lssi/lssi.lua')
-rw-r--r--modules/lssi/lssi.lua133
1 files changed, 133 insertions, 0 deletions
diff --git a/modules/lssi/lssi.lua b/modules/lssi/lssi.lua
new file mode 100644
index 0000000..cc01f0f
--- /dev/null
+++ b/modules/lssi/lssi.lua
@@ -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()