main.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from ast import main
  2. import json
  3. import uuid
  4. from fastapi import FastAPI, HTTPException, Request
  5. from fastapi.responses import JSONResponse
  6. from fastapi.middleware.cors import CORSMiddleware
  7. from pydantic import BaseModel
  8. from utils.params import DecodeContentParam, PatternContentParam
  9. from dotenv import load_dotenv, find_dotenv
  10. from typing import List, Dict, Any, Optional
  11. from tasks.decode import begin_decode_task
  12. from tasks.detail import get_decode_detail_by_task_id
  13. from tasks.pattern import begin_pattern_task
  14. from loguru import logger
  15. import sys
  16. logger.add(sink=sys.stderr, level="ERROR", backtrace=True, diagnose=True)
  17. # 响应消息映射
  18. RESPONSE_MSG_MAP = {
  19. 0: "success",
  20. 1002: "视频不存在",
  21. 2001: "解构/聚类任务创建失败",
  22. -1: "failed",
  23. 404: "任务不存在"
  24. }
  25. load_dotenv(find_dotenv(), override=False)
  26. app = FastAPI()
  27. app.add_middleware(
  28. CORSMiddleware,
  29. allow_origins=["*"],
  30. allow_credentials=True,
  31. allow_methods=["*"],
  32. allow_headers=["*"],
  33. )
  34. @app.exception_handler(HTTPException)
  35. async def http_exception_handler(request: Request, exc: HTTPException):
  36. return JSONResponse(
  37. status_code=200,
  38. content={"code": exc.status_code, "message": exc.message, "data": None}
  39. )
  40. def _build_api_response(
  41. code: int,
  42. data: Any = None,
  43. reason: Optional[str] = None
  44. ) -> JSONResponse:
  45. """构建统一的API响应"""
  46. msg = RESPONSE_MSG_MAP.get(code, "failed")
  47. content = {
  48. "code": code,
  49. "msg": msg,
  50. "data": data
  51. }
  52. # 失败时添加 reason 字段
  53. if code != 0 and reason:
  54. content["reason"] = reason
  55. return JSONResponse(status_code=200, content=content)
  56. @app.post("/api/v1/content/tasks/decode")
  57. def decode_content(param: DecodeContentParam):
  58. """创建解构任务"""
  59. res = begin_decode_task(param)
  60. code = res.get("code", -1)
  61. task_id = res.get("task_id")
  62. reason = res.get("reason", "")
  63. return _build_api_response(
  64. code=code,
  65. data={"task_id": task_id} if task_id else None,
  66. reason=reason
  67. )
  68. @app.get("/api/v1/content/tasks/{taskId}")
  69. def get_task_detail(taskId: str):
  70. """获取任务详情"""
  71. result = get_decode_detail_by_task_id(taskId)
  72. # 任务不存在
  73. if result is None:
  74. return _build_api_response(code=404, data=None)
  75. # 直接返回结果(已经包含 code、msg、data、reason)
  76. return JSONResponse(status_code=200, content=result)
  77. @app.post("/api/v1/content/tasks/pattern")
  78. def pattern_content(param: PatternContentParam):
  79. """创建模式任务"""
  80. res = begin_pattern_task(param)
  81. code = res.get("code", -1)
  82. task_id = res.get("task_id")
  83. reason = res.get("reason", "")
  84. return _build_api_response(
  85. code=code,
  86. data={"task_id": task_id} if task_id else None,
  87. reason=reason
  88. )