From 109d3c8ac9b10c2103fe7f1faa29d9ca8b39d4b6 Mon Sep 17 00:00:00 2001 From: Lukas Date: Sat, 6 Jun 2026 21:33:41 +0200 Subject: [PATCH] fix: streamline initialization flow after setup - Remove nfo_scan and media_scan from loading page steps (no longer shown in UI) - Remove perform_nfo_scan_if_needed calls from fastapi_app and auth.py - Always redirect to /setup/unresolved after initialization completes instead of conditionally checking for unresolved folders - Fix middleware to allow access to /loading page - let it handle its own redirect flow via WebSocket events This ensures users always reach the unresolved folders page after initial setup to manually configure any unmatched anime series. --- src/server/api/auth.py | 8 +--- src/server/fastapi_app.py | 4 -- src/server/middleware/setup_redirect.py | 19 ++-------- src/server/web/templates/loading.html | 49 +++---------------------- 4 files changed, 10 insertions(+), 70 deletions(-) diff --git a/src/server/api/auth.py b/src/server/api/auth.py index 4bdc87a..b6ba3ba 100644 --- a/src/server/api/auth.py +++ b/src/server/api/auth.py @@ -147,10 +147,7 @@ async def setup_auth(req: SetupRequest): # Trigger initialization in background task import asyncio - from src.server.services.initialization_service import ( - perform_initial_setup, - perform_nfo_scan_if_needed, - ) + from src.server.services.initialization_service import perform_initial_setup from src.server.services.progress_service import get_progress_service progress_service = get_progress_service() @@ -161,9 +158,6 @@ async def setup_auth(req: SetupRequest): # Perform the initial series sync and mark as completed await perform_initial_setup(progress_service) - # Perform NFO scan if configured - await perform_nfo_scan_if_needed(progress_service) - # Start scheduler if anime_directory is now set try: from src.server.services.scheduler.scheduler_service import ( diff --git a/src/server/fastapi_app.py b/src/server/fastapi_app.py index 190aea5..e738660 100644 --- a/src/server/fastapi_app.py +++ b/src/server/fastapi_app.py @@ -344,7 +344,6 @@ async def lifespan(_application: FastAPI): from src.server.services.initialization_service import ( perform_initial_setup, perform_media_scan_if_needed, - perform_nfo_scan_if_needed, ) try: @@ -373,9 +372,6 @@ async def lifespan(_application: FastAPI): "exist yet): %s", e ) - # Run NFO scan only on first run (if configured) - await perform_nfo_scan_if_needed() - # Initialize download service try: from src.server.utils.dependencies import get_download_service diff --git a/src/server/middleware/setup_redirect.py b/src/server/middleware/setup_redirect.py index 9a0b4da..b24173e 100644 --- a/src/server/middleware/setup_redirect.py +++ b/src/server/middleware/setup_redirect.py @@ -127,21 +127,10 @@ class SetupRedirectMiddleware(BaseHTTPMiddleware): # Otherwise redirect to login return RedirectResponse(url="/login", status_code=302) elif path == "/loading": - # Check if initialization is complete - try: - from src.server.database.connection import get_db_session - from src.server.database.system_settings_service import ( - SystemSettingsService, - ) - - async with get_db_session() as db: - is_complete = await SystemSettingsService.is_initial_scan_completed(db) - if is_complete: - # Initialization complete, redirect to login - return RedirectResponse(url="/login", status_code=302) - except Exception: - # If we can't check, allow access to loading page - pass + # Always allow access to loading page - it handles its own + # redirect flow via WebSocket events (initialization_complete + # event triggers redirect to /setup/unresolved) + pass # Skip setup check for exempt paths if self._is_path_exempt(path): diff --git a/src/server/web/templates/loading.html b/src/server/web/templates/loading.html index edb8567..6acaae3 100644 --- a/src/server/web/templates/loading.html +++ b/src/server/web/templates/loading.html @@ -281,15 +281,11 @@ let isComplete = false; const stepOrder = [ - 'series_sync', - 'nfo_scan', - 'media_scan' + 'series_sync' ]; const stepTitles = { - 'series_sync': 'Syncing Series Database', - 'nfo_scan': 'Processing NFO Metadata', - 'media_scan': 'Scanning Media Files' + 'series_sync': 'Syncing Series Database' }; function connectWebSocket() { @@ -479,44 +475,9 @@ } async function checkUnresolvedAndProceed() { - try { - const token = localStorage.getItem('auth_token'); - console.log('Checking unresolved folders, token exists:', !!token); - if (!token) { - // No token, go to login - console.log('No auth token found, showing completion'); - document.getElementById('completionMessage').style.display = 'block'; - return; - } - - const res = await fetch('/api/setup/unresolved', { - headers: { 'Authorization': `Bearer ${token}` } - }); - console.log('Unresolved API response status:', res.status); - - if (res.ok) { - const unresolved = await res.json(); - console.log('Unresolved folders:', unresolved); - if (unresolved && unresolved.length > 0) { - // Has unresolved folders - redirect to unresolved page - console.log('Redirecting to /setup/unresolved'); - window.location.href = '/setup/unresolved'; - return; - } - } else if (res.status === 401) { - // Token invalid, clear it - localStorage.removeItem('auth_token'); - console.log('Token invalid, showing completion'); - document.getElementById('completionMessage').style.display = 'block'; - return; - } - } catch (e) { - console.error('Error checking unresolved folders:', e); - } - - // No unresolved folders or error - show completion message - console.log('No unresolved folders or error, showing completion'); - document.getElementById('completionMessage').style.display = 'block'; + // Always redirect to /setup/unresolved after initialization + // so users can manually enter unresolved animes + window.location.href = '/setup/unresolved'; } function showError(message) {