-- Saya memodifikasi dari script : SOURCE TOGGLER 0.0.4 by Exeldro -- Script SOURCE TOGGLER hanya memungkinkan untuk mengaktifkan 1 source. -- modifikasi ini menambah kemampuan script ini untuk mengecualikan/selalu menampilkan salah satu source. -- Modified by ANTONI PASARIBU, 8 Januari 2025 -- www.youtube.com/musikgereja -- donate : https://saweria.co/antonipasaribu obs = obslua gs = nil always_show = false exception_sources = {} function script_properties() local props = obs.obs_properties_create() obs.obs_properties_add_editable_list(props, "sources", "Scenes and Groups", obs.OBS_EDITABLE_LIST_TYPE_STRINGS, nil, nil) obs.obs_properties_add_editable_list(props, "exception_sources", "Exception Sources", obs.OBS_EDITABLE_LIST_TYPE_STRINGS, nil, nil) obs.obs_properties_add_bool(props, "always_show", "Always show") return props end function script_description() return "Toggle between sources visible in a scene, with exceptions for selected sources." end function item_visible(calldata) local visible = obs.calldata_bool(calldata, "visible") if not visible and not always_show then return end local item = obs.calldata_sceneitem(calldata, "item") local source = obs.obs_sceneitem_get_source(item) local source_name = obs.obs_source_get_name(source) local scene = obs.obs_sceneitem_get_scene(item) local sceneitems = obs.obs_scene_enum_items(scene) for _, exception in ipairs(exception_sources) do if source_name == exception then obs.obs_sceneitem_set_visible(item, true) obs.sceneitem_list_release(sceneitems) return end end local found = false for _, sceneitem in ipairs(sceneitems) do local itemsource = obs.obs_sceneitem_get_source(sceneitem) local isn = obs.obs_source_get_name(itemsource) local is_exception = false for _, exception in ipairs(exception_sources) do if isn == exception then is_exception = true break end end if not is_exception then if visible and source_name ~= isn then if obs.obs_sceneitem_visible(sceneitem) then obs.obs_sceneitem_set_visible(sceneitem, false) end elseif not visible and source_name ~= isn and obs.obs_sceneitem_visible(sceneitem) then found = true end end end if always_show and not visible and not found then obs.obs_sceneitem_set_visible(item, true) end obs.sceneitem_list_release(sceneitems) end function script_update(settings) always_show = obs.obs_data_get_bool(settings, "always_show") local source_names = obs.obs_data_get_array(settings, "sources") local source_count = obs.obs_data_array_count(source_names) local exception_names = obs.obs_data_get_array(settings, "exception_sources") local exception_count = obs.obs_data_array_count(exception_names) exception_sources = {} for i = 0, exception_count - 1 do local item = obs.obs_data_array_item(exception_names, i) table.insert(exception_sources, obs.obs_data_get_string(item, "value")) obs.obs_data_release(item) end for i = 0, source_count - 1 do local item = obs.obs_data_array_item(source_names, i) local source_name = obs.obs_data_get_string(item, "value") local source = obs.obs_get_source_by_name(source_name) if source ~= nil then local sh = obs.obs_source_get_signal_handler(source) obs.signal_handler_disconnect(sh, "item_visible", item_visible) obs.signal_handler_connect(sh, "item_visible", item_visible) obs.obs_source_release(source) end obs.obs_data_release(item) end obs.obs_data_array_release(source_names) obs.obs_data_array_release(exception_names) end function script_defaults(settings) end function script_save(settings) end function loaded(cd) if gs == nil then return end local source = obs.calldata_source(cd, "source") local sn = obs.obs_source_get_name(source) local source_names = obs.obs_data_get_array(gs, "sources") local count = obs.obs_data_array_count(source_names) for i = 0, count - 1 do local item = obs.obs_data_array_item(source_names, i) local source_name = obs.obs_data_get_string(item, "value") if sn == source_name then local sh = obs.obs_source_get_signal_handler(source) obs.signal_handler_disconnect(sh, "item_visible", item_visible) obs.signal_handler_connect(sh, "item_visible", item_visible) end obs.obs_data_release(item) end obs.obs_data_array_release(source_names) end function script_load(settings) gs = settings always_show = obs.obs_data_get_bool(settings, "always_show") local sh = obs.obs_get_signal_handler() obs.signal_handler_connect(sh, "source_load", loaded) end function script_unload() end