Spaces:
Sleeping
Sleeping
| """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) | |
| 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() | |