import gc import logging import os import shutil import tempfile import time from fastapi import FastAPI, Request from fastapi.middleware.cors import CORSMiddleware from chartmetric_summary_generator3 import final_score_calculation app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) BASE_DIR = os.path.dirname(os.path.abspath(__file__)) SESSIONS_ROOT = os.path.join(BASE_DIR, "sessions") # all per-request dirs live here os.makedirs(SESSIONS_ROOT, exist_ok=True) logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", ) logger = logging.getLogger(__name__) def _cleanup_session(session_dir: str) -> None: """Remove the entire per-request temp directory, tolerating locked files.""" if not os.path.exists(session_dir): return try: gc.collect() time.sleep(0.1) shutil.rmtree(session_dir, ignore_errors=True) logger.info(f"Cleaned up session dir: {session_dir}") except Exception as e: logger.warning(f"Could not fully clean up {session_dir}: {e}") @app.get("/") def read_root(): return {"Hello": "200 ok"} @app.post("/fanbase_score") async def fanbase_score(request: Request): session_dir = tempfile.mkdtemp(dir=SESSIONS_ROOT) logger.info(f"Created session dir: {session_dir}") try: data = await request.json() task_id = data["track_id"].strip() logger.info(f"Processing start – task_id={task_id} session={session_dir}") fanbase_score_count = final_score_calculation(task_id, session_dir) logger.info(f"Fan Base Count: {fanbase_score_count}") return {"fanbase_count": fanbase_score_count} except Exception as e: logger.error(f"Request failed: {e}") return {"error": str(e)} finally: _cleanup_session(session_dir)