obs-replay-folders/OBSReplayFolders.lua

77 lines
2 KiB
Lua

obs = obslua
function script_description()
return [[Saves replays to sub-folders using the current fullscreen video game executable name.
Author: redraskal]]
end
function script_load()
ffi = require("ffi")
ffi.cdef[[
int get_running_fullscreen_game_path(char* buffer, int bufferSize)
]]
detect_game = ffi.load(script_path() .. "detect_game.dll")
obs.obs_frontend_add_event_callback(obs_frontend_callback)
end
function obs_frontend_callback(event)
if event == obs.OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVED then
local folder = get_running_game_title()
local path = get_replay_buffer_output()
if path ~= nil and folder ~= nil then
print("Moving " .. path .. " to " .. folder)
move(path, folder)
end
end
end
function get_replay_buffer_output()
local replay_buffer = obs.obs_frontend_get_replay_buffer_output()
local cd = obs.calldata_create()
local ph = obs.obs_output_get_proc_handler(replay_buffer)
obs.proc_handler_call(ph, "get_last_replay", cd)
local path = obs.calldata_string(cd, "path")
obs.calldata_destroy(cd)
obs.obs_output_release(replay_buffer)
return path
end
function get_running_game_title()
local path = ffi.new("char[?]", 260)
local result = detect_game.get_running_fullscreen_game_path(path, 260)
if result ~= 0 then
return nil
end
result = ffi.string(path)
local len = #result
if len == 0 then
return nil
end
local max = len - 4
local i = max
while i > 1 do
local char = result:sub(i, i)
if char == "\\" then
break
end
i = i - 1
end
local title = result:sub(i + 1, max)
-- Trim "-Win64-Shipping" if it exists
local trimmed_title = title:gsub("-Win64%-Shipping$", "")
return trimmed_title
end
function move(path, folder)
local sep = string.match(path, "^.*()/")
local root = string.sub(path, 1, sep) .. folder
local file_name = string.sub(path, sep, string.len(path))
local adjusted_path = root .. file_name
if obs.os_file_exists(root) == false then
obs.os_mkdir(root)
end
obs.os_rename(path, adjusted_path)
end