Skip to content

Instantly share code, notes, and snippets.

@danieleambrosino
Last active January 19, 2023 03:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danieleambrosino/6f4a077cdceee94386339c62f6bea262 to your computer and use it in GitHub Desktop.
Save danieleambrosino/6f4a077cdceee94386339c62f6bea262 to your computer and use it in GitHub Desktop.
Simple Lua script for switching scene automatically in OBS
local settings = {
active = false,
main_scene_index = 1,
main_scene_probability = 0.75,
main_scene_min_duration_ms = 3000,
main_scene_max_duration_ms = 5000,
secondary_scene_min_duration_ms = 2000,
secondary_scene_max_duration_ms = 3000,
}
local scenes = nil
local current_scene_index = settings.main_scene_index
local previous_scene_index = nil
local function pick_next_scene_index()
local next_scene_index = nil
repeat
if math.random() < settings.main_scene_probability then
next_scene_index = settings.main_scene_index
else
next_scene_index = math.random(settings.main_scene_index + 1, #scenes)
end
until next_scene_index ~= current_scene_index
and (next_scene_index ~= previous_scene_index or next_scene_index == settings.main_scene_index)
return next_scene_index
end
local function get_scene_duration_ms(scene_index)
if scene_index == settings.main_scene_index then
return math.random(settings.main_scene_min_duration_ms, settings.main_scene_max_duration_ms)
end
return math.random(settings.secondary_scene_min_duration_ms, settings.secondary_scene_max_duration_ms)
end
local function schedule_next_switch()
obslua.timer_remove(switch_scene)
local next_switch_after_ms = get_scene_duration_ms(current_scene_index)
obslua.timer_add(switch_scene, next_switch_after_ms)
end
local function activate(active)
if settings.active == active then return end
if not active then obslua.timer_remove(switch_scene) return end
schedule_next_switch()
end
function switch_scene()
local next_scene_index = pick_next_scene_index()
previous_scene_index = current_scene_index
current_scene_index = next_scene_index
obslua.obs_frontend_set_current_scene(scenes[current_scene_index])
schedule_next_switch()
end
function script_load()
math.randomseed(os.time())
scenes = obslua.obs_frontend_get_scenes()
end
function script_description()
return "<center>✨🎬 <strong>Automagic Scene Switcher</strong> 🎬✨</center>"
end
function script_properties()
local properties = obslua.obs_properties_create()
obslua.obs_properties_add_bool(properties, "active", "Active")
obslua.obs_properties_add_float_slider(properties, "main_scene_probability", "Main scene probability", 0, 0.95, 0.05)
obslua.obs_properties_add_int_slider(properties, "main_scene_min_duration_ms", "Main scene min duration (ms)", 100, 20000, 100)
obslua.obs_properties_add_int_slider(properties, "main_scene_max_duration_ms", "Main scene max duration (ms)", 100, 20000, 100)
obslua.obs_properties_add_int_slider(properties, "secondary_scene_min_duration_ms", "Secondary scene min duration (ms)", 100, 20000, 100)
obslua.obs_properties_add_int_slider(properties, "secondary_scene_max_duration_ms", "Secondary scene max duration (ms)", 100, 20000, 100)
return properties
end
function script_defaults(s)
obslua.obs_data_set_default_bool(s, "active", settings.active)
obslua.obs_data_set_default_double(s, "main_scene_probability", settings.main_scene_probability)
obslua.obs_data_set_default_int(s, "main_scene_min_duration_ms", settings.main_scene_min_duration_ms)
obslua.obs_data_set_default_int(s, "main_scene_max_duration_ms", settings.main_scene_max_duration_ms)
obslua.obs_data_set_default_int(s, "secondary_scene_min_duration_ms", settings.secondary_scene_min_duration_ms)
obslua.obs_data_set_default_int(s, "secondary_scene_max_duration_ms", settings.secondary_scene_max_duration_ms)
end
function script_update(s)
local active = obslua.obs_data_get_bool(s, "active")
activate(active)
settings.active = active
settings.main_scene_probability = obslua.obs_data_get_double(s, "main_scene_probability")
settings.main_scene_min_duration_ms = obslua.obs_data_get_int(s, "main_scene_min_duration_ms")
settings.main_scene_max_duration_ms = obslua.obs_data_get_int(s, "main_scene_max_duration_ms")
settings.secondary_scene_min_duration_ms = obslua.obs_data_get_int(s, "secondary_scene_min_duration_ms")
settings.secondary_scene_max_duration_ms = obslua.obs_data_get_int(s, "secondary_scene_max_duration_ms")
end
function script_unload()
obslua.source_list_release(scenes)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment