Files
media-map/backend/main.py
Danilo Reyes 2b1a92fb49
Some checks failed
Test Suite / test (push) Has been cancelled
Add new API endpoints for media retrieval by country and enhance configuration
- Introduced `/api/tmdb` and `/api/collection/missing-locations` endpoints to the backend for improved media management.
- Added a new `get_media_by_country` function in the collection API to fetch media items based on country codes.
- Updated configuration to allow overriding *arr base URLs via environment variables for better flexibility.
- Enhanced frontend with a new `MissingLocations` component and integrated it into the routing structure.
- Improved the `CollectionMap` component to handle country selection and display media items accordingly.
- Added testing dependencies in `requirements.txt` and updated frontend configuration for testing support.
2025-12-28 22:35:06 -06:00

77 lines
2.3 KiB
Python

"""
Movie Map Backend - FastAPI application
"""
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from pathlib import Path
import os
import logging
from contextlib import asynccontextmanager
from app.api import collection, watched, pins, admin, tmdb, missing_locations
from app.core.config import settings
from app.core.database import init_db, close_db
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Startup and shutdown events"""
# Startup
logger.info("Initializing database connection...")
await init_db()
yield
# Shutdown
logger.info("Closing database connection...")
await close_db()
app = FastAPI(title="Movie Map API", version="1.0.0", lifespan=lifespan)
# CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # In production, restrict this
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# API routes
app.include_router(collection.router, prefix="/api/collection", tags=["collection"])
app.include_router(watched.router, prefix="/api/watched", tags=["watched"])
app.include_router(pins.router, prefix="/api/pins", tags=["pins"])
app.include_router(admin.router, prefix="/admin", tags=["admin"])
app.include_router(tmdb.router, prefix="/api/tmdb", tags=["tmdb"])
app.include_router(missing_locations.router, prefix="/api/collection/missing-locations", tags=["missing-locations"])
# Serve frontend static files
# Check multiple possible locations (dev, Nix build, etc.)
frontend_paths = [
Path(__file__).parent.parent / "frontend" / "dist", # Dev mode
Path(__file__).parent / "frontend" / "dist", # Nix build
Path(__file__).parent / "frontend", # Fallback
]
frontend_path = None
for path in frontend_paths:
if path.exists():
frontend_path = path
break
if frontend_path:
logger.info(f"Serving frontend from {frontend_path}")
app.mount("/", StaticFiles(directory=str(frontend_path), html=True), name="static")
else:
logger.warning("Frontend static files not found - API only mode")
@app.get("/api/health")
async def health():
"""Health check endpoint"""
return {"status": "ok"}