"""In-memory task state management.""" from typing import Dict, Optional, List from datetime import datetime, timedelta import threading import time from backend.config import settings from backend.models.response import TaskStatus, TrackInfo class TaskManager: def __init__(self): self._tasks: Dict[str, dict] = {} self._lock = threading.Lock() def create_task(self, task_id: str, filename: str, file_size: int) -> None: with self._lock: self._tasks[task_id] = { "task_id": task_id, "filename": filename, "file_size": file_size, "status": TaskStatus.PENDING, "progress": 0, "message": "Upload complete", "error": None, "tracks": [], "created_at": datetime.now(), "updated_at": datetime.now() } def has_task(self, task_id: str) -> bool: return task_id in self._tasks def get_status(self, task_id: str) -> dict: with self._lock: return self._tasks.get(task_id, {}).copy() def update_task(self, task_id: str, **kwargs) -> None: with self._lock: if task_id in self._tasks: self._tasks[task_id].update(kwargs) self._tasks[task_id]["updated_at"] = datetime.now() def cleanup_old_tasks(self) -> None: now = datetime.now() timeout = timedelta(seconds=settings.cleanup_after_seconds) with self._lock: to_delete = [] for task_id, data in self._tasks.items(): if now - data["created_at"] > timeout: to_delete.append(task_id) for task_id in to_delete: self._delete_task_files(task_id) del self._tasks[task_id] def _delete_task_files(self, task_id: str) -> None: import shutil task_dir = settings.temp_dir / task_id if task_dir.exists(): shutil.rmtree(task_dir, ignore_errors=True) task_manager = TaskManager()