mirror of
https://github.com/Monadical-SAS/reflector.git
synced 2025-12-20 12:19:06 +00:00
* llm instructions * vibe dailyco * vibe dailyco * doc update (vibe) * dont show recording ui on call * stub processor (vibe) * stub processor (vibe) self-review * stub processor (vibe) self-review * chore(main): release 0.14.0 (#670) * Add multitrack pipeline * Mixdown audio tracks * Mixdown with pyav filter graph * Trigger multitrack processing for daily recordings * apply platform from envs in priority: non-dry * Use explicit track keys for processing * Align tracks of a multitrack recording * Generate waveforms for the mixed audio * Emit multriack pipeline events * Fix multitrack pipeline track alignment * dailico docs * Enable multitrack reprocessing * modal temp files uniform names, cleanup. remove llm temporary docs * docs cleanup * dont proceed with raw recordings if any of the downloads fail * dry transcription pipelines * remove is_miltitrack * comments * explicit dailyco room name * docs * remove stub data/method * frontend daily/whereby code self-review (no-mistake) * frontend daily/whereby code self-review (no-mistakes) * frontend daily/whereby code self-review (no-mistakes) * consent cleanup for multitrack (no-mistakes) * llm fun * remove extra comments * fix tests * merge migrations * Store participant names * Get participants by meeting session id * pop back main branch migration * s3 paddington (no-mistakes) * comment * pr comments * pr comments * pr comments * platform / meeting cleanup * Use participant names in summary generation * platform assignment to meeting at controller level * pr comment * room playform properly default none * room playform properly default none * restore migration lost * streaming WIP * extract storage / use common storage / proper env vars for storage * fix mocks tests * remove fall back * streaming for multifile * cenrtal storage abstraction (no-mistakes) * remove dead code / vars * Set participant user id for authenticated users * whereby recording name parsing fix * whereby recording name parsing fix * more file stream * storage dry + tests * remove homemade boto3 streaming and use proper boto * update migration guide * webhook creation script - print uuid --------- Co-authored-by: Igor Loskutov <igor.loskutoff@gmail.com> Co-authored-by: Mathieu Virbel <mat@meltingrocks.com> Co-authored-by: Sergey Mankovsky <sergey@monadical.com>
124 lines
4.0 KiB
Python
124 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import asyncio
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
import httpx
|
|
|
|
from reflector.settings import settings
|
|
|
|
|
|
async def setup_webhook(webhook_url: str):
|
|
"""
|
|
Create or update Daily.co webhook for this environment.
|
|
Uses DAILY_WEBHOOK_UUID to identify existing webhook.
|
|
"""
|
|
if not settings.DAILY_API_KEY:
|
|
print("Error: DAILY_API_KEY not set")
|
|
return 1
|
|
|
|
headers = {
|
|
"Authorization": f"Bearer {settings.DAILY_API_KEY}",
|
|
"Content-Type": "application/json",
|
|
}
|
|
|
|
webhook_data = {
|
|
"url": webhook_url,
|
|
"eventTypes": [
|
|
"participant.joined",
|
|
"participant.left",
|
|
"recording.started",
|
|
"recording.ready-to-download",
|
|
"recording.error",
|
|
],
|
|
"hmac": settings.DAILY_WEBHOOK_SECRET,
|
|
}
|
|
|
|
async with httpx.AsyncClient() as client:
|
|
webhook_uuid = settings.DAILY_WEBHOOK_UUID
|
|
|
|
if webhook_uuid:
|
|
# Update existing webhook
|
|
print(f"Updating existing webhook {webhook_uuid}...")
|
|
try:
|
|
resp = await client.patch(
|
|
f"https://api.daily.co/v1/webhooks/{webhook_uuid}",
|
|
headers=headers,
|
|
json=webhook_data,
|
|
)
|
|
resp.raise_for_status()
|
|
result = resp.json()
|
|
print(f"✓ Updated webhook {result['uuid']} (state: {result['state']})")
|
|
print(f" URL: {result['url']}")
|
|
return 0
|
|
except httpx.HTTPStatusError as e:
|
|
if e.response.status_code == 404:
|
|
print(f"Webhook {webhook_uuid} not found, creating new one...")
|
|
webhook_uuid = None # Fall through to creation
|
|
else:
|
|
print(f"Error updating webhook: {e}")
|
|
return 1
|
|
|
|
if not webhook_uuid:
|
|
# Create new webhook
|
|
print("Creating new webhook...")
|
|
resp = await client.post(
|
|
"https://api.daily.co/v1/webhooks", headers=headers, json=webhook_data
|
|
)
|
|
resp.raise_for_status()
|
|
result = resp.json()
|
|
webhook_uuid = result["uuid"]
|
|
|
|
print(f"✓ Created webhook {webhook_uuid} (state: {result['state']})")
|
|
print(f" URL: {result['url']}")
|
|
print()
|
|
print("=" * 60)
|
|
print("IMPORTANT: Add this to your environment variables:")
|
|
print("=" * 60)
|
|
print(f"DAILY_WEBHOOK_UUID: {webhook_uuid}")
|
|
print("=" * 60)
|
|
print()
|
|
|
|
# Try to write UUID to .env file
|
|
env_file = Path(__file__).parent.parent / ".env"
|
|
if env_file.exists():
|
|
lines = env_file.read_text().splitlines()
|
|
updated = False
|
|
|
|
# Update existing DAILY_WEBHOOK_UUID line or add it
|
|
for i, line in enumerate(lines):
|
|
if line.startswith("DAILY_WEBHOOK_UUID="):
|
|
lines[i] = f"DAILY_WEBHOOK_UUID={webhook_uuid}"
|
|
updated = True
|
|
break
|
|
|
|
if not updated:
|
|
lines.append(f"DAILY_WEBHOOK_UUID={webhook_uuid}")
|
|
|
|
env_file.write_text("\n".join(lines) + "\n")
|
|
print(f"✓ Also saved to local .env file")
|
|
else:
|
|
print(f"⚠ Local .env file not found - please add manually")
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) != 2:
|
|
print("Usage: python recreate_daily_webhook.py <webhook_url>")
|
|
print(
|
|
"Example: python recreate_daily_webhook.py https://example.com/v1/daily/webhook"
|
|
)
|
|
print()
|
|
print("Behavior:")
|
|
print(" - If DAILY_WEBHOOK_UUID set: Updates existing webhook")
|
|
print(
|
|
" - If DAILY_WEBHOOK_UUID empty: Creates new webhook, saves UUID to .env"
|
|
)
|
|
sys.exit(1)
|
|
|
|
sys.exit(asyncio.run(setup_webhook(sys.argv[1])))
|