def script_properties(): # ui props = S.obs_properties_create() p = S.obs_properties_add_list( props, "source", "Text Source", S.OBS_COMBO_TYPE_EDITABLE, S.OBS_COMBO_FORMAT_STRING, ) sources = S.obs_enum_sources() if sources is not None: for source in sources: source_id = S.obs_source_get_unversioned_id(source) name = S.obs_source_get_name(source) S.obs_property_list_add_string(p, name, name) S.source_list_release(sources) _p = S.obs_properties_add_list( props, "scene", "Scene", S.OBS_COMBO_TYPE_EDITABLE, S.OBS_COMBO_FORMAT_STRING, ) scenes = S.obs_frontend_get_scenes() for scene in scenes: name = S.obs_source_get_name(scene) S.obs_property_list_add_string(_p, name, name) S.source_list_release(scenes) S.obs_properties_add_button(props, "button", "Duplicate", button_pressed) return props
def transition(scene): print("Transition: " + scene) scenes = obs.obs_frontend_get_scenes() for s in scenes: if obs.obs_source_get_name(s) == scene: obs.obs_frontend_set_current_scene(s) obs.obs_source_release(s)
def dup(self): current_scene = S.obs_scene_from_source( S.obs_frontend_get_current_scene()) scene_item = S.obs_scene_find_source(current_scene, self.source_name) info = S.obs_transform_info() crop = S.obs_sceneitem_crop() S.obs_sceneitem_get_info(scene_item, info) S.obs_sceneitem_get_crop(scene_item, crop) duplicate = S.obs_sceneitem_get_source(scene_item) duplicated = S.obs_source_duplicate(duplicate, "duplicate" + self.source_name, False) scenes = S.obs_frontend_get_scenes() for scene in scenes: name = S.obs_source_get_name(scene) if name == self.scene_name: scene = S.obs_scene_from_source(scene) scene_item2 = S.obs_scene_add(scene, duplicated) S.obs_sceneitem_set_info(scene_item2, info) S.obs_sceneitem_set_crop(scene_item2, crop) S.obs_scene_release(scene) S.obs_source_release(duplicated) S.source_list_release(scenes) S.obs_scene_release(current_scene)
def set_current_scene(self): scenes = obs.obs_frontend_get_scenes() for scene in scenes: name = obs.obs_source_get_name(scene) if name == self.scene_name: obs.obs_frontend_set_current_scene(scene) obs.source_list_release(scenes)
def scene_handler(address, *args): print(f"{address}: {args}") control, id_type, i_str = address.split("/")[3:6] if control == "button": i = int(i_str) - 1 scn = obspython.obs_frontend_get_scenes()[i] obspython.obs_frontend_set_current_scene(scn)
def set_scene_by_name(scene_name): scenes = obs.obs_frontend_get_scenes() scene = find_source_by_name_in_list(scenes, scene_name) if scene is not None: obs.obs_frontend_set_current_scene(scene) obs.source_list_release(scenes)
def check_for_scene(name): check = False scenes = obs.obs_frontend_get_scenes() if scenes is not None: for scene in scenes: if obs.obs_source_get_name(scene) == name: check = True obs.source_list_release(scenes) return check
def nextScene(): scenes = obs.obs_frontend_get_scenes() if len(scenes) > 1: c_scene = obs.obs_frontend_get_current_preview_scene() if c_scene != None: i = scenes.index(c_scene) + 1 if i < len(scenes): return scenes[i] return scenes[0]
def switch_scenes(): if is_active and should_switch_scenes(): sources = obs.obs_enum_sources() scenes = obs.obs_frontend_get_scenes(sources) obs.source_list_release(sources) current = obs.obs_frontend_get_current_scene() for s in scenes: if s != current and obs.obs_source_get_name(s) in scene_names: obs.obs_frontend_set_current_scene(s) obs.obs_source_release(current)
def change_to_scene(scene_name): scenes = obs.obs_frontend_get_scenes() for scene in scenes: print(obs.obs_source_get_name(scene)) if obs.obs_source_get_name(scene) == scene_name: current_scene = obs.obs_frontend_get_current_scene() scenes.remove(current_scene) obs.obs_frontend_set_current_scene(scene)
def set_logo(blue_config, orange_config): #reused for logo later default_logo = os.path.join(files_path, 'logo.png') blue_config_bun = get_bot_config_bundle(blue_config) orange_config_bun = get_bot_config_bundle(orange_config) blue_logo = blue_config_bun.get_logo_file() if blue_logo is None: blue_logo = default_logo orange_logo = orange_config_bun.get_logo_file() if orange_logo is None: orange_logo = default_logo default_logo_scale = 0.25 default_logo_size = [400*default_logo_scale, 300*default_logo_scale] blue_logo_size = list(Image.open(blue_logo).size) blue_scale = default_logo_size[0]/blue_logo_size[0] orange_logo_size = list(Image.open(orange_logo).size) orange_scale = default_logo_size[0]/orange_logo_size[0] scenes = obs.obs_frontend_get_scenes() if scenes is not None: for scene in scenes: if obs.obs_source_get_name(scene) == 'RLBot - AutoLeague': scene = obs.obs_scene_from_source(scene) items = obs.obs_scene_enum_items(scene) for item in items: if item is not None: source_t = obs.obs_sceneitem_get_source(item) if obs.obs_source_get_name(source_t) == "Logo-0": source = source_t settings = obs.obs_data_create() obs.obs_data_set_string(settings, "file", blue_logo) obs.obs_source_update(source, settings) obs.obs_data_release(settings) vec = obs.vec2() obs.vec2_set(vec, blue_scale, blue_scale) obs.obs_sceneitem_set_scale(item, vec) if obs.obs_source_get_name(source_t) == "Logo-1": source = source_t settings = obs.obs_data_create() obs.obs_data_set_string(settings, "file", orange_logo) obs.obs_source_update(source, settings) obs.obs_data_release(settings) vec = obs.vec2() obs.vec2_set(vec, orange_scale, orange_scale) obs.obs_sceneitem_set_scale(item, vec) obs.source_list_release(scenes) obs.sceneitem_list_release(items)
def transition(self, num, value): trans = obs.obs_frontend_get_current_transition() scenes = obs.obs_frontend_get_scenes() if num > len(scenes): print(f"Invalid scene number: {num}") return print(f"start transition to scene #{num}") duration = int(self.duration * (value / 100)) obs.obs_transition_start(trans, obs.OBS_TRANSITION_MODE_AUTO, duration, scenes[num])
def script_load(settings): global settngs settngs = settings print('toggle script loaded') scenes = obs.obs_frontend_get_scenes() if len(scenes) > 0: global loaded loaded = True _register_hot_keys(settings) obs.source_list_release(scenes) obs.obs_frontend_add_event_callback(on_event)
def on_visibility_toggle(calldata): scenes_as_sources = obs.obs_frontend_get_scenes() sceneitem = obs.calldata_sceneitem(calldata, "item") visibility = obs.calldata_bool(calldata, "visible") name = obs.obs_source_get_name(obs.obs_sceneitem_get_source(sceneitem)) for scene_as_source in scenes_as_sources: scene = obs.obs_scene_from_source(scene_as_source) match = obs.obs_scene_find_source(scene, name) if match: obs.obs_sceneitem_set_visible(match, visibility) obs.source_list_release(scenes_as_sources)
def set_visible_all(self, visible): """Cycle through all scenes, manually toggling visibility of the source Idea from GitHub user LukyLurks """ scenes = obs.obs_frontend_get_scenes() for scene in scenes: scene_test = obs.obs_scene_from_source(scene) in_scene = obs.obs_scene_find_source(scene_test, self.source_name) if in_scene: obs.obs_sceneitem_set_visible(in_scene, visible) obs.source_list_release(scenes)
def _register_hot_keys(settings): global scenes scenes = obs.obs_frontend_get_scenes() for i in range(len(scenes)): scene = scenes[i] scene_id = obs.obs_source_get_name(scene) callback = _handle_key(scene, scene_id) name = 'toggle.' + scene_id hot_key_id = obs.obs_hotkey_register_frontend(name, "Toggle '" + scene_id + "'", callback) save_array = obs.obs_data_get_array(settings, name) obs.obs_hotkey_load(hot_key_id, save_array) obs.obs_data_array_release(save_array) hot_keys.append({'callback': callback, 'scene_id': hot_key_id, 'name': name})
def testInput(cmdType, channel, value): global midiParams scenes = obs.obs_frontend_get_scenes() transitions = obs.obs_frontend_get_transitions() if midiParams[0] == cmdType and midiParams[1] == channel: transition() if midiParams[2] == cmdType and channel >= midiParams[ 3] and channel < midiParams[3] + len(scenes): setPreview(channel - midiParams[3]) if midiParams[4] == cmdType and channel >= midiParams[ 5] and channel < midiParams[5] + len(transitions): setTransition(channel - midiParams[5]) if midiParams[6]: print(cmdType + "\t" + str(channel) + "\t" + str(value))
def script_update(settings): global is_active, visibility_handler is_active = obs.obs_data_get_bool(settings, "is_active") if is_active: scenes = obs.obs_frontend_get_scenes() for scene in scenes: visibility_handler = obs.obs_source_get_signal_handler(scene) obs.signal_handler_connect(visibility_handler, "item_visible", on_visibility_toggle) obs.source_list_release(scenes) else: obs.signal_handler_disconnect(visibility_handler, "item_visible", on_visibility_toggle) visibility_handler = None obs.remove_current_callback()
def change_to_scene(bot, message, args): time_to_wait = time.time() - last_scene_change["t"] last_scene_change["t"] = time.time() if time_to_wait < DELAY: message['ttw'] = "{:.1f}".format(time_to_wait) return "CommandToSoon" scene_name = args['scene'] scenes = obs.obs_frontend_get_scenes() for scene in scenes: print(obs.obs_source_get_name(scene)) if obs.obs_source_get_name(scene) == scene_name: current_scene = obs.obs_frontend_get_current_scene() scenes.remove(current_scene) obs.obs_frontend_set_current_scene(scene) return 'Success'
def get_scene_item(name): scenes = obs.obs_frontend_get_scenes() if scenes is not None: for scene in scenes: if obs.obs_source_get_name(scene) == 'RLBot - AutoLeague': scene = obs.obs_scene_from_source(scene) items = obs.obs_scene_enum_items(scene) for item in items: if item is not None: scene_source = obs.obs_sceneitem_get_source(item) if obs.obs_source_get_name(scene_source) == name: sceneItem = obs.obs_scene_find_sceneitem_by_id(scene, obs.obs_sceneitem_get_id(item)) obs.source_list_release(scenes) obs.obs_sceneitem_addref(sceneItem) obs.sceneitem_list_release(items) return sceneItem obs.sceneitem_list_release(items) obs.source_list_release(scenes)
def script_properties(): # ui props = obs.obs_properties_create() p = obs.obs_properties_add_list( props, "scene", "Scene", obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING, ) scenes = obs.obs_frontend_get_scenes() for scene in scenes: name = obs.obs_source_get_name(scene) obs.obs_property_list_add_string(p, name, name) obs.source_list_release(scenes) obs.obs_properties_add_button(props, "button", "Set current scene", set_pressed) return props
def set_names(source_name, string): scenes = obs.obs_frontend_get_scenes() if scenes is not None: for scene in scenes: if obs.obs_source_get_name(scene) == 'RLBot - AutoLeague': scene = obs.obs_scene_from_source(scene) items = obs.obs_scene_enum_items(scene) for item in items: if item is not None: source_t = obs.obs_sceneitem_get_source(item) if obs.obs_source_get_name(source_t) == source_name: source = source_t settings = obs.obs_data_create() obs.obs_data_set_string(settings, "text", str(string)) obs.obs_source_update(source, settings) obs.obs_data_release(settings) obs.source_list_release(scenes) obs.sceneitem_list_release(items)
def script_properties(): props = obs.obs_properties_create() s = obs.obs_properties_add_list(props, "scene", "Scene", obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING) p = obs.obs_properties_add_list(props, "source", "Text Source", obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING) obs.obs_properties_add_bool(props, "reset_time", "Reset time on scene switch") obs.obs_properties_add_int(props, "stop_stream_time", "Stop stream/record after (seconds):", 10, 7200, 1) obs.obs_properties_add_bool(props, "stop_stream", "Enabled") sources = obs.obs_enum_sources() if sources is not None: for source in sources: name = obs.obs_source_get_name(source) source_id = obs.obs_source_get_unversioned_id(source) if source_id == "text_gdiplus" or source_id == "text_ft2_source": name = obs.obs_source_get_name(source) obs.obs_property_list_add_string(p, name, name) obs.source_list_release(sources) scenes = obs.obs_frontend_get_scenes() if scenes is not None: for scene in scenes: name = obs.obs_source_get_name(scene) obs.obs_property_list_add_string(s, name, name) obs.source_list_release(scenes) obs.obs_properties_add_button(props, "reset_button", "Reset Stopwatch", reset_stopwatch_pressed) obs.obs_properties_add_button(props, "button", "Refresh", refresh_pressed) return props
def update(): global url try: with urllib.request.urlopen(url) as response: data = response.read() response = json.loads(data) _scenes = zip(obs.obs_frontend_get_scene_names(), obs.obs_frontend_get_scenes()) scenes = {} for scene in _scenes: scenes[scene[0]] = scene[1] if scenes.get(response['camera']) is not None: print("Switching to scene: " + response['camera']) obs.obs_frontend_set_current_scene(scenes[response['camera']]) except urllib.error.URLError as err: obs.script_log(obs.LOG_WARNING, "Error opening URL '" + url + "': " + err.reason) obs.remove_current_callback()
def hidesource(): #obs.script_log(obs.LOG_DEBUG,"Trying to hide source "+sourcename) frontendscenes = obs.obs_frontend_get_scenes() #obs.script_log(obs.LOG_DEBUG,str(frontendscenes)) for scenesource in frontendscenes: #obs.script_log(obs.LOG_DEBUG,str(scenesource)) #scenesource = obs.obs_frontend_get_current_scene() scene = obs.obs_scene_from_source(scenesource) #obs.script_log(obs.LOG_DEBUG,"Scene "+str(scene)) sceneitem = obs.obs_scene_find_source(scene, sourcename) if sceneitem: #obs.script_log(obs.LOG_DEBUG,"Scene item "+str(sceneitem)) obs.obs_sceneitem_set_visible(sceneitem, False) #obs.obs_source_release(scenesource) obs.source_list_release(frontendscenes)
def on_event(event): if event == obs.OBS_FRONTEND_EVENT_SCENE_CHANGED: if get_current_scene_name() == closing_scene: if manage_recording and obs.obs_frontend_recording_active(): if stop_recording_delay == 0: stop_recording() else: obs.timer_add(stop_recording, stop_recording_delay * 1000) if manage_streaming and obs.obs_frontend_streaming_active(): if stop_streaming_delay == 0: stop_streaming() else: obs.timer_add(stop_streaming, stop_streaming_delay * 1000) else: if manage_recording and obs.obs_frontend_recording_active(): obs.timer_remove(stop_recording) if manage_streaming and obs.obs_frontend_streaming_active(): obs.timer_remove(stop_streaming) elif not (obs.obs_frontend_streaming_active() or obs.obs_frontend_recording_active()) and ( event == obs.OBS_FRONTEND_EVENT_STREAMING_STARTING or event == obs.OBS_FRONTEND_EVENT_RECORDING_STARTING ) and get_current_scene_name() != start_scene: scenes = obs.obs_frontend_get_scenes() if scenes != None: for scene_source in scenes: print(str(obs.obs_source_get_type(scene_source))) scene_name = obs.obs_source_get_name(scene_source) if scene_name == start_scene: print(scene_name) obs.obs_frontend_set_current_scene(scene_source) break obs.source_list_release(scenes) elif (event == obs.OBS_FRONTEND_EVENT_STREAMING_STOPPING and not obs.obs_frontend_recording_active()) or ( event == obs.OBS_FRONTEND_EVENT_RECORDING_STOPPING and not obs.obs_frontend_streaming_active()): obs.obs_frontend_remove_event_callback(on_event)
def set_preview(idx): scenes = obs.obs_frontend_get_scenes() if idx < len(scenes) and idx >= 0: obs.obs_frontend_set_current_preview_scene(scenes[idx])
def set_scene(scene_name): scenes = obs.obs_frontend_get_scenes() for scene in scenes: name = obs.obs_source_get_name(scene) if name == scene_name: obs.obs_frontend_set_current_scene(scene)
def script_properties(): props = obs.obs_properties_create() obs.obs_properties_add_text( props, "scripted_text", "Scripted text", obs.OBS_TEXT_MULTILINE ) bool = obs.obs_properties_add_bool(props, "use_file", "Use file(UTF-8)") bool2 = obs.obs_properties_add_bool(props, "reload_file", "Auto reload file") fp = obs.obs_properties_add_path( props, "file_path", "Select file", obs.OBS_PATH_FILE, "*.*", std.path ) obs.obs_property_set_visible(fp, std.use_file) obs.obs_property_set_visible(bool2, std.use_file) obs.obs_property_set_modified_callback(bool, check_file_use) obs.obs_property_set_modified_callback(bool2, check_file_use) obs.obs_properties_add_int( props, "refresh_rate", "Refresh rate(ms)", 15, 5 * 1000, 1 ) obs.obs_properties_add_int(props, "duration", "Duration shown(s)", 1, 3600, 1) p = obs.obs_properties_add_list( props, "source", "<h2>Text Source</h2>", obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING, ) sp = obs.obs_properties_add_list( props, "playsound", "Media Source", obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING, ) tp = obs.obs_properties_add_list( props, "text_effect", "Text effect", obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING, ) lp = obs.obs_properties_add_list( props, "layer", "Layer(img,video,gif,etc..)", obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING, ) obs.obs_property_set_long_description( tp, "<h1>Description of current text effect</h1>" ) for i in std.txt_efcts.keys(): obs.obs_property_list_add_string(tp, i, i) obs.obs_property_set_modified_callback(tp, show_tooltip) sources = obs.obs_enum_sources() if sources is not None: for source in sources: # exclude Desktop Audio and Mic/Aux by their capabilities capability_flags = obs.obs_source_get_output_flags(source) if ( capability_flags & obs.OBS_SOURCE_DO_NOT_SELF_MONITOR ) == 0 and capability_flags != ( obs.OBS_SOURCE_AUDIO | obs.OBS_SOURCE_DO_NOT_DUPLICATE ): source_id = obs.obs_source_get_unversioned_id(source) if source_id == "text_gdiplus" or source_id == "text_ft2_source": name = obs.obs_source_get_name(source) obs.obs_property_list_add_string(p, name, name) if source_id == "ffmpeg_source": name = obs.obs_source_get_name(source) obs.obs_property_list_add_string(sp, name, name) else: name = obs.obs_source_get_name(source) obs.obs_property_list_add_string(lp, name, name) obs.source_list_release(sources) scenes = obs.obs_frontend_get_scenes() # for layered scene source for scene in scenes: name = obs.obs_source_get_name(scene) obs.obs_property_list_add_string(lp, name, name) obs.source_list_release(scenes) obs.obs_properties_add_button( props, "button1", "PREVIEW", lambda *props: std.hotkey_hook() ) obs.obs_properties_add_button( props, "button2", "RESET", lambda *props: std.reset_duration() ) return props
def refresh_scenes(): for i, scene_source in enumerate(obspython.obs_frontend_get_scenes()): scene_name = obspython.obs_source_get_name(scene_source) client.send_message(f"/obs/scene/label/num/{i+1}", scene_name)