diff --git a/data/.fuse_hidden000049a200000009 b/data/.fuse_hidden000049a200000009 new file mode 100644 index 0000000..f2c6f6d Binary files /dev/null and b/data/.fuse_hidden000049a200000009 differ diff --git a/data/.fuse_hidden000049c60000000a b/data/.fuse_hidden000049c60000000a new file mode 100644 index 0000000..b26e790 Binary files /dev/null and b/data/.fuse_hidden000049c60000000a differ diff --git a/data/.fuse_hidden000049c700000008 b/data/.fuse_hidden000049c700000008 new file mode 100644 index 0000000..753bd24 Binary files /dev/null and b/data/.fuse_hidden000049c700000008 differ diff --git a/docs/instructions.md b/docs/instructions.md index 978e58b..35d95a1 100644 --- a/docs/instructions.md +++ b/docs/instructions.md @@ -122,33 +122,30 @@ For each task completed: ### Completed Tasks: 1. ✅ **NFO/Artwork Loading Isolation** (Completed: 2026-01-23) - - Task: Ensure during anime add, NFO, logo, art, etc. is loaded only for the specific anime being added - - Status: VERIFIED - Implementation is correct - + - Task: Ensure during anime add, NFO, logo, art, etc. is loaded only for the specific anime being added + - Status: VERIFIED - Implementation is correct 2. ✅ **Setup Redirect Flow** (Completed: 2026-01-23) - - Task: Implement redirect flow: setup -> loading -> login when user completes setup - - Changes: - - Added /loading to exempt paths in setup_redirect middleware - - Setup page redirects to loading with initialization in background - - Loading page connects to WebSocket for real-time progress - - After completion, loading redirects to login - + - Task: Implement redirect flow: setup -> loading -> login when user completes setup + - Changes: + - Added /loading to exempt paths in setup_redirect middleware + - Setup page redirects to loading with initialization in background + - Loading page connects to WebSocket for real-time progress + - After completion, loading redirects to login 3. ✅ **Close Setup and Loading Pages** (Completed: 2026-01-23) - - Task: Make setup and loading pages unavailable after completion to prevent re-access - - Changes: - - Check if setup is complete before allowing access to /setup - - Redirect to login if accessing /setup after completion - - Check if initialization is complete before allowing access to /loading - - Redirect to login if accessing /loading after initialization complete - + - Task: Make setup and loading pages unavailable after completion to prevent re-access + - Changes: + - Check if setup is complete before allowing access to /setup + - Redirect to login if accessing /setup after completion + - Check if initialization is complete before allowing access to /loading + - Redirect to login if accessing /loading after initialization complete 4. ✅ **Fix Loading Page WebSocket Auth** (Completed: 2026-01-23) - - Task: Fix 403 Forbidden error on WebSocket connection - - Issue: Loading page was connecting to /ws/progress (doesn't exist) - - Changes: - - Changed WebSocket URL from /ws/progress to /ws/connect (correct endpoint) - - Added /ws/connect to exempt paths in auth middleware - - Subscribe to 'system' room after connection for progress updates - - Fixed message data handling to match WebSocket format + - Task: Fix 403 Forbidden error on WebSocket connection + - Issue: Loading page was connecting to /ws/progress (doesn't exist) + - Changes: + - Changed WebSocket URL from /ws/progress to /ws/connect (correct endpoint) + - Added /ws/connect to exempt paths in auth middleware + - Subscribe to 'system' room after connection for progress updates + - Fixed message data handling to match WebSocket format ### Active Tasks: diff --git a/docs/key b/docs/key index 1435708..f5104a3 100644 --- a/docs/key +++ b/docs/key @@ -1,3 +1,4 @@ API key : 299ae8f630a31bda814263c551361448 -/mnt/server/serien/Serien/ \ No newline at end of file +/mnt/server/serien/Serien/ + diff --git a/docs/tasks/nfo_loading_isolation_verification.md b/docs/tasks/nfo_loading_isolation_verification.md index 9f91717..9c4921f 100644 --- a/docs/tasks/nfo_loading_isolation_verification.md +++ b/docs/tasks/nfo_loading_isolation_verification.md @@ -18,14 +18,14 @@ This document verifies that the anime add functionality correctly loads NFO, log When a new anime is added via `POST /api/anime/add`: 1. **API Endpoint** ([anime.py:694-920](../src/server/api/anime.py#L694-L920)) - - Validates input and extracts series key - - Creates database entry with `loading_status="pending"` - - Adds to in-memory cache - - **Queues background loading task** for the specific anime + - Validates input and extracts series key + - Creates database entry with `loading_status="pending"` + - Adds to in-memory cache + - **Queues background loading task** for the specific anime 2. **Background Loading** ([background_loader_service.py](../src/server/services/background_loader_service.py)) - - Processes one `SeriesLoadingTask` at a time - - Each task contains **only one anime's metadata**: key, folder, name, year + - Processes one `SeriesLoadingTask` at a time + - Each task contains **only one anime's metadata**: key, folder, name, year ### 2. NFO/Artwork Loading Process @@ -34,7 +34,7 @@ The `_load_nfo_and_images()` method ([background_loader_service.py:454-544](../s ```python async def _load_nfo_and_images(self, task: SeriesLoadingTask, db: Any) -> None: """Load NFO file and images for a series by reusing NFOService. - + Args: task: The loading task (contains data for ONE anime only) db: Database session @@ -43,7 +43,7 @@ async def _load_nfo_and_images(self, task: SeriesLoadingTask, db: Any) -> None: if self.series_app.nfo_service.has_nfo(task.folder): # Skip if exists return - + # Create NFO with THIS anime's specific data nfo_path = await self.series_app.nfo_service.create_tvshow_nfo( serie_name=task.name, # ✅ Only this anime's name @@ -58,21 +58,25 @@ async def _load_nfo_and_images(self, task: SeriesLoadingTask, db: Any) -> None: ### 3. Key Implementation Details #### ✅ Isolated Task Processing + - Each `SeriesLoadingTask` contains data for **exactly one anime** - Tasks are processed sequentially from the queue - No cross-contamination between anime #### ✅ Targeted NFO Creation + - `NFOService.create_tvshow_nfo()` receives parameters for **one anime only** - Downloads poster, logo, fanart to **that anime's folder only** - TMDB API calls are made for **that specific anime's name/year** #### ✅ No Global Scanning + - `SerieList.load_series()` only **checks** for existing files - It does **not** download or create any new files - Used only for initial library scanning, not during anime add #### ✅ Isolated Episode Scanning + - `_load_episodes()` uses `_find_series_directory()` and `_scan_series_episodes()` - Scans **only the specific anime's directory**, not the entire library - No impact on other anime @@ -80,15 +84,19 @@ async def _load_nfo_and_images(self, task: SeriesLoadingTask, db: Any) -> None: ## Verification ### Code Review + ✅ Reviewed implementation in: + - `src/server/services/background_loader_service.py` (lines 454-544) - `src/server/api/anime.py` (lines 694-920) - `src/core/entities/SerieList.py` (lines 149-250) ### Test Created + ✅ Created comprehensive test: `tests/integration/test_anime_add_nfo_isolation.py` The test verifies: + 1. NFO service called exactly once for new anime 2. Correct parameters passed (name, folder, year) 3. Existing anime not affected @@ -101,6 +109,7 @@ Note: Test requires database mocking to run fully, but code analysis confirms co **The current implementation is CORRECT and COMPLETE.** When adding a new anime: + - ✅ NFO is created only for that specific anime - ✅ Logo is downloaded only to that anime's folder - ✅ Artwork (poster, fanart) is downloaded only to that anime's folder diff --git a/src/server/middleware/setup_redirect.py b/src/server/middleware/setup_redirect.py index d0ddb4b..be52057 100644 --- a/src/server/middleware/setup_redirect.py +++ b/src/server/middleware/setup_redirect.py @@ -129,7 +129,9 @@ class SetupRedirectMiddleware(BaseHTTPMiddleware): # Check if initialization is complete try: from src.server.database.connection import get_db_session - from src.server.database.system_settings_service import SystemSettingsService + 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) diff --git a/src/server/web/templates/loading.html b/src/server/web/templates/loading.html index e901978..1721c47 100644 --- a/src/server/web/templates/loading.html +++ b/src/server/web/templates/loading.html @@ -305,7 +305,9 @@ // Subscribe to system room for progress updates ws.send(JSON.stringify({ action: 'join', - room: 'system' + data: { + room: 'system' + } })); };