-- DateHeure_local.lua -- Met à jour une source texte EXISTANTE. -- Ne crée aucune source, ne l'ajoute à aucune scène. -- Ne spam pas le Journal des scripts (log uniquement via bouton "Tester"). obs = obslua local source_name = "Date et heure" local format_input = "jj/mm/aaaa hh:mm:ss" -- ex: "jj/mm hh:mm" ou "%d/%m %H:%M" local interval_ms = 1000 local use_utc = false local last_text = "" local function normalize_format(fmt) if fmt == nil or fmt == "" then return "%d/%m/%Y %H:%M:%S" end -- Si l'utilisateur a mis des % => format Lua os.date(), on garde tel quel if string.find(fmt, "%%") then return fmt end -- Séparer date et heure par un espace (mm=mois côté date, mm=minutes côté heure) local date_part, time_part = fmt:match("^(.-)%s+(.-)$") if not date_part then date_part = fmt time_part = nil end -- DATE (ordre important) date_part = date_part :gsub("AAAA", "%%Y"):gsub("aaaa", "%%Y") :gsub("AA", "%%y"):gsub("aa", "%%y") :gsub("JJ", "%%d"):gsub("jj", "%%d") :gsub("MM", "%%m"):gsub("mm", "%%m") -- HEURE if time_part and time_part ~= "" then time_part = time_part :gsub("HH", "%%H"):gsub("hh", "%%H") :gsub("MM", "%%M"):gsub("mm", "%%M") :gsub("SS", "%%S"):gsub("ss", "%%S") return date_part .. " " .. time_part end return date_part end local function current_text() local fmt = normalize_format(format_input) local prefix = use_utc and "!" or "" return os.date(prefix .. fmt) end local function update_clock() local src = obs.obs_get_source_by_name(source_name) if src == nil then -- Silence radio: pas de log automatique => pas de fenêtre qui s'ouvre. return end local text = current_text() if text == last_text then obs.obs_source_release(src) return end last_text = text local settings = obs.obs_data_create() obs.obs_data_set_string(settings, "text", text) obs.obs_source_update(src, settings) obs.obs_data_release(settings) obs.obs_source_release(src) end local function restart_timer() obs.timer_remove(update_clock) if interval_ms ~= nil and interval_ms >= 100 then obs.timer_add(update_clock, interval_ms) end end -- Bouton "Tester" (log uniquement quand tu cliques) function on_test_clicked(props, prop) local src = obs.obs_get_source_by_name(source_name) if src == nil then obs.script_log(obs.LOG_WARNING, "[DateHeure] Source introuvable: '" .. source_name .. "'. Crée/renomme une source Texte avec ce nom.") return false end local preview = current_text() obs.script_log(obs.LOG_INFO, "[DateHeure] OK: source '" .. source_name .. "' trouvée. Exemple rendu: " .. preview) obs.obs_source_release(src) return false end function script_description() return "Met à jour une source texte existante avec la date/heure du PC.\n" .. "Aucun log automatique (évite l'ouverture intempestive du Journal des scripts).\n" .. "Formats: 'jj/mm/aaaa hh:mm:ss', 'jj/mm hh:mm' ou format Lua '%d/%m %H:%M'." end function script_defaults(settings) obs.obs_data_set_default_string(settings, "source_name", "Date et heure") obs.obs_data_set_default_string(settings, "format_input", "jj/mm/aaaa hh:mm:ss") obs.obs_data_set_default_int(settings, "interval_ms", 1000) obs.obs_data_set_default_bool(settings, "use_utc", false) end function script_properties() local props = obs.obs_properties_create() obs.obs_properties_add_text(props, "source_name", "Nom de la source texte", obs.OBS_TEXT_DEFAULT) obs.obs_properties_add_text(props, "format_input", "Format (ex: jj/mm hh:mm)", obs.OBS_TEXT_DEFAULT) obs.obs_properties_add_int(props, "interval_ms", "Intervalle de mise à jour (ms)", 100, 60000, 50) obs.obs_properties_add_bool(props, "use_utc", "Utiliser UTC (sinon heure locale)") -- Log sur demande uniquement obs.obs_properties_add_button(props, "test_btn", "Tester (écrit dans le journal)", on_test_clicked) return props end function script_update(settings) source_name = obs.obs_data_get_string(settings, "source_name") format_input = obs.obs_data_get_string(settings, "format_input") interval_ms = obs.obs_data_get_int(settings, "interval_ms") use_utc = obs.obs_data_get_bool(settings, "use_utc") last_text = "" restart_timer() update_clock() end function script_load(settings) restart_timer() update_clock() end function script_unload() obs.timer_remove(update_clock) end