assurance-tunnel
assurance-tunnel
assurance-tunnel
assurance-tunnel

OBS: OSC Scene Switcher - My Version



  • Dear All,

    In preparing for today's guru session I wanted to make use of this python script hosted on GitHub to allow me to switch scenes in OBS using OSC. Kudos to Carlo Cattano for creating it.

    However, I discovered two issues:

    1) macOS does not support python scripts :-( The workaround is to run the script in a terminal window.

    2) The script itself does not seem to work as one might expect. The description indicates that the single numeric parameter sent after the /Scenes address should select the scene at that index, i.e., 0 selects the first scene, 1 selects the second, etc. But it doesn't seem to work that way. So I made some improvement and fixes to the script as given below. This code below should be replace the code in the ObSC.py file.

    ObSC.py.zip

    Best Wishes,
    Mark

    import sys,time,argparse,math
    from pythonosc import dispatcher
    from pythonosc import osc_server
    import logging
    logging.basicConfig(level=logging.INFO)
    sys.path.append('../')
    from obswebsocket import obsws, requests  # noqa: E402
    host = "localhost"
    port = 4444
    password = "put_your_password_here"
    ws = obsws(host, port, password)
    ws.connect()
    ScenesNames = []
    SceneSources = []
    def sourceSwitch(source_name,scene,switch):
        ws.call(requests.SetSceneItemProperties(source_name,scene,visible=switch)) 
    def is_integer(v):
        try:
            int(v)
            return True;
        except ValueError:
            return False;
    def scene_switch(unused_addr, args, oscValue):
    

    try:
            if (is_integer(oscValue)):
                print("CMD = '{0}' INDEX = {1} OBS SCENE NAME = '{2}'".format(args[0], oscValue, ScenesNames[int(oscValue)]))
                ws.call(requests.SetCurrentScene(ScenesNames[int(oscValue)]))
                # control sources by using sourceSwitch("source_Name","Scene_name", bool)
                # sourceSwitch("screen1","Scene1",False)
            else:
                print("OSC Value '{0}' cannot be converted to an integer.".format(oscValue))
        except:
            pass
    if name == "main":
        try:
            scenes = ws.call(requests.GetSceneList())
            for s in scenes.getScenes():
                name = s['name']
                print("Adding Scene = '{0}".format(name))
                ScenesNames.append(name)                        # Add every scene to a list of scenes
            print("CURRENT SCENES IN OBS:\n", ScenesNames)
           
            ### OSC SETTINGS
            parser = argparse.ArgumentParser()
            parser.add_argument("--ip", default="127.0.0.1", help="The ip to listen on")
            parser.add_argument("--port", type=int, default=5005, help="The port to listen on")
            args = parser.parse_args()                           # parser for --ip --port arguments
            dispatcher = dispatcher.Dispatcher()
            dispatcher.map("/Scene", scene_switch, "Scene")      # OSC LISTENER
            server = osc_server.ThreadingOSCUDPServer((args.ip, args.port), dispatcher)  
            print("Serving on {}".format(server.server_address))
            
            server.serve_forever()
        except KeyboardInterrupt:
            pass
        ws.disconnect()