统一生成处理器
| 1068 | |
| 1069 | |
| 1070 | class GenerationHandler: |
| 1071 | """统一生成处理器""" |
| 1072 | |
| 1073 | def __init__(self, flow_client, token_manager, load_balancer, db, concurrency_manager, proxy_manager): |
| 1074 | cache_dir = Path(__file__).resolve().parents[2] / "tmp" |
| 1075 | self.flow_client = flow_client |
| 1076 | self.token_manager = token_manager |
| 1077 | self.load_balancer = load_balancer |
| 1078 | self.db = db |
| 1079 | self.concurrency_manager = concurrency_manager |
| 1080 | self.file_cache = FileCache( |
| 1081 | cache_dir=str(cache_dir), |
| 1082 | default_timeout=config.cache_timeout, |
| 1083 | proxy_manager=proxy_manager, |
| 1084 | flow_client=flow_client, |
| 1085 | ) |
| 1086 | |
| 1087 | def _create_generation_result(self) -> Dict[str, Any]: |
| 1088 | """????????????????""" |
| 1089 | return dict(success=False, error_message=None, error_emitted=False) |
| 1090 | |
| 1091 | def _create_response_state(self) -> Dict[str, Any]: |
| 1092 | """为单次请求创建独立的响应状态,避免并发请求互相污染。""" |
| 1093 | return { |
| 1094 | "url": None, |
| 1095 | "generated_assets": None, |
| 1096 | "base_url": None, |
| 1097 | } |
| 1098 | |
| 1099 | def _mark_generation_failed(self, generation_result: Optional[Dict[str, Any]], error_message: str): |
| 1100 | """????????????????????""" |
| 1101 | if isinstance(generation_result, dict): |
| 1102 | generation_result["success"] = False |
| 1103 | generation_result["error_message"] = error_message |
| 1104 | generation_result["error_emitted"] = True |
| 1105 | |
| 1106 | def _mark_generation_succeeded(self, generation_result: Optional[Dict[str, Any]]): |
| 1107 | """???????""" |
| 1108 | if isinstance(generation_result, dict): |
| 1109 | generation_result["success"] = True |
| 1110 | generation_result["error_message"] = None |
| 1111 | generation_result["error_emitted"] = False |
| 1112 | |
| 1113 | async def _resolve_video_asset( |
| 1114 | self, |
| 1115 | token, |
| 1116 | operation: Dict[str, Any], |
| 1117 | ) -> Dict[str, Any]: |
| 1118 | """按当前上游逻辑解析视频资产:状态由 media 决定,URL 通过 redirect 二段获取。""" |
| 1119 | metadata = (operation.get("operation") or {}).get("metadata", {}) or {} |
| 1120 | video_info = metadata.get("video", {}) if isinstance(metadata.get("video"), dict) else {} |
| 1121 | media_name = ( |
| 1122 | operation.get("mediaName") |
| 1123 | or video_info.get("mediaName") |
| 1124 | or video_info.get("mediaGenerationId") |
| 1125 | or operation.get("name") |
| 1126 | or (operation.get("operation") or {}).get("name") |
| 1127 | ) |