| 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")
|
| 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) |