File size: 3,835 Bytes
1bcce96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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

try:
    # Set up CORS headers to allow frontend to access backend
    from backend.app.main import app
    from fastapi.middleware.cors import CORSMiddleware

    app.add_middleware(
        CORSMiddleware,
        allow_origins=["*"],
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

    # Serve static files from the frontend build directory
    from fastapi.staticfiles import StaticFiles

    # Check if static directory exists with index.html
    static_path = Path("./static")
    if static_path.exists() and (static_path / "index.html").exists():
        app.mount("/", StaticFiles(directory="./static", html=True), name="static")

    # 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, host=host, port=port)

except Exception as e:
    # If there's an error, create a minimal FastAPI app to show the error
    from fastapi import FastAPI
    from fastapi.responses import HTMLResponse
    from fastapi.staticfiles import StaticFiles
    
    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>
                </div>
            </body>
        </html>
        """
    
    # Check if static directory exists with index.html
    static_path = Path("./static")
    if static_path.exists() and (static_path / "index.html").exists():
        error_app.mount("/static", StaticFiles(directory="./static"), name="static")
    
    if __name__ == "__main__":
        import uvicorn
        
        port = int(os.environ.get("PORT", 7860))
        host = os.environ.get("HOST", "0.0.0.0")
        
        logger.error(f"Application failed to start normally. Starting error app on {host}:{port}")
        logger.error(f"Error: {str(e)}")
        
        uvicorn.run(error_app, host=host, port=port)