Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ This is a Lua script for OBS Studio that sets a text source as a timer with adva
- Streaming timer (starts timer when streaming starts)
- Recording timer (starts timer when recording start)
- With the countdown modes, there is an option to countup when the countdown is finished
- With Countdown and Countup modes there is an option to add or remove a fixed amount of seconds from the current timer, amount set in Increment Amount

**Formatting**
The default format is: %0H:%0m:%0s (00:00:00)
Expand Down Expand Up @@ -39,4 +40,4 @@ The default format is: %0H:%0m:%0s (00:00:00)


**Hotkeys**
Hotkeys can be set for starting/stopping and to the reset timer.
Hotkeys can be set for starting/stopping, adding or removing time from the timer, and to the reset timer.
98 changes: 95 additions & 3 deletions advanced-timer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ settings_ = nil
orig_time = 0
cur_time = 0
cur_ns = 0
increment_amount = 0
up_when_finished = false
up = false
paused = false
Expand All @@ -20,6 +21,8 @@ next_scene = ""

hotkey_id_reset = obs.OBS_INVALID_HOTKEY_ID
hotkey_id_pause = obs.OBS_INVALID_HOTKEY_ID
hotkey_id_plus = obs.OBS_INVALID_HOTKEY_ID
hotkey_id_minus = obs.OBS_INVALID_HOTKEY_ID

function delta_time(year, month, day, hour, minute, second)
local now = os.time()
Expand Down Expand Up @@ -292,6 +295,45 @@ function on_pause(pressed)
end
end

function plus_or_minus(pressed, addition)
if not pressed then
return
end

if mode == "Streaming timer" or mode == "Recording timer" then
return
else
if cur_ns == 0 then
-- Initial value, need to initialize cur_ns to effect first run of timer
cur_ns = cur_time
end
local delta = increment_amount * 1000000000
if not addition then
delta = delta * -1
end
cur_time = cur_time + delta
if not timer_active then
set_time_text(cur_time, format)
end
end
end

function plus(pressed)
if not pressed then
return
end
plus_or_minus(true, true)
return true
end

function minus(pressed)
if not pressed then
return
end
plus_or_minus(true, false)
return true
end

function pause_button_clicked(props, p)
on_pause(true)
return true
Expand All @@ -302,9 +344,20 @@ function reset_button_clicked(props, p)
return true
end

function plus_button_clicked(props, p)
plus_or_minus(true, true)
return true
end

function minus_button_clicked(props, p)
plus_or_minus(true, false)
return true
end

function settings_modified(props, prop, settings)
local mode_setting = obs.obs_data_get_string(settings, "mode")
local p_duration = obs.obs_properties_get(props, "duration")
local p_increment_amount = obs.obs_properties_get(props, "increment_amount")
local p_offset = obs.obs_properties_get(props, "offset")
local p_year = obs.obs_properties_get(props, "year")
local p_month = obs.obs_properties_get(props, "month")
Expand All @@ -316,6 +369,8 @@ function settings_modified(props, prop, settings)
local p_a_mode = obs.obs_properties_get(props, "a_mode")
local button_pause = obs.obs_properties_get(props, "pause_button")
local button_reset = obs.obs_properties_get(props, "reset_button")
local button_plus = obs.obs_properties_get(props, "plus_button")
local button_minus = obs.obs_properties_get(props, "minus_button")
local up_finished = obs.obs_properties_get(props, "countup_countdown_finished")
local switch_to = obs.obs_properties_get(props, "switch_to_scene")
local next_scene = obs.obs_properties_get(props, "next_scene")
Expand All @@ -325,6 +380,7 @@ function settings_modified(props, prop, settings)

if (mode_setting == "Countdown") then
obs.obs_property_set_visible(p_duration, true)
obs.obs_property_set_visible(p_increment_amount, true)
obs.obs_property_set_visible(p_offset, false)
obs.obs_property_set_visible(p_year, false)
obs.obs_property_set_visible(p_month, false)
Expand All @@ -335,12 +391,15 @@ function settings_modified(props, prop, settings)
obs.obs_property_set_visible(p_stop_text, true)
obs.obs_property_set_visible(button_pause, true)
obs.obs_property_set_visible(button_reset, true)
obs.obs_property_set_visible(button_plus, true)
obs.obs_property_set_visible(button_minus, true)
obs.obs_property_set_visible(p_a_mode, true)
obs.obs_property_set_visible(up_finished, true)
obs.obs_property_set_visible(switch_to, true)
obs.obs_property_set_visible(next_scene, true)
elseif (mode_setting == "Countup") then
obs.obs_property_set_visible(p_duration, false)
obs.obs_property_set_visible(p_increment_amount, false)
obs.obs_property_set_visible(p_offset, true)
obs.obs_property_set_visible(p_year, false)
obs.obs_property_set_visible(p_month, false)
Expand All @@ -351,12 +410,15 @@ function settings_modified(props, prop, settings)
obs.obs_property_set_visible(p_stop_text, false)
obs.obs_property_set_visible(button_pause, true)
obs.obs_property_set_visible(button_reset, true)
obs.obs_property_set_visible(button_plus, true)
obs.obs_property_set_visible(button_minus, true)
obs.obs_property_set_visible(p_a_mode, true)
obs.obs_property_set_visible(up_finished, false)
obs.obs_property_set_visible(switch_to, false)
obs.obs_property_set_visible(next_scene, false)
elseif (mode_setting == "Specific time") then
obs.obs_property_set_visible(p_duration, false)
obs.obs_property_set_visible(p_increment_amount, false)
obs.obs_property_set_visible(p_offset, false)
obs.obs_property_set_visible(p_year, false)
obs.obs_property_set_visible(p_month, false)
Expand All @@ -367,12 +429,15 @@ function settings_modified(props, prop, settings)
obs.obs_property_set_visible(p_stop_text, true)
obs.obs_property_set_visible(button_pause, true)
obs.obs_property_set_visible(button_reset, true)
obs.obs_property_set_visible(button_plus, false)
obs.obs_property_set_visible(button_minus, false)
obs.obs_property_set_visible(p_a_mode, true)
obs.obs_property_set_visible(up_finished, true)
obs.obs_property_set_visible(switch_to, true)
obs.obs_property_set_visible(next_scene, true)
elseif (mode_setting == "Specific date and time") then
obs.obs_property_set_visible(p_duration, false)
obs.obs_property_set_visible(p_increment_amount, false)
obs.obs_property_set_visible(p_offset, false)
obs.obs_property_set_visible(p_year, true)
obs.obs_property_set_visible(p_month, true)
Expand All @@ -383,12 +448,15 @@ function settings_modified(props, prop, settings)
obs.obs_property_set_visible(p_stop_text, true)
obs.obs_property_set_visible(button_pause, true)
obs.obs_property_set_visible(button_reset, true)
obs.obs_property_set_visible(button_plus, false)
obs.obs_property_set_visible(button_minus, false)
obs.obs_property_set_visible(p_a_mode, true)
obs.obs_property_set_visible(up_finished, true)
obs.obs_property_set_visible(switch_to, true)
obs.obs_property_set_visible(next_scene, true)
elseif (mode_setting == "Streaming timer") then
obs.obs_property_set_visible(p_duration, false)
obs.obs_property_set_visible(p_increment_amount, false)
obs.obs_property_set_visible(p_offset, false)
obs.obs_property_set_visible(p_year, false)
obs.obs_property_set_visible(p_month, false)
Expand All @@ -399,12 +467,15 @@ function settings_modified(props, prop, settings)
obs.obs_property_set_visible(p_stop_text, false)
obs.obs_property_set_visible(button_pause, false)
obs.obs_property_set_visible(button_reset, false)
obs.obs_property_set_visible(button_plus, false)
obs.obs_property_set_visible(button_minus, false)
obs.obs_property_set_visible(p_a_mode, false)
obs.obs_property_set_visible(up_finished, false)
obs.obs_property_set_visible(switch_to, false)
obs.obs_property_set_visible(next_scene, false)
elseif (mode_setting == "Recording timer") then
obs.obs_property_set_visible(p_duration, false)
obs.obs_property_set_visible(p_increment_amount, false)
obs.obs_property_set_visible(p_offset, false)
obs.obs_property_set_visible(p_year, false)
obs.obs_property_set_visible(p_month, false)
Expand All @@ -415,6 +486,8 @@ function settings_modified(props, prop, settings)
obs.obs_property_set_visible(p_stop_text, false)
obs.obs_property_set_visible(button_pause, false)
obs.obs_property_set_visible(button_reset, false)
obs.obs_property_set_visible(button_plus, false)
obs.obs_property_set_visible(button_minus, false)
obs.obs_property_set_visible(p_a_mode, false)
obs.obs_property_set_visible(up_finished, false)
obs.obs_property_set_visible(switch_to, false)
Expand All @@ -437,6 +510,7 @@ function script_properties()
obs.obs_property_set_modified_callback(p_mode, settings_modified)

obs.obs_properties_add_int(props, "duration", "Countdown duration (seconds)", 1, 100000000, 1)
obs.obs_properties_add_int(props, "increment_amount", "Plus/Minus increment amount (seconds)", 1, 100000000, 1)
obs.obs_properties_add_int(props, "offset", "Countup from (seconds)", 0, 100000000, 1)
obs.obs_properties_add_int(props, "year", "Year", 1971, 100000000, 1)
obs.obs_properties_add_int(props, "month", "Month (1-12)", 1, 12, 1)
Expand Down Expand Up @@ -481,6 +555,8 @@ function script_properties()

obs.obs_properties_add_button(props, "pause_button", "Start/Stop", pause_button_clicked)
obs.obs_properties_add_button(props, "reset_button", "Reset", reset_button_clicked)
obs.obs_properties_add_button(props, "plus_button", "Plus", plus_button_clicked)
obs.obs_properties_add_button(props, "minus_button", "Minus", minus_button_clicked)

settings_modified(props, nil, settings_)

Expand Down Expand Up @@ -509,6 +585,7 @@ function script_update(settings)
up_when_finished = obs.obs_data_get_bool(settings, "countup_countdown_finished")
switch_to_scene = obs.obs_data_get_bool(settings, "switch_to_scene")
next_scene = obs.obs_data_get_string(settings, "next_scene")
increment_amount = obs.obs_data_get_int(settings, "increment_amount")

if mode == "Countdown" then
cur_time = obs.obs_data_get_int(settings, "duration") * 1000000000
Expand Down Expand Up @@ -537,6 +614,7 @@ end

function script_defaults(settings)
obs.obs_data_set_default_int(settings, "duration", 5)
obs.obs_data_set_default_int(settings, "increment_amount", 10)
obs.obs_data_set_default_int(settings, "offset", 0)
obs.obs_data_set_default_int(settings, "year", os.date("%Y", os.time()))
obs.obs_data_set_default_int(settings, "month", os.date("%m", os.time()))
Expand All @@ -550,25 +628,39 @@ end
function script_save(settings)
local hotkey_save_array_reset = obs.obs_hotkey_save(hotkey_id_reset)
local hotkey_save_array_pause = obs.obs_hotkey_save(hotkey_id_pause)
local hotkey_save_array_plus = obs.obs_hotkey_save(hotkey_id_plus)
local hotkey_save_array_minus = obs.obs_hotkey_save(hotkey_id_minus)
obs.obs_data_set_array(settings, "reset_hotkey", hotkey_save_array_reset)
obs.obs_data_set_array(settings, "pause_hotkey", hotkey_save_array_pause)
obs.obs_data_array_release(hotkey_save_array_pause)
obs.obs_data_set_array(settings, "plus_hotkey", hotkey_save_array_plus)
obs.obs_data_set_array(settings, "minus_hotkey", hotkey_save_array_minus)
obs.obs_data_array_release(hotkey_save_array_reset)
obs.obs_data_array_release(hotkey_save_array_pause)
obs.obs_data_array_release(hotkey_save_array_plus)
obs.obs_data_array_release(hotkey_save_array_minus)
end

function script_load(settings)
local sh = obs.obs_get_signal_handler()
obs.signal_handler_connect(sh, "source_activate", source_activated)
obs.signal_handler_connect(sh, "source_deactivate", source_deactivated)

hotkey_id_reset = obs.obs_hotkey_register_frontend("reset_timer_thingy", "Reset Timer", reset)
hotkey_id_pause = obs.obs_hotkey_register_frontend("pause_timer", "Start/Stop Timer", on_pause)
hotkey_id_reset = obs.obs_hotkey_register_frontend("advanced_timer_reset_timer", "Reset Timer", reset)
hotkey_id_pause = obs.obs_hotkey_register_frontend("advanced_timer_pause_timer", "Start/Stop Timer", on_pause)
hotkey_id_plus = obs.obs_hotkey_register_frontend("advanced_timer_add_time_to_timer", "Add Time to Timer", plus)
hotkey_id_minus = obs.obs_hotkey_register_frontend("advanced_timer_minus_time_to_timer", "Remove Time from Timer", minus)
local hotkey_save_array_reset = obs.obs_data_get_array(settings, "reset_hotkey")
local hotkey_save_array_pause = obs.obs_data_get_array(settings, "pause_hotkey")
local hotkey_save_array_plus = obs.obs_data_get_array(settings, "plus_hotkey")
local hotkey_save_array_minus = obs.obs_data_get_array(settings, "minus_hotkey")
obs.obs_hotkey_load(hotkey_id_reset, hotkey_save_array_reset)
obs.obs_hotkey_load(hotkey_id_pause, hotkey_save_array_pause)
obs.obs_hotkey_load(hotkey_id_plus, hotkey_save_array_plus)
obs.obs_hotkey_load(hotkey_id_minus, hotkey_save_array_minus)
obs.obs_data_array_release(hotkey_save_array_reset)
obs.obs_data_array_release(hotkey_save_array_pause)
obs.obs_data_array_release(hotkey_save_array_plus)
obs.obs_data_array_release(hotkey_save_array_minus)

obs.obs_frontend_add_event_callback(on_event)

Expand Down