1. Install

pip install clutchcall

2. Create a live input + mint a playback URL

import os
from clutchcall.streams import Streams

streams = Streams(base_url="https://app.clutchcall.dev",
                  api_key=os.environ["CLUTCHCALL_API_KEY"],
                  org_id="org_abc")

input_, stream_key = streams.live_inputs.create(name="My First Stream")
print("inputId:", input_.external_input_id, "streamKey:", stream_key)

signed = streams.live_inputs.get(id=input_.external_input_id) \
                            .signed_playback_url(ttl_seconds=3600)
print("playback URL:", signed["url"])

3. Push a broadcast

from clutchcall.streams import BroadcastPublisher

pub = BroadcastPublisher.open(
    input_id=input_.external_input_id,
    stream_key=stream_key,
    codecs={"video": "avc1.42E01F", "audio": "opus"},
)
with open("clip.mp4", "rb") as f:
    while chunk := f.read(64 * 1024):
        pub.write(chunk)
pub.close(reason="finished")

4. Watch the broadcast

from clutchcall.streams import BroadcastViewer

viewer = BroadcastViewer.open(
    signed["url"],
    on_chunk=lambda init, chunk: open("out.mp4", "ab").write(chunk),
    on_close=lambda reason:      print("closed:", reason),
)

Other modalities

Voice

Voice.calls.originate + Voice.audio_bridge.attach

Robotics

Robotics.publish_telemetry + subscribe_command

Games

Games.publish_state + subscribe_inputs

Data

Data.publish + subscribe with MQTT-style filters