| | from fastapi import FastAPI, HTTPException |
| | from pydantic import BaseModel |
| | import os |
| | import asyncio |
| | from smart_searchV2 import SmartSearch |
| | |
| |
|
| | |
| |
|
| | app = FastAPI() |
| | LOAD_BALANCER_URL = os.getenv("LOAD_BALANCER_URL") |
| |
|
| | |
| | if not LOAD_BALANCER_URL or "://" not in LOAD_BALANCER_URL: |
| | raise ValueError("Invalid LOAD_BALANCER_URL format. Must include protocol (http/https)") |
| |
|
| | search_system = SmartSearch( |
| | films_url=f'{LOAD_BALANCER_URL}/api/get/movie/all', |
| | tv_series_url=f'{LOAD_BALANCER_URL}/api/get/series/all' |
| | ) |
| | search_system_lock = asyncio.Lock() |
| |
|
| | @app.on_event("startup") |
| | async def startup_event(): |
| | |
| | async with search_system_lock: |
| | await search_system.initialize() |
| | |
| | asyncio.create_task(update_data_periodically()) |
| |
|
| | async def update_data_periodically(): |
| | while True: |
| | try: |
| | async with search_system_lock: |
| | await search_system.update_data() |
| | except Exception as e: |
| | print(f"Update failed: {e}. Retrying...") |
| | await asyncio.sleep(60) |
| | else: |
| | await asyncio.sleep(120) |
| |
|
| | class Query(BaseModel): |
| | query: str |
| |
|
| | @app.get("/") |
| | async def index(): |
| | return {"status": "running"} |
| |
|
| | @app.post("/api/search") |
| | async def search(query: Query): |
| | if not query.query.strip(): |
| | raise HTTPException(status_code=400, detail="Empty query") |
| | |
| | async with search_system_lock: |
| | if not search_system.is_initialized: |
| | raise HTTPException(status_code=503, detail="Search system initializing") |
| | |
| | results = await search_system.search(query.query.strip()) |
| | |
| | return results |
| |
|
| | @app.get("/health") |
| | async def health_check(): |
| | return { |
| | "initialized": search_system.is_initialized, |
| | "film_count": len(search_system.data['films']), |
| | "series_count": len(search_system.data['series']) |
| | } |
| |
|
| | @app.get("/api/data") |
| | async def get_data(): |
| | async with search_system_lock: |
| | if not search_system.is_initialized: |
| | raise HTTPException(status_code=503, detail="Search system is not initialized yet.") |
| | |
| | return {"data":search_system.data} |
| |
|