Files
research_meet/server/server.py
2025-09-09 11:09:43 +04:00

80 lines
2.5 KiB
Python

import os
import random
import string
import logging
from fastapi import FastAPI, HTTPException, Query
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from dotenv import load_dotenv
from lib import livekit
load_dotenv()
logging.basicConfig(level=logging.INFO)
LIVEKIT_URL = os.getenv("LIVEKIT_URL")
if not LIVEKIT_URL:
raise EnvironmentError("LIVEKIT_URL must be set")
app = FastAPI()
def random_string(length: int) -> str:
return "".join(random.choices(string.ascii_letters + string.digits, k=length))
# API Routes
@app.get("/api/connection-details")
async def connection_details(
roomName: str = Query(..., alias="roomName"),
participantName: str = Query(..., alias="participantName"),
metadata: str = Query(""),
):
try:
random_postfix = random_string(4)
identity = f"{participantName}__{random_postfix}"
token = livekit.create_access_token(identity, participantName, metadata, roomName)
return {
"serverUrl": LIVEKIT_URL,
"roomName": roomName,
"participantToken": token,
"participantName": participantName,
}
except Exception as e:
logging.error(f"Error creating token: {e}")
raise HTTPException(status_code=500, detail=str(e))
@app.get("/rooms/{room_name}", response_class=HTMLResponse)
async def create_room(room_name: str):
try:
await livekit.create_room_if_not_exists(room_name)
# Return HTML that loads the LiveKit component for this room
html_content = f"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>LiveKit Meet - {room_name}</title>
<link rel="stylesheet" href="/bundle.css" />
</head>
<body>
<div id="root"></div>
<script src="/bundle.js"></script>
<script>
// Set the current path so the router knows we're on a room page
window.history.replaceState(null, '', '/rooms/{room_name}');
LiveKitMeet.render(document.getElementById('root'));
</script>
</body>
</html>
"""
return html_content
except Exception as e:
logging.error(f"Error creating room: {e}")
raise HTTPException(status_code=500, detail=str(e))
# Serve the static files from the 'public' directory, with html=True to handle SPA routing
app.mount("/", StaticFiles(directory="../public", html=True), name="static")