Nagesh Muralidhar
adding app.py
8f0bc94
raw
history blame
6.23 kB
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)
# 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
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
# Check if static directory exists with index.html
static_path = Path("./static")
static_index_exists = static_path.exists() and (static_path / "index.html").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: {(static_path / 'index.html').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 static files exist, return the index.html file
if static_index_exists:
with open(static_path / "index.html") as f:
return f.read()
else:
return """
<html>
<head>
<title>PodCraft API</title>
<style>
body { font-family: Arial, sans-serif; margin: 0; padding: 0; display: flex; justify-content: center; align-items: center; height: 100vh; background-color: #f8f9fa; }
.container { max-width: 800px; padding: 2rem; background-color: white; border-radius: 0.5rem; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); }
h1 { color: #6366F1; }
pre { background-color: #f5f5f5; padding: 1rem; border-radius: 0.25rem; overflow: auto; }
</style>
</head>
<body>
<div class="container">
<h1>PodCraft API</h1>
<p>The PodCraft API is running, but the frontend static files were not found.</p>
<p>Static directory: <code>./static</code></p>
<p>Static directory exists: <code>{static_path.exists()}</code></p>
<p>If you need to access the API directly, you can use the following endpoints:</p>
<ul>
<li><code>/api/status</code> - Check API status</li>
<li><code>/docs</code> - API documentation</li>
</ul>
</div>
</body>
</html>
"""
# Mount static files
if static_index_exists:
# Use the mount approach for static assets like CSS/JS, but not for the root path
logger.info("Mounting static files at /static")
app.mount("/static", StaticFiles(directory="./static"), name="static")
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"""
<html>
<head>
<title>PodCraft - Error</title>
<style>
body {{ font-family: Arial, sans-serif; margin: 0; padding: 0; display: flex; justify-content: center; align-items: center; height: 100vh; background-color: #f8f9fa; }}
.container {{ max-width: 800px; padding: 2rem; background-color: white; border-radius: 0.5rem; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); }}
h1 {{ color: #d32f2f; }}
pre {{ background-color: #f5f5f5; padding: 1rem; border-radius: 0.25rem; overflow: auto; }}
</style>
</head>
<body>
<div class="container">
<h1>PodCraft Error</h1>
<p>An error occurred while starting the application:</p>
<pre>{str(e)}</pre>
<p>Please check your environment variables and configuration.</p>
<p>MongoDB URL format should be: <code>mongodb+srv://username:[email protected]/...</code></p>
<p>API keys should be properly formatted and valid.</p>
<p>Static directory exists: <code>{static_path.exists()}</code></p>
{f"<p>Static directory contents: <code>{os.listdir(static_path)}</code></p>" if static_path.exists() else ""}
<p>Static index exists: <code>{static_index_exists}</code></p>
</div>
</body>
</html>
"""
# Mount static files if they exist
if static_index_exists:
error_app.mount("/static", StaticFiles(directory="./static"), name="static")
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)