96 lines
3.6 KiB
Python
96 lines
3.6 KiB
Python
# detalles_de_sala.py
|
|
import os
|
|
import logging
|
|
import asyncio
|
|
import aiohttp
|
|
from livekit import rtc
|
|
|
|
ROOM = "mi_sala_prueba"
|
|
USER = "agente_tts"
|
|
TOKEN_URL = "http://127.0.0.1:8000/token"
|
|
LIVEKIT_URL = "ws://192.168.1.131:7880"
|
|
|
|
|
|
async def get_token():
|
|
"""Solicita el token JWT al backend FastAPI"""
|
|
print("🔍 Solicitando token al backend FastAPI...")
|
|
try:
|
|
async with aiohttp.ClientSession() as session:
|
|
async with session.get(f"{TOKEN_URL}?room={ROOM}&user={USER}") as resp:
|
|
print(f"📡 Respuesta del backend: {resp.status}")
|
|
if resp.status != 200:
|
|
print(f"❌ Error al obtener token: {await resp.text()}")
|
|
raise Exception(f"Error HTTP {resp.status} al solicitar token")
|
|
data = await resp.json()
|
|
token = data.get("token")
|
|
if not token:
|
|
print("⚠️ Respuesta no contiene campo 'token'")
|
|
raise Exception("Respuesta inválida del backend /token")
|
|
print("✅ Token recibido correctamente")
|
|
print(f"🧾 Token (primeros 60 chars): {token[:60]}...")
|
|
return token
|
|
except Exception as e:
|
|
print(f"🚨 Error en get_token(): {e}")
|
|
raise
|
|
|
|
|
|
async def main():
|
|
print("🚀 Iniciando script LiveKit Client")
|
|
print(f"🌍 Servidor LiveKit: {LIVEKIT_URL}")
|
|
print(f"🔑 URL de Token: {TOKEN_URL}")
|
|
print(f"🏠 Sala: {ROOM}, 👤 Usuario: {USER}")
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger(__name__)
|
|
room = rtc.Room()
|
|
|
|
print("⚙️ Configurando eventos del Room...")
|
|
|
|
@room.on("participant_connected")
|
|
def on_participant_connected(participant: rtc.RemoteParticipant):
|
|
print(f"🟢 Participante conectado: {participant.identity} ({participant.sid})")
|
|
logger.info("🟢 Participant connected: %s (%s)", participant.identity, participant.sid)
|
|
|
|
@room.on("participant_disconnected")
|
|
def on_participant_disconnected(participant: rtc.RemoteParticipant):
|
|
print(f"🔴 Participante desconectado: {participant.identity} ({participant.sid})")
|
|
logger.info("🔴 Participant disconnected: %s (%s)", participant.identity, participant.sid)
|
|
|
|
@room.on("track_subscribed")
|
|
def on_track_subscribed(track: rtc.Track, publication: rtc.RemoteTrackPublication, participant: rtc.RemoteParticipant):
|
|
print(f"🎥 Track suscrito de {participant.identity}: {publication.sid} ({track.kind})")
|
|
logger.info("🎥 Track subscribed from %s: %s", participant.identity, publication.sid)
|
|
|
|
@room.on("disconnected")
|
|
def on_disconnected():
|
|
print("⚠️ Desconectado del servidor LiveKit.")
|
|
logger.warning("⚠️ Room disconnected.")
|
|
|
|
# 🔑 Obtener token
|
|
token = await get_token()
|
|
|
|
print("🧩 Intentando conectar al servidor LiveKit...")
|
|
try:
|
|
await room.connect(LIVEKIT_URL, token)
|
|
print(f"✅ Conectado exitosamente a la sala: {room.name}")
|
|
except Exception as e:
|
|
print(f"🚨 Error al conectar a LiveKit: {e}")
|
|
raise
|
|
|
|
print("🕓 Conexión activa. Esperando eventos...")
|
|
try:
|
|
while True:
|
|
await asyncio.sleep(2)
|
|
print("⏳ Manteniendo conexión viva...")
|
|
except KeyboardInterrupt:
|
|
print("🛑 Interrupción manual detectada. Cerrando sesión...")
|
|
await room.disconnect()
|
|
print("👋 Desconectado correctamente.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
asyncio.run(main())
|
|
except Exception as e:
|
|
print(f"💥 Error fatal: {e}")
|