Browse Source

Merge branch 'master' of https://git.yishihui.com/weapp/video_decode into decode_prompt

jihuaqiang 3 ngày trước cách đây
mục cha
commit
1e12943ad5
6 tập tin đã thay đổi với 89 bổ sung27 xóa
  1. 29 0
      Dockerfile
  2. 19 16
      decode_task/decodeTask.py
  3. 15 0
      docker-compose.yaml
  4. 13 6
      main.py
  5. 1 1
      models/decode_record.py
  6. 12 4
      src/models/decode_video.py

+ 29 - 0
Dockerfile

@@ -0,0 +1,29 @@
+FROM registry.cn-hangzhou.aliyuncs.com/stuuudy/python:3.13-slim
+
+RUN rm -rf /etc/apt/sources.list.d/*
+
+
+RUN echo "deb https://mirrors.aliyun.com/debian/ bookworm main contrib non-free" > /etc/apt/sources.list.d/aliyun.list \
+    && echo "deb https://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free" >> /etc/apt/sources.list.d/aliyun.list \
+    && echo "deb https://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free" >> /etc/apt/sources.list.d/aliyun.list \
+    && apt-get update
+
+RUN apt-get install -y tzdata \
+    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone \
+    && rm -rf /var/lib/apt/lists/*
+
+
+RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
+
+RUN pip install uv  -i  https://mirrors.aliyun.com/pypi/simple
+
+RUN mkdir -p /video_decode
+WORKDIR /video_decode
+
+COPY . /video_decode
+
+RUN uv venv 
+ENV PATH="/video_decode/.venv/bin:$PATH"
+RUN uv pip install -r requirements.txt   -i  https://mirrors.aliyun.com/pypi/simple
+
+CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

+ 19 - 16
decode_task/decodeTask.py

@@ -19,28 +19,27 @@ logger.add(sink=sys.stderr, level="ERROR", backtrace=True, diagnose=True)
 
 def invoke_decode_workflow(task_params: Dict[str, Any]):
     """主函数"""
-
-    result = DecodeWorkflow(task_params)
+    workflow = DecodeWorkflow()
+    result = workflow.invoke(task_params)
     if result:
-            return result
+        return result
     else:
         print(f"❌ 保存结果失败,但将继续处理")
         return None
 
 
 def get_decode_result_by_id(task_id:str):
-    sql = "SELECT * FROM decode_videos WHERE task_id = %s AND task_status = 2 "
+    sql = "SELECT * FROM decode_videos WHERE task_id = %s"
     tasks = mysql.fetchone(sql, (task_id,))
     if not tasks:
         logger.info(f"task_id = {task_id} , 任务不存在")
         return None
-    return tasks['result'], tasks['status']
+    return tasks['result'], tasks['status'],tasks['error_reason']
 
 
 def  decode_task_status_handler():
     # 从数据库中获取任务,每次获取一个
-    sql = "SELECT * FROM decode_record WHERE task_status = 0 "
-    """json"""
+    sql = "SELECT * FROM decode_record WHERE task_status = 0 ORDER BY create_timestamp ASC LIMIT 1"
     task = mysql.fetchone(sql)
    
 
@@ -49,8 +48,8 @@ def  decode_task_status_handler():
         return
     else:
         task_id = task['task_id']
-        sql = "UPDATE decode_record SET task_status = 1 WHERE task_id = %s"
-        mysql.execute(sql, (task_id,))     
+        sql = "UPDATE decode_record SET task_status = 1 WHERE task_id = %s AND task_status = 0"
+        mysql.execute(sql, (task_id,))
         
         # 获取任务结果
     try:
@@ -66,20 +65,24 @@ def  decode_task_status_handler():
 
         if decode_result:
             # 更新任务状态为2,任务完成
-            sql = "UPDATE decode_record SET task_status = 2, WHERE task_id = %s"
-            mysql.execute(sql, (task_id))
+            sql = "UPDATE decode_record SET task_status = 2 WHERE task_id = %s"
+            mysql.execute(sql, (task_id,))
             logger.info(f"task_id = {task_id} , decode_result = {decode_result}")
 
            
         else:
             if current_timestamp - task_create_timestamp > 1000 * 60 * 60:
-                sql = "UPDATE decode_record SET task_status = 3, WHERE task_id = %s"
-                mysql.execute(sql, (task_id))
+                sql = "UPDATE decode_record SET task_status = 3 WHERE task_id = %s"
+                mysql.execute(sql, (task_id,))
                 logger.info(f"task_id = {task_id} ,任务状态异常")
     except Exception as e:
         logger.error(f"task_id = {task_id} , error = {e}")
-        sql = "UPDATE decode_record SET task_status = 3, WHERE task_id = %s"
-        mysql.execute(sql,  (task_id))
+        sql = "UPDATE decode_record SET task_status = 3 WHERE task_id = %s"
+        mysql.execute(sql,  (task_id,))
         logger.info(f"task_id = {task_id} ,任务异常")
-        raise {"task_id": task_id, "error": '任务异常'}
+        raise RuntimeError(f"task_id={task_id} 任务异常: {e}")
+
 
+if __name__ == "__main__":
+    decode_task_status_handler()
+   

+ 15 - 0
docker-compose.yaml

@@ -0,0 +1,15 @@
+version: "3.8"
+
+services:
+  server:
+    build:
+      context: .
+      dockerfile: Dockerfile
+    image: video_decode
+    container_name: video_decode
+    restart: always
+    ports:
+      - "8000:8000"
+    environment:
+      - ENV=prod
+    entrypoint: ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

+ 13 - 6
main.py

@@ -8,7 +8,7 @@ from utils.params import TaskStatusParam, DecodeListParam
 from dotenv import load_dotenv
 
 
-from decode_task.decodeTask import get_decode_result_by_id
+from decode_task.decodeTask import get_decode_result_by_id as get_decode_result_by_id_db
 
 
 
@@ -73,15 +73,23 @@ def decode_video(param:DecodeListParam):
 
 
 @app.post("/decode/result")
-def get_decode_result_by_id(param: TaskStatusParam):
-    result, status = get_decode_result_by_id(param.task_id)
+def get_decode_result(param: TaskStatusParam):
+    db_res = get_decode_result_by_id_db(param.task_id)
+    if not db_res:
+        return {
+            "code": -1,
+            "message": "error",
+            "data": None
+        }
+    result, status,error_reason = db_res
     if result:
         return {
             "code": 0,
             "message": "success",
             "data": {
-                "decode_result": result,
-                "task_status": status
+                "result": result,
+                "status": status,
+                "error":error_reason
             }
         }
     else:
@@ -91,4 +99,3 @@ def get_decode_result_by_id(param: TaskStatusParam):
             "data": None
         }
 
-

+ 1 - 1
models/decode_record.py

@@ -12,7 +12,7 @@ class DecodeRecord(BaseModel):
     task_id:          Annotated[str, Field(description='任务ID')]
     video_id:            Annotated[str, Field(description='视频ID')]
     video_url:            Annotated[str, Field(description='视频地址')]
-    status:      Annotated[Optional[int], Field(description='任务状态', default=1)]  # 0:待执行  /   1:执行中  /  2:执行成功  3:执行失败
+    task_status:      Annotated[Optional[int], Field(description='任务状态', default=1)]  # 0:待执行  /   1:执行中  /  2:执行成功  3:执行失败
     create_timestamp: Annotated[Optional[int], Field(description='任务创建时间戳', default_factory=get_now_ts)]
 
     def save(self):

+ 12 - 4
src/models/decode_video.py

@@ -73,7 +73,7 @@ class DecodeVideo(Base):
     result = Column(Text, nullable=True, comment="解码结果")
     
     # 状态
-    status = Column(Integer, nullable=True, default=DecodeStatus.PENDING, index=True, comment="状态: 0:待执行 / 1:执行中 / 2:执行成功 / 3:执行失败")
+    status = Column(Integer, nullable=True, default=int(DecodeStatus.PENDING), index=True, comment="状态: 0:待执行 / 1:执行中 / 2:执行成功 / 3:执行失败")
     
     # 失败原因
     error_reason = Column(Text, nullable=True, comment="失败原因")
@@ -97,7 +97,6 @@ class DecodeVideo(Base):
             "video_id": self.video_id,
             "result": self.result,
             "status": self.status,
-            "status_description": DecodeStatus.get_description(self.status) if self.status is not None else None,
             "error_reason": self.error_reason,
             "created_at": self.created_at.isoformat() if self.created_at else None,
             "updated_at": self.updated_at.isoformat() if self.updated_at else None,
@@ -124,10 +123,20 @@ class DecodeVideo(Base):
         Returns:
             DecodeVideo: 新创建的模型实例
         """
+        # 统一将枚举转换为整型值
+        if status is None:
+            status_value = int(DecodeStatus.PENDING)
+        else:
+            try:
+                # 支持传入 IntEnum 或具体的整数
+                status_value = int(status)
+            except Exception:
+                status_value = int(DecodeStatus.PENDING)
+
         return cls(
             task_id=task_id,
             video_id=video_id,
-            status=status if status is not None else DecodeStatus.PENDING,
+            status=status_value,
             result=result,
             error_reason=error_reason
         )
@@ -154,4 +163,3 @@ class DecodeVideo(Base):
         self.result = result
         if self.status == DecodeStatus.EXECUTING:
             self.update_status(DecodeStatus.SUCCESS)
-