You've already forked FrameTour-RenderWorker
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:
@@ -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'))
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user