"""FastAPI app entrypoint.""" from __future__ import annotations import logging from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from captcha_solver.api.routes import router from captcha_solver.config import get_settings def create_app() -> FastAPI: s = get_settings() logging.basicConfig( level=getattr(logging, s.log_level.upper(), logging.INFO), format="%(asctime)s %(levelname)s %(name)s: %(message)s", ) app = FastAPI( title="captcha-solver-api", description="Free local AI CAPTCHA solving API. No 2captcha. No pay-per-solve.", version="0.1.0", docs_url="/docs", redoc_url="/redoc", ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], ) app.include_router(router) @app.on_event("startup") async def warm_engines() -> None: from captcha_solver.api.routes import get_state get_state() logging.getLogger(__name__).info("engines warmed, ready") return app app = create_app() def main() -> None: import sys import uvicorn s = get_settings() port = s.port # Accept --port from command line (HF Spaces sets PORT env var) args = sys.argv[1:] for i, arg in enumerate(args): if arg == "--port" and i + 1 < len(args): try: port = int(args[i + 1]) except ValueError: pass # Also respect PORT env var import os port = int(os.environ.get("PORT", port)) uvicorn.run( "captcha_solver.main:app", host=s.host, port=port, log_level=s.log_level, workers=s.workers, ) if __name__ == "__main__": main()