From 92c8d42c4d500151af7295815f9e6aa955737e30 Mon Sep 17 00:00:00 2001 From: Lukas Date: Fri, 23 Jan 2026 14:45:40 +0100 Subject: [PATCH] fix: handle session closure during concurrent TMDB requests - Re-ensure session before each request attempt to handle race conditions - Add AttributeError handling for None session - Detect 'Connector is closed' errors and recreate session - Fixes AttributeError: 'NoneType' object has no attribute 'get' during concurrent NFO processing --- src/core/services/tmdb_client.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/core/services/tmdb_client.py b/src/core/services/tmdb_client.py index 925e59f..d8c4a59 100644 --- a/src/core/services/tmdb_client.py +++ b/src/core/services/tmdb_client.py @@ -115,6 +115,12 @@ class TMDBClient: for attempt in range(max_retries): try: + # Re-ensure session before each attempt in case it was closed + await self._ensure_session() + + if self.session is None: + raise TMDBAPIError("Session is not available") + logger.debug(f"TMDB API request: {endpoint} (attempt {attempt + 1})") async with self.session.get(url, params=params, timeout=aiohttp.ClientTimeout(total=30)) as resp: if resp.status == 401: @@ -133,8 +139,14 @@ class TMDBClient: self._cache[cache_key] = data return data - except aiohttp.ClientError as e: + except (aiohttp.ClientError, AttributeError) as e: last_error = e + # If connector/session was closed, try to recreate it + if "Connector is closed" in str(e) or isinstance(e, AttributeError): + logger.warning(f"Session issue detected, recreating session: {e}") + self.session = None + await self._ensure_session() + if attempt < max_retries - 1: logger.warning(f"Request failed (attempt {attempt + 1}): {e}, retrying in {delay}s") await asyncio.sleep(delay)