diff --git a/server/reflector/dailyco_api/requests.py b/server/reflector/dailyco_api/requests.py index 54b25697..0adf892b 100644 --- a/server/reflector/dailyco_api/requests.py +++ b/server/reflector/dailyco_api/requests.py @@ -91,6 +91,10 @@ class MeetingTokenProperties(BaseModel): start_cloud_recording: bool = Field( default=False, description="Automatically start cloud recording on join" ) + start_cloud_recording_opts: dict | None = Field( + default=None, + description="Options for startRecording when start_cloud_recording is true (e.g., maxDuration)", + ) enable_recording_ui: bool = Field( default=True, description="Show recording controls in UI" ) diff --git a/server/reflector/video_platforms/daily.py b/server/reflector/video_platforms/daily.py index 7695b745..671e5eb2 100644 --- a/server/reflector/video_platforms/daily.py +++ b/server/reflector/video_platforms/daily.py @@ -181,11 +181,17 @@ class DailyClient(VideoPlatformClient): enable_recording_ui: bool, user_id: NonEmptyString | None = None, is_owner: bool = False, + max_recording_duration_seconds: int | None = None, ) -> NonEmptyString: + start_cloud_recording_opts = None + if start_cloud_recording and max_recording_duration_seconds: + start_cloud_recording_opts = {"maxDuration": max_recording_duration_seconds} + properties = MeetingTokenProperties( room_name=room_name, user_id=user_id, start_cloud_recording=start_cloud_recording, + start_cloud_recording_opts=start_cloud_recording_opts, enable_recording_ui=enable_recording_ui, is_owner=is_owner, ) diff --git a/server/reflector/views/rooms.py b/server/reflector/views/rooms.py index 5b218cb4..93f487c9 100644 --- a/server/reflector/views/rooms.py +++ b/server/reflector/views/rooms.py @@ -567,12 +567,17 @@ async def rooms_join_meeting( if meeting.platform == "daily" and user_id is not None: client = create_platform_client(meeting.platform) + end_date = meeting.end_date + if end_date.tzinfo is None: + end_date = end_date.replace(tzinfo=timezone.utc) + remaining_seconds = int((end_date - current_time).total_seconds()) token = await client.create_meeting_token( meeting.room_name, start_cloud_recording=meeting.recording_type == "cloud", enable_recording_ui=meeting.recording_type == "local", user_id=user_id, is_owner=user_id == room.user_id, + max_recording_duration_seconds=remaining_seconds, ) meeting = meeting.model_copy() meeting.room_url = add_query_param(meeting.room_url, "t", token)