|
7 | 7 |
|
8 | 8 | from __future__ import annotations |
9 | 9 |
|
10 | | -from typing import Any, Dict, List, Literal, Optional |
| 10 | +from typing import Any, Dict, List, Literal, Optional, Union |
11 | 11 |
|
12 | 12 | from pydantic import BaseModel, ConfigDict, Field, field_validator |
13 | 13 |
|
@@ -201,3 +201,126 @@ class BatchResponse(_Model): |
201 | 201 | kind: Literal["transcript_batch"] = "transcript_batch" |
202 | 202 | results: List[BatchResult] = Field(default_factory=list) |
203 | 203 | usage: Optional[Usage] = None |
| 204 | + |
| 205 | + |
| 206 | +# Monitor response models ----------------------------------------------------- |
| 207 | +MonitorInterval = Literal[15, 60, 360, 1440] |
| 208 | + |
| 209 | + |
| 210 | +class MonitorSnapshot(_Model): |
| 211 | + id: str |
| 212 | + name: Optional[str] = None |
| 213 | + type: str = "channel" |
| 214 | + platform: str = "youtube" |
| 215 | + target: str = "" |
| 216 | + |
| 217 | + |
| 218 | +class MonitorLastError(ApiErrorBlock): |
| 219 | + at: Optional[str] = None |
| 220 | + |
| 221 | + |
| 222 | +class Monitor(MonitorSnapshot): |
| 223 | + """A scheduled monitor. webhook_secret and baseline_count appear only on creation.""" |
| 224 | + |
| 225 | + kind: str = "monitor" |
| 226 | + options: Dict[str, Any] = Field(default_factory=dict) |
| 227 | + status: str = "active" |
| 228 | + has_new: bool = False |
| 229 | + last_event_id: Optional[str] = None |
| 230 | + interval_minutes: int = 60 |
| 231 | + transcripts: bool = False |
| 232 | + webhook_url: Optional[str] = None |
| 233 | + next_check_at: Optional[str] = None |
| 234 | + last_checked_at: Optional[str] = None |
| 235 | + last_error: Optional[MonitorLastError] = None |
| 236 | + created_at: Optional[str] = None |
| 237 | + updated_at: Optional[str] = None |
| 238 | + webhook_secret: Optional[str] = Field(default=None, repr=False) |
| 239 | + baseline_count: Optional[int] = None |
| 240 | + usage: Optional[Usage] = None |
| 241 | + |
| 242 | + |
| 243 | +class MonitorLimits(_Model): |
| 244 | + max_monitors: Optional[int] = None |
| 245 | + min_interval_minutes: int = 60 |
| 246 | + |
| 247 | + |
| 248 | +class MonitorList(_Model): |
| 249 | + kind: str = "monitor_list" |
| 250 | + monitors: List[Monitor] = Field(default_factory=list) |
| 251 | + has_new: bool = False |
| 252 | + last_event_id: Optional[str] = None |
| 253 | + limits: MonitorLimits = Field(default_factory=MonitorLimits) |
| 254 | + |
| 255 | + |
| 256 | +class MonitorDeleted(_Model): |
| 257 | + kind: str = "monitor_deleted" |
| 258 | + id: str |
| 259 | + |
| 260 | + |
| 261 | +class MonitorDelivery(_Model): |
| 262 | + status: str = "none" |
| 263 | + attempts: int = 0 |
| 264 | + last_attempt_at: Optional[str] = None |
| 265 | + next_attempt_at: Optional[str] = None |
| 266 | + last_error: Optional[str] = None |
| 267 | + delivered_at: Optional[str] = None |
| 268 | + |
| 269 | + |
| 270 | +class MonitorTranscriptResult(_Model): |
| 271 | + job_id: Optional[str] = None |
| 272 | + video_id: str |
| 273 | + url: str = "" |
| 274 | + outcome: str |
| 275 | + transcript: Optional[Transcript] = None |
| 276 | + error: Optional[ApiErrorBlock] = None |
| 277 | + |
| 278 | + |
| 279 | +class MonitorVideosData(_Model): |
| 280 | + videos: List[Video] = Field(default_factory=list) |
| 281 | + transcripts: Optional[List[MonitorTranscriptResult]] = None |
| 282 | + |
| 283 | + |
| 284 | +class MonitorTranscriptData(MonitorTranscriptResult): |
| 285 | + videos_event_id: str |
| 286 | + |
| 287 | + |
| 288 | +class MonitorVideosEvent(_Model): |
| 289 | + id: str |
| 290 | + type: Literal["monitor.videos"] |
| 291 | + created_at: str |
| 292 | + monitor: MonitorSnapshot |
| 293 | + credits_spent: int = 0 |
| 294 | + data: MonitorVideosData |
| 295 | + delivery: Optional[MonitorDelivery] = None |
| 296 | + |
| 297 | + |
| 298 | +class MonitorTranscriptEvent(_Model): |
| 299 | + id: str |
| 300 | + type: Literal["monitor.transcript"] |
| 301 | + created_at: str |
| 302 | + monitor: MonitorSnapshot |
| 303 | + credits_spent: int = 0 |
| 304 | + data: MonitorTranscriptData |
| 305 | + delivery: Optional[MonitorDelivery] = None |
| 306 | + |
| 307 | + |
| 308 | +MonitorEvent = Union[MonitorVideosEvent, MonitorTranscriptEvent] |
| 309 | + |
| 310 | + |
| 311 | +class MonitorEventList(_Model): |
| 312 | + kind: str = "monitor_event_list" |
| 313 | + monitor_id: str |
| 314 | + events: List[MonitorEvent] = Field(default_factory=list) |
| 315 | + next_cursor: Optional[str] = None |
| 316 | + |
| 317 | + |
| 318 | +class MonitorCheck(_Model): |
| 319 | + """A check may return HTTP 200 with error set when the listing failed.""" |
| 320 | + |
| 321 | + kind: str = "monitor_check" |
| 322 | + monitor: Monitor |
| 323 | + new_videos: int = 0 |
| 324 | + event: Optional[MonitorEvent] = None |
| 325 | + error: Optional[ApiErrorBlock] = None |
| 326 | + usage: Optional[Usage] = None |
0 commit comments