Spaces:
Running
Running
| import json | |
| import re | |
| from typing import Dict, Any | |
| def check_format(script_content: str) -> Dict[str, Any]: | |
| """检查脚本格式 | |
| Args: | |
| script_content: 脚本内容 | |
| Returns: | |
| Dict: {'success': bool, 'message': str, 'details': str} | |
| """ | |
| try: | |
| # 检查是否为有效的JSON | |
| data = json.loads(script_content) | |
| # 检查是否为列表 | |
| if not isinstance(data, list): | |
| return { | |
| 'success': False, | |
| 'message': '脚本必须是JSON数组格式', | |
| 'details': '正确格式应该是: [{"_id": 1, "timestamp": "...", ...}, ...]' | |
| } | |
| # 检查数组不能为空 | |
| if len(data) == 0: | |
| return { | |
| 'success': False, | |
| 'message': '脚本数组不能为空', | |
| 'details': '至少需要包含一个脚本片段' | |
| } | |
| # 检查每个片段 | |
| for i, clip in enumerate(data): | |
| # 检查是否为对象类型 | |
| if not isinstance(clip, dict): | |
| return { | |
| 'success': False, | |
| 'message': f'第{i+1}个元素必须是对象类型', | |
| 'details': f'当前类型: {type(clip).__name__}' | |
| } | |
| # 检查必需字段 | |
| required_fields = ['_id', 'timestamp', 'picture', 'narration', 'OST'] | |
| for field in required_fields: | |
| if field not in clip: | |
| return { | |
| 'success': False, | |
| 'message': f'第{i+1}个片段缺少必需字段: {field}', | |
| 'details': f'必需字段: {", ".join(required_fields)}' | |
| } | |
| # 验证 _id 字段 | |
| if not isinstance(clip['_id'], int) or clip['_id'] <= 0: | |
| return { | |
| 'success': False, | |
| 'message': f'第{i+1}个片段的_id必须是正整数', | |
| 'details': f'当前值: {clip["_id"]} (类型: {type(clip["_id"]).__name__})' | |
| } | |
| # 验证 timestamp 字段格式 | |
| timestamp_pattern = r'^\d{2}:\d{2}:\d{2},\d{3}-\d{2}:\d{2}:\d{2},\d{3}$' | |
| if not isinstance(clip['timestamp'], str) or not re.match(timestamp_pattern, clip['timestamp']): | |
| return { | |
| 'success': False, | |
| 'message': f'第{i+1}个片段的timestamp格式错误', | |
| 'details': f'正确格式: "HH:MM:SS,mmm-HH:MM:SS,mmm",示例: "00:00:00,600-00:00:07,559"' | |
| } | |
| # 验证 picture 字段 | |
| if not isinstance(clip['picture'], str) or not clip['picture'].strip(): | |
| return { | |
| 'success': False, | |
| 'message': f'第{i+1}个片段的picture必须是非空字符串', | |
| 'details': f'当前值: {clip.get("picture", "未定义")}' | |
| } | |
| # 验证 narration 字段 | |
| if not isinstance(clip['narration'], str) or not clip['narration'].strip(): | |
| return { | |
| 'success': False, | |
| 'message': f'第{i+1}个片段的narration必须是非空字符串', | |
| 'details': f'当前值: {clip.get("narration", "未定义")}' | |
| } | |
| # 验证 OST 字段 | |
| if not isinstance(clip['OST'], int): | |
| return { | |
| 'success': False, | |
| 'message': f'第{i+1}个片段的OST必须是整数', | |
| 'details': f'当前值: {clip["OST"]} (类型: {type(clip["OST"]).__name__}),常用值: 0, 1, 2' | |
| } | |
| return { | |
| 'success': True, | |
| 'message': '脚本格式检查通过', | |
| 'details': f'共验证 {len(data)} 个脚本片段,格式正确' | |
| } | |
| except json.JSONDecodeError as e: | |
| return { | |
| 'success': False, | |
| 'message': f'JSON格式错误: {str(e)}', | |
| 'details': '请检查JSON语法,确保所有括号、引号、逗号正确' | |
| } | |
| except Exception as e: | |
| return { | |
| 'success': False, | |
| 'message': f'检查过程中发生错误: {str(e)}', | |
| 'details': '请联系技术支持' | |
| } | |