feat(task): 增强素材URL处理和验证逻辑

- 添加详细的get_material_url方法文档说明优先级逻辑
- 新增get_source_ref方法用于获取素材源引用
- 新增get_bound_material_url方法用于获取绑定素材URL
- 在视频渲染处理器中添加HTTP URL格式验证检查
- 当素材URL格式无效时返回详细错误信息和调试日志
- 验证失败时返回E_SPEC_INVALID错误码并提示服务器需提供有效的boundMaterialUrl
This commit is contained in:
2026-01-17 16:22:01 +08:00
parent fe757408b6
commit 095e203fe6
2 changed files with 32 additions and 1 deletions

View File

@@ -350,9 +350,25 @@ class Task:
return int(self.payload.get('durationMs', 5000)) return int(self.payload.get('durationMs', 5000))
def get_material_url(self) -> Optional[str]: def get_material_url(self) -> Optional[str]:
"""获取素材 URL""" """
获取素材 URL
优先使用 boundMaterialUrl(实际可下载的 HTTP URL),
如果不存在则回退到 sourceRef(可能是 slot 引用)。
Returns:
素材 URL,如果都不存在返回 None
"""
return self.payload.get('boundMaterialUrl') or self.payload.get('sourceRef') return self.payload.get('boundMaterialUrl') or self.payload.get('sourceRef')
def get_source_ref(self) -> Optional[str]:
"""获取素材源引用(slot 标识符,如 device:xxx)"""
return self.payload.get('sourceRef')
def get_bound_material_url(self) -> Optional[str]:
"""获取绑定的素材 URL(实际可下载的 HTTP URL)"""
return self.payload.get('boundMaterialUrl')
def get_render_spec(self) -> RenderSpec: def get_render_spec(self) -> RenderSpec:
"""获取渲染规格""" """获取渲染规格"""
return RenderSpec.from_dict(self.payload.get('renderSpec')) return RenderSpec.from_dict(self.payload.get('renderSpec'))

View File

@@ -46,6 +46,21 @@ class RenderSegmentVideoHandler(BaseHandler):
"Missing material URL (boundMaterialUrl or sourceRef)" "Missing material URL (boundMaterialUrl or sourceRef)"
) )
# 检查 URL 格式:必须是 HTTP/HTTPS 协议
if not material_url.startswith(('http://', 'https://')):
source_ref = task.get_source_ref()
bound_url = task.get_bound_material_url()
logger.error(
f"[task:{task.task_id}] Invalid material URL format: '{material_url}'. "
f"boundMaterialUrl={bound_url}, sourceRef={source_ref}. "
f"Server should provide boundMaterialUrl with HTTP URL."
)
return TaskResult.fail(
ErrorCode.E_SPEC_INVALID,
f"Invalid material URL: '{material_url}' is not a valid HTTP URL. "
f"Server must provide boundMaterialUrl."
)
render_spec = task.get_render_spec() render_spec = task.get_render_spec()
output_spec = task.get_output_spec() output_spec = task.get_output_spec()
duration_ms = task.get_duration_ms() duration_ms = task.get_duration_ms()