From 51229a17901c28bc9c487f3b8b788567d659d9cb Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Tue, 2 Sep 2025 17:44:04 -0600 Subject: [PATCH] Fix Jitsi client issues and create typed meeting data - Remove 'transcription': True from JWT features in _generate_jwt - Replace int(time.time()) with generate_uuid4() for room naming to avoid conflicts - Replace datetime.utcnow() with datetime.now(tz=timezone.utc) for proper timezone handling - Create JitsiMeetingData(MeetingData) class with typed extra_data properties - Update PLATFORM_NAME = VideoPlatform.JITSI to use enum - Update create_meeting to return JitsiMeetingData instance with proper typing - Fix get_room_sessions mock to use timezone-aware datetime - Export JitsiMeetingData from jitsi module Addresses PR feedback points 4, 5, 6, 10: remove transcription features, use UUID, proper datetime handling, and typed meeting data --- .../video_platforms/jitsi/__init__.py | 4 +-- .../reflector/video_platforms/jitsi/client.py | 35 ++++++++++++++----- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/server/reflector/video_platforms/jitsi/__init__.py b/server/reflector/video_platforms/jitsi/__init__.py index d8d377f2..4be24725 100644 --- a/server/reflector/video_platforms/jitsi/__init__.py +++ b/server/reflector/video_platforms/jitsi/__init__.py @@ -1,3 +1,3 @@ -from .client import JitsiClient +from .client import JitsiClient, JitsiMeetingData -__all__ = ["JitsiClient"] +__all__ = ["JitsiClient", "JitsiMeetingData"] diff --git a/server/reflector/video_platforms/jitsi/client.py b/server/reflector/video_platforms/jitsi/client.py index 63fee6e6..053303bc 100644 --- a/server/reflector/video_platforms/jitsi/client.py +++ b/server/reflector/video_platforms/jitsi/client.py @@ -1,22 +1,40 @@ import hmac -import time -from datetime import datetime +from datetime import datetime, timezone from hashlib import sha256 from typing import Any, Dict, Optional import jwt -from reflector.db.rooms import Room +from reflector.db.rooms import Room, VideoPlatform from reflector.settings import settings from reflector.utils import generate_uuid4 from ..base import MeetingData, VideoPlatformClient +class JitsiMeetingData(MeetingData): + """Jitsi-specific meeting data with typed extra_data.""" + + @property + def user_jwt(self) -> str: + """JWT token for regular users.""" + return self.extra_data.get("user_jwt", "") + + @property + def host_jwt(self) -> str: + """JWT token for moderators.""" + return self.extra_data.get("host_jwt", "") + + @property + def domain(self) -> str: + """Jitsi domain.""" + return self.extra_data.get("domain", "") + + class JitsiClient(VideoPlatformClient): """Jitsi Meet video platform implementation.""" - PLATFORM_NAME = "jitsi" + PLATFORM_NAME = VideoPlatform.JITSI def _generate_jwt(self, room: str, moderator: bool, exp: datetime) -> str: """Generate JWT token for Jitsi Meet room access.""" @@ -37,7 +55,6 @@ class JitsiClient(VideoPlatformClient): "features": { "recording": True, "livestreaming": False, - "transcription": True, }, }, } @@ -46,10 +63,10 @@ class JitsiClient(VideoPlatformClient): async def create_meeting( self, room_name_prefix: str, end_date: datetime, room: Room - ) -> MeetingData: + ) -> JitsiMeetingData: """Create a Jitsi Meet room with JWT authentication.""" # Generate unique room name - jitsi_room = f"reflector-{room.name}-{int(time.time())}" + jitsi_room = f"reflector-{room.name}-{generate_uuid4()}" # Generate JWT tokens user_jwt = self._generate_jwt(room=jitsi_room, moderator=False, exp=end_date) @@ -59,7 +76,7 @@ class JitsiClient(VideoPlatformClient): room_url = f"https://{settings.JITSI_DOMAIN}/{jitsi_room}?jwt={user_jwt}" host_room_url = f"https://{settings.JITSI_DOMAIN}/{jitsi_room}?jwt={host_jwt}" - return MeetingData( + return JitsiMeetingData( meeting_id=generate_uuid4(), room_name=jitsi_room, room_url=room_url, @@ -79,7 +96,7 @@ class JitsiClient(VideoPlatformClient): "sessions": [ { "sessionId": generate_uuid4(), - "startTime": datetime.utcnow().isoformat(), + "startTime": datetime.now(tz=timezone.utc).isoformat(), "participants": [], "isActive": True, }