Spaces:
Configuration error
Configuration error
| #!/usr/bin/env python3 | |
| """ | |
| Progress tracking via file-based status updates | |
| Allows background processing while UI stays responsive | |
| """ | |
| import json | |
| import os | |
| from pathlib import Path | |
| from typing import Optional | |
| PROGRESS_FILE = "/tmp/processing_status.json" | |
| def init_progress(): | |
| """Initialize progress tracking""" | |
| status = { | |
| "active": False, | |
| "message": "", | |
| "progress": 0, | |
| "stage": "", | |
| "error": None, | |
| "complete": False | |
| } | |
| with open(PROGRESS_FILE, "w") as f: | |
| json.dump(status, f) | |
| def update_progress(message: str, progress: int = None, stage: str = None): | |
| """Update progress status""" | |
| try: | |
| if os.path.exists(PROGRESS_FILE): | |
| with open(PROGRESS_FILE, "r") as f: | |
| status = json.load(f) | |
| else: | |
| status = {"active": True, "message": "", "progress": 0, "stage": "", "error": None, "complete": False} | |
| status["message"] = message | |
| status["active"] = True | |
| if progress is not None: | |
| status["progress"] = progress | |
| if stage is not None: | |
| status["stage"] = stage | |
| with open(PROGRESS_FILE, "w") as f: | |
| json.dump(status, f) | |
| except Exception: | |
| pass # Fail silently to not interrupt processing | |
| def mark_complete(success: bool = True, error: str = None): | |
| """Mark processing as complete""" | |
| try: | |
| if os.path.exists(PROGRESS_FILE): | |
| with open(PROGRESS_FILE, "r") as f: | |
| status = json.load(f) | |
| else: | |
| status = {} | |
| status["active"] = False | |
| status["complete"] = True | |
| status["progress"] = 100 if success else status.get("progress", 0) | |
| if error: | |
| status["error"] = error | |
| with open(PROGRESS_FILE, "w") as f: | |
| json.dump(status, f) | |
| except Exception: | |
| pass | |
| def get_progress() -> dict: | |
| """Read current progress status""" | |
| try: | |
| if os.path.exists(PROGRESS_FILE): | |
| with open(PROGRESS_FILE, "r") as f: | |
| return json.load(f) | |
| except Exception: | |
| pass | |
| return {"active": False, "message": "", "progress": 0, "stage": "", "error": None, "complete": False} |