From 91e9f3900d7e6f7e52bee8e6b16326b7f98c7c42 Mon Sep 17 00:00:00 2001 From: Guozao Meng Date: Sat, 8 Mar 2025 22:53:22 +0400 Subject: [PATCH 1/2] Add get_all_tasks() endpoint --- app/controllers/v1/video.py | 16 ++++++++++++++++ app/services/state.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/app/controllers/v1/video.py b/app/controllers/v1/video.py index 0430707..e80d762 100644 --- a/app/controllers/v1/video.py +++ b/app/controllers/v1/video.py @@ -94,6 +94,22 @@ def create_task( task_id=task_id, status_code=400, message=f"{request_id}: {str(e)}" ) +from fastapi import Query + +@router.get("/tasks", response_model=TaskQueryResponse, summary="Get all tasks") +def get_all_tasks(request: Request, page: int = Query(1, ge=1), page_size: int = Query(10, ge=1)): + request_id = base.get_task_id(request) + tasks, total = sm.state.get_all_tasks(page, page_size) + + response = { + "tasks": tasks, + "total": total, + "page": page, + "page_size": page_size, + } + return utils.get_response(200, response) + + @router.get( "/tasks/{task_id}", response_model=TaskQueryResponse, summary="Query task status" diff --git a/app/services/state.py b/app/services/state.py index b04f699..21d325f 100644 --- a/app/services/state.py +++ b/app/services/state.py @@ -15,12 +15,23 @@ class BaseState(ABC): def get_task(self, task_id: str): pass + @abstractmethod + def get_all_tasks(self, page: int, page_size: int): + pass + # Memory state management class MemoryState(BaseState): def __init__(self): self._tasks = {} + def get_all_tasks(self, page: int, page_size: int): + start = (page - 1) * page_size + end = start + page_size + tasks = list(self._tasks.values()) + total = len(tasks) + return tasks[start:end], total + def update_task( self, task_id: str, @@ -33,6 +44,7 @@ class MemoryState(BaseState): progress = 100 self._tasks[task_id] = { + "task_id": task_id, "state": state, "progress": progress, **kwargs, @@ -53,6 +65,28 @@ class RedisState(BaseState): self._redis = redis.StrictRedis(host=host, port=port, db=db, password=password) + def get_all_tasks(self, page: int, page_size: int): + start = (page - 1) * page_size + end = start + page_size + tasks = [] + cursor = 0 + total = 0 + while True: + cursor, keys = self._redis.scan(cursor, count=page_size) + total += len(keys) + if total > start: + for key in keys[max(0, start - total):end - total]: + task_data = self._redis.hgetall(key) + task = { + k.decode("utf-8"): self._convert_to_original_type(v) for k, v in task_data.items() + } + tasks.append(task) + if len(tasks) >= page_size: + break + if cursor == 0 or len(tasks) >= page_size: + break + return tasks, total + def update_task( self, task_id: str, @@ -65,6 +99,7 @@ class RedisState(BaseState): progress = 100 fields = { + "task_id": task_id, "state": state, "progress": progress, **kwargs, From 6c2b5b8cf43c2a5a09866c945de435a827e79e23 Mon Sep 17 00:00:00 2001 From: Guozao Meng Date: Sat, 8 Mar 2025 22:54:10 +0400 Subject: [PATCH 2/2] Update .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cf3cd39..6aa0ca7 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,7 @@ node_modules /sites/docs/.vuepress/dist # 模型目录 /models/ -./models/* \ No newline at end of file +./models/* + +venv/ +.venv \ No newline at end of file