#!/usr/bin/env lua
local table_to_cmd = function(t)
local str = ""
for _, v in ipairs(t) do
v = v:gsub("'", "'")
str = str .. " '" .. v .. "' "
end
return str
end
local file_exists = function(path)
return io.open(path, "r") and true or false
end
local run = function(args)
local sig, rc, stdout, cmd
if mp then
cmd = mp.command_native({
name = "subprocess",
capture_stdout = true,
args = args,
})
if cmd then
stdout = cmd.stdout
rc = (cmd.status >= 0)
end
else
cmd = io.popen(table_to_cmd(args))
if cmd then
stdout = cmd:read("*all")
_, sig, rc = cmd:close()
rc = (sig == "signal") or (sig == "exit" and rc == 0)
end
end
return stdout or "", rc
end
local table_merge = function(t1, t2)
local t = {}
t1 = t1 or {}
t2 = t2 or {}
for k, v in pairs(t1) do
t[k] = v
end
for k, v in pairs(t2) do
t[k] = v
end
return t
end
local array_merge = function(a1, a2)
local a = {}
a1 = a1 or {}
a2 = a2 or {}
for _, v in ipairs(a1) do
a[#a + 1] = v
end
for _, v in ipairs(a2) do
a[#a + 1] = v
end
return a
end
local array_search = function(a, key)
for _, v in pairs(a) do
if v == key then
return true
end
end
return false
end
local table_print = function(t)
for k, v in pairs(t) do
print("|" .. k .. "=" .. v .. "|")
end
end
local table_match_or_any = function(t, key)
local str
str = t[key]
if not str then
_, str = next(t, nil)
end
return str
end
local zip_ext_first = function(zip, out)
local dir, rc, srt, findcmd
dir = os.tmpname()
os.remove(dir)
findcmd = { "find", dir, "-type", "f", "-name", "*.srt" }
_, rc = run({ "unzip", "-qq", zip, "-d", dir })
srt = run(findcmd):match("[^\n]*")
run({ "mv", srt, out })
os.remove(dir)
return rc
end
local string_vid_path_to_name = function(str)
local extensions = {
"mkv",
"mp4",
"webm",
"flv",
"gif",
"gifv",
"avi",
"mpeg",
"3gp",
}
str = str:match("[^/]*$")
for _, ext in ipairs(extensions) do
str = str:gsub("." .. ext, "")
end
return str
end
local error = function(str)
str = "error: " .. str
if mp then
mp.msg.warn(str)
else
print(str)
end
end
local opensubtitles_hash = function(fileName)
local fil = io.open(fileName, "rb")
if not fil then
return nil
end
local lo, hi = 0, 0
for _ = 1, 8192 do
local a, b, c, d = fil:read(4):byte(1, 4)
lo = lo + a + b * 256 + c * 65536 + d * 16777216
a, b, c, d = fil:read(4):byte(1, 4)
hi = hi + a + b * 256 + c * 65536 + d * 16777216
while lo >= 4294967296 do
lo = lo - 4294967296
hi = hi + 1
end
while hi >= 4294967296 do
hi = hi - 4294967296
end
end
local size = fil:seek("end", -65536) + 65536
for _ = 1, 8192 do
local a, b, c, d = fil:read(4):byte(1, 4)
lo = lo + a + b * 256 + c * 65536 + d * 16777216
a, b, c, d = fil:read(4):byte(1, 4)
hi = hi + a + b * 256 + c * 65536 + d * 16777216
while lo >= 4294967296 do
lo = lo - 4294967296
hi = hi + 1
end
while hi >= 4294967296 do
hi = hi - 4294967296
end
end
lo = lo + size
while lo >= 4294967296 do
lo = lo - 4294967296
hi = hi + 1
end
while hi >= 4294967296 do
hi = hi - 4294967296
end
fil:close()
return string.format("%08x%08x", hi, lo), size
end
return {
table_merge = table_merge,
table_print = table_print,
table_match_or_any = table_match_or_any,
array_merge = array_merge,
array_search = array_search,
zip_ext_first = zip_ext_first,
string_vid_path_to_name = string_vid_path_to_name,
opensubtitles_hash = opensubtitles_hash,
file_exists = file_exists,
run = run,
error = error,
}