File size: 4,889 Bytes
1bcce96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2251ba3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1bcce96
 
 
 
 
1700fb6
 
 
8f0bc94
 
 
1700fb6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f0bc94
2251ba3
8f0bc94
 
 
2251ba3
8f0bc94
1bcce96
1700fb6
 
 
 
 
 
 
 
8f0bc94
 
1bcce96
 
 
 
 
 
 
8f0bc94
1700fb6
 
 
 
8f0bc94
 
1700fb6
1bcce96
 
1700fb6
 
1bcce96
1700fb6
 
 
 
 
 
 
1bcce96
1700fb6
 
8f0bc94
 
 
 
 
 
 
 
 
 
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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("""<!DOCTYPE html>
<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. You can access the API at <a href="/docs">/docs</a>.</p>
        <p>API Status: <a href="/api/status">/api/status</a></p>
    </div>
</body>
</html>""")

# 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 our own FastAPI app first
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import HTMLResponse, JSONResponse, FileResponse, Response
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware

# Create our own app that will handle frontend routes
frontend_app = FastAPI(title="PodCraft Frontend")

# Add CORS middleware
frontend_app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Mount static directory
if static_path.exists():
    frontend_app.mount("/static", StaticFiles(directory=str(static_path)), name="static")

# Root route handler
@frontend_app.get("/", response_class=HTMLResponse)
async def read_root():
    logger.info(f"Serving index.html from {index_path}")
    # Read the file contents directly
    if index_path.exists():
        with open(index_path, "r") as f:
            content = f.read()
            return HTMLResponse(content=content)
    else:
        return HTMLResponse(content="Index file not found", status_code=404)

# API status endpoint
@frontend_app.get("/api/status")
async def status():
    return {"status": "ok", "message": "PodCraft API is running"}

# 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 backend app
    from backend.app.main import app as backend_app
    
    # Now create a merged app that prioritizes frontend routes
    app = FastAPI(title="PodCraft")
    
    # Add frontend app routes to the main app
    app.mount("/", frontend_app)
    
    # Add CORS middleware
    app.add_middleware(
        CORSMiddleware,
        allow_origins=["*"],
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )
    
    # Forward specific backend API routes
    @app.get("/api/{path:path}")
    async def api_route(request: Request, path: str):
        return await backend_app.handle_request(request)
    
    app_to_run = app
    logger.info("Using merged application (frontend + backend)")

except Exception as e:
    # If there's an error, use just the frontend app
    logger.error(f"Error initializing backend app: {str(e)}")
    
    # Add error handler to frontend app
    @frontend_app.get("/api/{path:path}")
    async def api_error(path: str):
        return {
            "error": "Backend API not available",
            "message": str(e)
        }
    
    app_to_run = frontend_app
    logger.info("Using frontend application only due to backend error")

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