# main.py import asyncio import logging import os from fastapi import FastAPI, Request, HTTPException from starlette.responses import JSONResponse import uvicorn import bot import config app = FastAPI() # Health endpoint @app.get("/health") async def health(): return {"status": "ok", "uptime": bot.get_uptime()} # Optional admin endpoint (secured with ADMIN_API_TOKEN) @app.get("/admin") async def admin(request: Request): token = request.query_params.get("token") if config.ADMIN_API_TOKEN and token != config.ADMIN_API_TOKEN: raise HTTPException(status_code=403, detail="Forbidden") # Basic batch stats batches = { batch_id: { "processed": batch["processed_links"], "total": batch["total_links"], "successful": len(batch["successful_downloads"]), "failed": len(batch["failed_links"]), } for batch_id, batch in bot.BATCH_JOBS.items() } return {"active_batches": batches} async def main(): # Run both bot and web API bot_task = asyncio.create_task(bot.run_bot()) await bot_task if __name__ == "__main__": # Run FastAPI + start asyncio bot inside it import threading def run_uvicorn(): uvicorn.run("main:app", host="0.0.0.0", port=7860, log_level="info") threading.Thread(target=run_uvicorn, daemon=True).start() asyncio.run(main())