OBS Browser Source Manager
This guide demonstrates how to programmatically control which website is displayed in an OBS Browser Source. This is useful for dynamic overlays, rotating dashboards, or remote-controlled displays.
Modules Used:
obsws-python: To communicate with OBS via WebSocket.- argparse: To handle command-line arguments.
time: For delays (if cycling URLs).
Prerequisites
- OBS Studio installed.
- WebSocket Server enabled in OBS (Tools -> WebSocket Server Settings).
- A Browser Source created in your current scene (e.g., named "Browser").
Installation
pip install obsws-python
The Code
Save this as obs_browser.py.
import obsws_python as obs
import argparse
import time
import sys
# Default Config (Can be overridden by CLI args)
HOST = 'localhost'
PORT = 4455
PASSWORD = 'your_password_here'
def get_client(password):
try:
return obs.ReqClient(host=HOST, port=PORT, password=password)
except Exception as e:
print(f"Connection Error: {e}")
sys.exit(1)
def set_source_url(client, source_name, url):
try:
# 'url' is the standard setting key for Browser Sources
# overlay=True merges with existing settings rather than replacing all
client.set_input_settings(name=source_name, settings={'url': url}, overlay=True)
print(f"Updated '{source_name}' to: {url}")
except Exception as e:
print(f"Failed to update source: {e}")
def cycle_urls(client, source_name, urls, interval):
print(f"Cycling {len(urls)} URLs every {interval} seconds. Press Ctrl+C to stop.")
try:
while True:
for url in urls:
set_source_url(client, source_name, url)
time.sleep(interval)
except KeyboardInterrupt:
print("\nStopped.")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="OBS Browser Source Manager")
parser.add_argument("source", help="Name of the Browser Source in OBS")
parser.add_argument("urls", nargs='+', help="URL(s) to display")
parser.add_argument("--password", default=PASSWORD, help="OBS WebSocket Password")
parser.add_argument("--cycle", type=int, help="Cycle through URLs with this interval (seconds)")
args = parser.parse_args()
client = get_client(args.password)
if args.cycle:
if len(args.urls) < 2:
print("Error: Provide at least two URLs to cycle.")
else:
cycle_urls(client, args.source, args.urls, args.cycle)
else:
# Just set the first URL
set_source_url(client, args.source, args.urls[0])
Usage
# Set a single URL
python obs_browser.py "Browser" https://google.com
# Cycle through multiple dashboards every 10 seconds
python obs_browser.py "Browser" https://dashboard1.com https://dashboard2.com --cycle 10