dashhdata's picture
Upload folder using huggingface_hub
4ec3855 verified
"""
Video Dubbing Agent — Deployed Version
Run: python main.py
Access: http://localhost:7860
"""
import logging
import sys
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse
from fastapi.middleware.cors import CORSMiddleware
from config import HOST, PORT, DEBUG, STATIC_DIR, TEMPLATES_DIR
from routes.dub import router as dub_router
from routes.info import router as info_router
from utils.file_manager import cleanup_expired_jobs
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
handlers=[logging.StreamHandler(sys.stdout)],
)
logger = logging.getLogger(__name__)
@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info("Video Dubbing Agent starting...")
cleanup_expired_jobs()
logger.info(f"Ready at http://localhost:{PORT}")
yield
logger.info("Shutting down.")
app = FastAPI(
title="Video Dubbing Agent",
description="AI video dubbing: YouTube → any language. Male voice. Free GPU transcription.",
version="2.0.0",
lifespan=lifespan,
)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
STATIC_DIR.mkdir(exist_ok=True)
app.mount("/static", StaticFiles(directory=str(STATIC_DIR)), name="static")
app.include_router(dub_router, prefix="/api", tags=["Dubbing"])
app.include_router(info_router, prefix="/api", tags=["Info"])
@app.get("/")
async def serve_frontend():
index_path = TEMPLATES_DIR / "index.html"
if index_path.exists():
return FileResponse(str(index_path))
return {"message": "Video Dubbing Agent API. Visit /docs for API docs."}
@app.get("/health")
async def health():
return {"status": "healthy", "service": "video-dubbing-agent", "version": "2.0"}
if __name__ == "__main__":
import uvicorn
uvicorn.run("main:app", host=HOST, port=PORT, reload=False)