#!/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, }