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:

""" # 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)