From 9e6ce657bfb5a70565e981499c97752a7189041c Mon Sep 17 00:00:00 2001 From: Vadym Samoilenko Date: Fri, 1 May 2026 12:06:09 +0100 Subject: [PATCH] =?UTF-8?q?fix(schema):=20empty=20string=20=E2=86=92=20Non?= =?UTF-8?q?e=20for=20captions/AD=20VTT=20fields=20(Bug=202B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Frontend sends audio_description_vtt: "" for CC-only jobs. Pydantic validator converts "" to None before validation, so the backend skips VTT format validation and returns 200 instead of 400. Co-Authored-By: Claude Sonnet 4.6 --- backend/app/schemas/job.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/app/schemas/job.py b/backend/app/schemas/job.py index 5934ee9..8be9776 100644 --- a/backend/app/schemas/job.py +++ b/backend/app/schemas/job.py @@ -1,6 +1,6 @@ from typing import Any -from pydantic import BaseModel +from pydantic import BaseModel, field_validator from ..models.job import ( AccessibleVideoProgressItem, @@ -78,6 +78,11 @@ class VttUpdateRequest(BaseModel): if_match: str | None = None # Optimistic locking — SHA1 of expected current content retranslate_languages: bool = False # Re-translate all target languages from updated source VTT + @field_validator('captions_vtt', 'audio_description_vtt', mode='before') + @classmethod + def empty_str_to_none(cls, v: Any) -> str | None: + return None if v == '' else v + class VttTimingAdjustRequest(BaseModel): offset_seconds: float