You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
2.7 KiB
62 lines
2.7 KiB
from __future__ import annotations |
|
|
|
from typing import Optional |
|
|
|
from pydantic import BaseModel, Field, field_validator |
|
|
|
|
|
class TriggerConfig(BaseModel): |
|
name: str = Field(..., min_length=1, max_length=80) |
|
type: str = Field(..., pattern=r"^GPIO\d+$") |
|
music_file: str = Field(..., min_length=1, max_length=255) |
|
start_seconds: Optional[float] = Field(default=0.0, ge=0) |
|
end_seconds: Optional[float] = Field(default=None, ge=0) |
|
volume: int = Field(default=80, ge=0, le=100) |
|
fade_in_seconds: float = Field(default=0.0, ge=0) |
|
fade_out_seconds: float = Field(default=0.0, ge=0) |
|
repeat_count: int = Field(default=0, ge=0) |
|
normalize_audio: bool = Field(default=False) |
|
|
|
@field_validator("end_seconds") |
|
@classmethod |
|
def validate_time_window(cls, end_seconds: Optional[float], info): |
|
start_seconds = info.data.get("start_seconds", 0.0) |
|
if end_seconds is not None and end_seconds <= start_seconds: |
|
raise ValueError("end_seconds must be greater than start_seconds") |
|
return end_seconds |
|
|
|
|
|
class TriggerPatch(BaseModel): |
|
name: Optional[str] = Field(default=None, min_length=1, max_length=80) |
|
type: Optional[str] = Field(default=None, pattern=r"^GPIO\d+$") |
|
music_file: Optional[str] = Field(default=None, min_length=1, max_length=255) |
|
start_seconds: Optional[float] = Field(default=None, ge=0) |
|
end_seconds: Optional[float] = Field(default=None, ge=0) |
|
volume: Optional[int] = Field(default=None, ge=0, le=100) |
|
fade_in_seconds: Optional[float] = Field(default=None, ge=0) |
|
fade_out_seconds: Optional[float] = Field(default=None, ge=0) |
|
repeat_count: Optional[int] = Field(default=None, ge=0) |
|
normalize_audio: Optional[bool] = Field(default=None) |
|
|
|
|
|
class ForcePlayRequest(BaseModel): |
|
trigger_id: Optional[str] = Field(default=None, min_length=1, max_length=80) |
|
music_file: Optional[str] = Field(default=None, min_length=1, max_length=255) |
|
start_seconds: float = Field(default=0.0, ge=0) |
|
end_seconds: Optional[float] = Field(default=None, ge=0) |
|
|
|
@field_validator("end_seconds") |
|
@classmethod |
|
def validate_end_seconds(cls, end_seconds: Optional[float], info): |
|
start_seconds = info.data.get("start_seconds", 0.0) |
|
if end_seconds is not None and end_seconds <= start_seconds: |
|
raise ValueError("end_seconds must be greater than start_seconds") |
|
return end_seconds |
|
|
|
@field_validator("music_file") |
|
@classmethod |
|
def validate_play_source(cls, music_file: Optional[str], info): |
|
trigger_id = info.data.get("trigger_id") |
|
if not music_file and not trigger_id: |
|
raise ValueError("trigger_id or music_file must be provided") |
|
return music_file
|
|
|