diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md index b37a12c..490bbc2 100644 --- a/docs/CONFIGURATION.md +++ b/docs/CONFIGURATION.md @@ -217,6 +217,7 @@ Source: [src/server/models/config.py](../src/server/models/config.py#L15-L24) - `auto_create` creates NFO files during the download process - `update_on_scan` refreshes metadata when scanning existing anime - Image downloads require valid `tmdb_api_key` +- `TMDB_API_KEY` environment variable is optional when `nfo.tmdb_api_key` is configured in `data/config.json` - Larger image sizes (`w780`, `original`) consume more storage space Source: [src/server/models/config.py](../src/server/models/config.py#L109-L132) diff --git a/docs/tasks.md b/docs/tasks.md index e1140b2..2d20157 100644 --- a/docs/tasks.md +++ b/docs/tasks.md @@ -54,6 +54,8 @@ Up to 5 background workers share one `NFOService`/`TMDBClient` instance. The `as ## Task 2 — Guard NFOService init in SeriesApp on factory fallback, not just env var +- [x] Completed + ### Where `src/core/SeriesApp.py` — `__init__` method (~line 175) diff --git a/src/core/SeriesApp.py b/src/core/SeriesApp.py index 96ba03d..c18b078 100644 --- a/src/core/SeriesApp.py +++ b/src/core/SeriesApp.py @@ -171,23 +171,26 @@ class SeriesApp: # Initialize empty list - series loaded later via load_series_from_list() # No need to call _init_list_sync() anymore - # Initialize NFO service if TMDB API key is configured + # Initialize NFO service if a TMDB API key is configured self.nfo_service: Optional[NFOService] = None - if settings.tmdb_api_key: - try: - from src.core.services.nfo_factory import get_nfo_factory - factory = get_nfo_factory() - self.nfo_service = factory.create() - logger.info("NFO service initialized successfully") - except (ValueError, Exception) as e: # pylint: disable=broad-except - logger.warning( - "Failed to initialize NFO service: %s", str(e) - ) - self.nfo_service = None + try: + from src.core.services.nfo_factory import get_nfo_factory + + factory = get_nfo_factory() + self.nfo_service = factory.create() + logger.info("NFO service initialized successfully") + except ValueError: + logger.info( + "NFO service not available — TMDB API key not configured" + ) + self.nfo_service = None + except Exception as e: # pylint: disable=broad-except + logger.warning("Failed to initialize NFO service: %s", str(e)) + self.nfo_service = None logger.info( "SeriesApp initialized for directory: %s", - directory_to_search + directory_to_search, ) @property diff --git a/tests/unit/test_series_app.py b/tests/unit/test_series_app.py index f5fab8e..6ca463e 100644 --- a/tests/unit/test_series_app.py +++ b/tests/unit/test_series_app.py @@ -49,6 +49,33 @@ class TestSeriesAppInitialization: with pytest.raises(RuntimeError): SeriesApp(test_dir) + @patch('src.core.SeriesApp.Loaders') + @patch('src.core.SeriesApp.SerieScanner') + @patch('src.core.SeriesApp.SerieList') + @patch('src.core.services.nfo_factory.get_nfo_factory') + @patch('src.core.SeriesApp.settings') + def test_init_uses_config_fallback_for_nfo_service( + self, + mock_settings, + mock_get_factory, + mock_serie_list, + mock_scanner, + mock_loaders, + ): + """SeriesApp should initialize NFO via config.json even when TMDB_API_KEY is unset.""" + test_dir = "/test/anime" + mock_settings.tmdb_api_key = None + + mock_factory = Mock() + mock_service = Mock() + mock_factory.create.return_value = mock_service + mock_get_factory.return_value = mock_factory + + app = SeriesApp(test_dir) + + assert app.nfo_service is mock_service + mock_get_factory.assert_called_once() + class TestSeriesAppSearch: """Test search functionality."""