File size: 2,603 Bytes
9cdcce8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fb59416
9cdcce8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7b406f4
 
fb59416
 
 
 
9cdcce8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fb59416
9cdcce8
 
 
 
 
 
 
 
3839eee
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from __future__ import annotations

from datetime import datetime, timezone
from enum import Enum
from typing import Any

from pydantic import BaseModel, Field


def utc_now_iso() -> str:
    return datetime.now(timezone.utc).replace(microsecond=0).isoformat()


class MeetingType(str, Enum):
    remote = "remote"
    in_person = "in_person"
    hybrid = "hybrid"


class RecordingMode(str, Enum):
    personal_mic = "personal_mic"
    room_recorder = "room_recorder"


class SegmentStatus(str, Enum):
    uploaded = "uploaded"
    transcribed = "transcribed"
    corrected = "corrected"
    failed = "failed"


class MeetingCreate(BaseModel):
    title: str = ""
    meeting_type: MeetingType = MeetingType.in_person
    context: str = ""
    known_terms: str = ""


class SegmentCreate(BaseModel):
    participant_name: str = ""
    recording_mode: RecordingMode = RecordingMode.personal_mic
    room_label: str = ""
    covered_participants: str = ""


class Segment(BaseModel):
    segment_id: str
    meeting_id: str
    label: str
    participant_name: str = ""
    recording_mode: RecordingMode = RecordingMode.personal_mic
    room_label: str = ""
    covered_participants: list[str] = Field(default_factory=list)
    created_at: str = Field(default_factory=utc_now_iso)
    status: SegmentStatus = SegmentStatus.uploaded
    audio_file_name: str = ""
    audio_size_bytes: int = 0
    audio_duration_seconds: float = 0
    audio_format: str = ""
    audio_channels: int = 0
    audio_sample_rate: int = 0
    raw_transcript: str = ""
    corrected_transcript: str = ""
    error: str = ""


class MeetingOutputs(BaseModel):
    raw_transcript_md: str = ""
    corrected_transcript_md: str = ""
    minutes_md: str = ""
    generated_at: str = ""


class Meeting(BaseModel):
    meeting_id: str
    host_key: str
    title: str = ""
    meeting_type: MeetingType = MeetingType.in_person
    context: str = ""
    known_terms: str = ""
    created_at: str = Field(default_factory=utc_now_iso)
    updated_at: str = Field(default_factory=utc_now_iso)
    segments: list[Segment] = Field(default_factory=list)
    outputs: MeetingOutputs = Field(default_factory=MeetingOutputs)

    def public_dict(self) -> dict[str, Any]:
        return {
            "meeting_id": self.meeting_id,
            "title": self.title,
            "meeting_type": self.meeting_type.value,
            "context": self.context,
            "known_terms": self.known_terms,
            "created_at": self.created_at,
            "updated_at": self.updated_at,
            "segment_count": len(self.segments),
        }