From 4b835a24395c1a4e7fd9901586698bad724543ff Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 9 Jun 2026 18:39:36 +0200 Subject: [PATCH] fix(scheduler): skip rescan during initial setup when anime directory not configured Prevent scheduler from triggering immediate rescan when: - No previous scan recorded AND initial setup not yet completed - Anime directory doesn't exist during initial sync The setup flow will trigger rescan when ready. Also adds graceful handling when anime directory is missing during data file sync. Fixes: 503 error on setup when scheduler triggers rescan before anime directory is configured --- src/server/services/initialization_service.py | 14 ++++++++++++++ src/server/services/scheduler/scheduler_service.py | 10 ++++++++++ tests/unit/test_initialization_service.py | 10 ++++++++-- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/server/services/initialization_service.py b/src/server/services/initialization_service.py index 5bb1fd8..840e9c7 100644 --- a/src/server/services/initialization_service.py +++ b/src/server/services/initialization_service.py @@ -215,6 +215,20 @@ async def _sync_anime_folders(progress_service=None) -> int: """ logger.info("Performing initial anime folder scan...") + # Check if anime directory exists before attempting sync + if not settings.anime_directory or not os.path.isdir(settings.anime_directory): + logger.info( + "Anime directory not configured or does not exist, skipping data file sync" + ) + if progress_service: + await progress_service.update_progress( + progress_id="series_sync", + current=100, + message="No anime directory configured, skipping data file sync", + metadata={"step_id": "series_sync"} + ) + return 0 + if progress_service: await progress_service.update_progress( progress_id="series_sync", diff --git a/src/server/services/scheduler/scheduler_service.py b/src/server/services/scheduler/scheduler_service.py index 241ed33..0d03e87 100644 --- a/src/server/services/scheduler/scheduler_service.py +++ b/src/server/services/scheduler/scheduler_service.py @@ -323,8 +323,18 @@ class SchedulerService: async with get_db_session() as db: settings = await SystemSettingsService.get_or_create(db) last_scan = settings.last_scan_timestamp + initial_scan_done = settings.initial_scan_completed if last_scan is None: + # No previous scan recorded + if not initial_scan_done: + # Initial setup not yet completed - skip rescan + # The setup flow will trigger rescan when ready + logger.info( + "No previous scan recorded and initial setup not yet " + "completed — skipping immediate rescan" + ) + return # Never scanned before — trigger immediately logger.info("No previous scan recorded — triggering immediate rescan") await self._perform_rescan() diff --git a/tests/unit/test_initialization_service.py b/tests/unit/test_initialization_service.py index 7276c91..6194adb 100644 --- a/tests/unit/test_initialization_service.py +++ b/tests/unit/test_initialization_service.py @@ -160,8 +160,11 @@ class TestSyncAnimeFolders: @pytest.mark.asyncio async def test_sync_anime_folders_without_progress(self): """Test syncing anime folders without progress service.""" - with patch('src.server.services.initialization_service.sync_legacy_series_to_db', + with patch('src.server.services.initialization_service.settings') as mock_settings, \ + patch('src.server.services.initialization_service.os.path.isdir', return_value=True), \ + patch('src.server.services.initialization_service.sync_legacy_series_to_db', new_callable=AsyncMock, return_value=42) as mock_sync: + mock_settings.anime_directory = "/path/to/anime" result = await _sync_anime_folders() assert result == 42 @@ -172,8 +175,11 @@ class TestSyncAnimeFolders: """Test syncing anime folders with progress updates.""" mock_progress = AsyncMock() - with patch('src.server.services.initialization_service.sync_legacy_series_to_db', + with patch('src.server.services.initialization_service.settings') as mock_settings, \ + patch('src.server.services.initialization_service.os.path.isdir', return_value=True), \ + patch('src.server.services.initialization_service.sync_legacy_series_to_db', new_callable=AsyncMock, return_value=10) as mock_sync: + mock_settings.anime_directory = "/path/to/anime" result = await _sync_anime_folders(progress_service=mock_progress) assert result == 10