Highlight reel from raw footage
Upload a folder of raw clips and let Tellers pick the best moments and assemble them into a polished highlight reel — no manual editing required.
With the CLI
The fastest path: two commands.
# 1. Upload your raw footage folder
tellers upload ./raw-footage --in-app-path interviews
# 2. Ask Tellers to compile the best moments
tellers "From the footage in interviews/, create a 90-second highlight reel. \
Pick the most energetic and visually interesting moments. \
Generate a music track and sync the cuts to the beats." With the API
For programmatic pipelines — upload all clips, collect the asset IDs, then send a single generation prompt referencing them.
import os, uuid, time, json, urllib.parse
import requests, sseclient
API_KEY = "sk_..."
BASE = "https://api.tellers.ai"
headers = {"x-api-key": API_KEY}
# 1. Upload each clip
clips_dir = "./raw-footage"
asset_ids = []
for filename in os.listdir(clips_dir):
if not filename.endswith((".mp4", ".mov")):
continue
filepath = os.path.join(clips_dir, filename)
file_size = os.path.getsize(filepath)
resp = requests.post(f"{BASE}/users/assets/upload_urls", headers=headers, json=[{
"upload_id": str(uuid.uuid4()),
"content_length": file_size,
"file_type": "video",
"source_file": {
"sourceName": "local", "sourceUrl": None, "sourceIconUrl": None,
"authors": [], "creationDatetime": None,
"additionDatetime": int(time.time()),
"inAppPath": ["raw-footage"], "title": filename,
"description": None, "keywords": [],
},
}])
resp.raise_for_status()
upload = resp.json()[0]
asset_ids.append(upload["asset_id"])
with open(filepath, "rb") as f:
requests.put(upload["presigned_put_url"], data=f).raise_for_status()
print(f"Uploaded {filename} → {upload['asset_id']}")
# 2. Generate the highlight reel
ids_list = ", ".join(asset_ids)
prompt = (
f"Using asset IDs [{ids_list}]: create a 90-second highlight reel. "
"Pick the most energetic and visually interesting moments. "
"Generate a music track and sync the cuts to the beats."
)
url = f"{BASE}/create?prompt={urllib.parse.quote(prompt)}"
response = requests.get(url, headers=headers, stream=True)
response.raise_for_status()
for event in sseclient.SSEClient(response).events():
if event.event == "tellers.json_result":
data = json.loads(event.data)
print(data)
if data.get("status") == "done":
break
Install dependencies: pip install requests sseclient-py.
See Upload a file for more detail on the upload step.