From 759cd09ded1e85bce7f194592610ab1a1bff1ff5 Mon Sep 17 00:00:00 2001 From: Lukas Date: Sun, 22 Feb 2026 12:29:17 +0100 Subject: [PATCH] fix: isolate startup steps so repair scan always runs --- src/server/fastapi_app.py | 80 ++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/src/server/fastapi_app.py b/src/server/fastapi_app.py index bd0cdd0..3083fde 100644 --- a/src/server/fastapi_app.py +++ b/src/server/fastapi_app.py @@ -232,46 +232,58 @@ async def lifespan(_application: FastAPI): if settings.anime_directory: # Perform initial setup if needed await perform_initial_setup() - - # Get anime service for later use - from src.server.utils.dependencies import get_anime_service - anime_service = get_anime_service() - - # Always load series from database into memory on startup - logger.info("Loading series from database into memory...") - await anime_service._load_series_from_db() - logger.info("Series loaded from database into memory") - + + # Get anime service and load series — isolated so a missing + # directory doesn't abort the rest of the startup sequence + try: + from src.server.utils.dependencies import get_anime_service + anime_service = get_anime_service() + + # Always load series from database into memory on startup + logger.info("Loading series from database into memory...") + await anime_service._load_series_from_db() + logger.info("Series loaded from database into memory") + except Exception as e: + logger.warning( + "Could not load series into memory (directory may not " + "exist yet): %s", e + ) + # Run NFO scan only on first run (if configured) await perform_nfo_scan_if_needed() - - # Now initialize download service (will use data from database) - from src.server.utils.dependencies import get_download_service - download_service = get_download_service() - await download_service.initialize() - initialized['services'] = True - logger.info("Download service initialized and queue restored") - - # Initialize background loader service - from src.server.utils.dependencies import get_background_loader_service - - background_loader = get_background_loader_service() - await background_loader.start() - initialized['background_loader'] = True - logger.info("Background loader service started") - - # Initialize and start scheduler service - from src.server.services.scheduler_service import get_scheduler_service - - scheduler_service = get_scheduler_service() + + # Initialize download service try: + from src.server.utils.dependencies import get_download_service + download_service = get_download_service() + await download_service.initialize() + initialized['services'] = True + logger.info("Download service initialized and queue restored") + except Exception as e: + logger.warning("Failed to initialize download service: %s", e) + + # Initialize background loader service + background_loader = None + try: + from src.server.utils.dependencies import get_background_loader_service + background_loader = get_background_loader_service() + await background_loader.start() + initialized['background_loader'] = True + logger.info("Background loader service started") + except Exception as e: + logger.warning("Failed to start background loader service: %s", e) + + # Initialize and start scheduler service + try: + from src.server.services.scheduler_service import get_scheduler_service + scheduler_service = get_scheduler_service() await scheduler_service.start() initialized['scheduler'] = True logger.info("Scheduler service started") except Exception as e: logger.warning("Failed to start scheduler service: %s", e) # Continue - scheduler is optional - + # Run media scan only on first run await perform_media_scan_if_needed(background_loader) @@ -286,10 +298,8 @@ async def lifespan(_application: FastAPI): except (OSError, RuntimeError, ValueError) as e: logger.warning("Failed to initialize services: %s", e) # Continue startup - services can be initialized later - except Exception as e: # includes HTTPException from get_anime_service - logger.warning( - "Failed to initialize services (anime directory may not exist): %s", e - ) + except Exception as e: + logger.warning("Unexpected error during startup initialization: %s", e) # Continue startup - services can be configured/initialized later logger.info("FastAPI application started successfully")