import os
import sys
import shutil
import logging
from pathlib import Path
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Add the backend directory to the Python path
sys.path.append(os.path.abspath("backend"))
# Create necessary directories if they don't exist
os.makedirs("./temp_audio", exist_ok=True)
os.makedirs("./temp", exist_ok=True)
os.makedirs("./static", exist_ok=True)
# Check for index.html and create a simple one if it doesn't exist
static_path = Path("./static")
index_path = static_path / "index.html"
if not index_path.exists():
logger.warning("index.html not found in static directory, creating a simple one")
with open(index_path, "w") as f:
f.write("""
PodCraft API
PodCraft API
The PodCraft API is running. You can access the API at /docs.
API Status: /api/status
""")
# Set environment variables for MongoDB connection timeout
os.environ["MONGODB_CONNECT_TIMEOUT_MS"] = "5000" # 5 seconds timeout
os.environ["MONGODB_SERVER_SELECTION_TIMEOUT_MS"] = "5000" # 5 seconds timeout
# Create a FastAPI app - either the main one or an error one
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse, JSONResponse, FileResponse
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
# Check if static directory exists with index.html
static_index_exists = static_path.exists() and index_path.exists()
logger.info(f"Static path exists: {static_path.exists()}")
if static_path.exists():
logger.info(f"Static directory contents: {os.listdir(static_path)}")
logger.info(f"Static index exists: {index_path.exists()}")
try:
# Try to import the main app
from backend.app.main import app
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Add an index route to check if the API is accessible
@app.get("/api/status")
async def status():
return {"status": "ok", "message": "PodCraft API is running"}
# Override the root route to serve the frontend
@app.get("/", response_class=HTMLResponse)
async def read_root():
# If index.html exists, return it directly using FileResponse
if index_path.exists():
logger.info(f"Serving index.html from {index_path}")
return FileResponse(index_path)
else:
logger.warning("index.html not found, returning fallback HTML")
return """
PodCraft API
PodCraft API
The PodCraft API is running, but the frontend static files were not found.
Static directory: ./static
Static directory exists: {static_path.exists()}
If you need to access the API directly, you can use the following endpoints:
/api/status
- Check API status
/docs
- API documentation
"""
# Mount static files
# First, make sure we're not serving the root path via StaticFiles
@app.get("/static/{path:path}")
async def serve_static(path: str):
file_path = static_path / path
if file_path.exists() and file_path.is_file():
return FileResponse(file_path)
return {"error": "File not found"}
app_to_run = app
logger.info("Using main application")
except Exception as e:
# If there's an error, create a minimal FastAPI app
logger.error(f"Error initializing main app: {str(e)}")
error_app = FastAPI()
@error_app.get("/", response_class=HTMLResponse)
async def root():
return f"""
PodCraft - Error
PodCraft Error
An error occurred while starting the application:
{str(e)}
Please check your environment variables and configuration.
MongoDB URL format should be: mongodb+srv://username:password@cluster.mongodb.net/...
API keys should be properly formatted and valid.
Static directory exists: {static_path.exists()}
{f"
Static directory contents: {os.listdir(static_path)}
" if static_path.exists() else ""}
Static index exists: {static_index_exists}
"""
@error_app.get("/static/{path:path}")
async def serve_static(path: str):
file_path = static_path / path
if file_path.exists() and file_path.is_file():
return FileResponse(file_path)
return {"error": "File not found"}
app_to_run = error_app
logger.info("Using error application")
# For Hugging Face Spaces - expose the app
if __name__ == "__main__":
import uvicorn
port = int(os.environ.get("PORT", 7860))
host = os.environ.get("HOST", "0.0.0.0")
logger.info(f"Starting server on {host}:{port}")
uvicorn.run(app_to_run, host=host, port=port)