fix: add timeout (#16)

* fix: add timeout

* review adjustments
This commit is contained in:
Nat Welch 2026-04-04 22:13:37 -04:00 committed by GitHub
parent 48c0a94a47
commit e76ed59b44
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 17 additions and 2 deletions

View file

@ -22,6 +22,12 @@ class Settings(BaseSettings):
lidarr_url: str = Field(default="http://lidarr:8686")
lidarr_api_key: str = Field(default="")
lidarr_timeout: float = Field(
default=30.0,
ge=5.0,
le=600.0,
description="HTTP read/write timeout in seconds for Lidarr API calls.",
)
jellyfin_url: str = Field(default="http://jellyfin:8096")
@ -192,6 +198,7 @@ class Settings(BaseSettings):
config_data = {
"lidarr_url": self.lidarr_url,
"lidarr_api_key": self.lidarr_api_key,
"lidarr_timeout": self.lidarr_timeout,
"jellyfin_url": self.jellyfin_url,
"contact_email": self.contact_email,
"quality_profile_id": self.quality_profile_id,
@ -221,6 +228,7 @@ class Settings(BaseSettings):
config_data.update({
"lidarr_url": self.lidarr_url,
"lidarr_api_key": self.lidarr_api_key,
"lidarr_timeout": self.lidarr_timeout,
"jellyfin_url": self.jellyfin_url,
"contact_email": self.contact_email,
"quality_profile_id": self.quality_profile_id,

View file

@ -49,7 +49,7 @@ class LidarrBase:
@property
def _base_url(self) -> str:
return self._settings.lidarr_url
return self._settings.lidarr_url.rstrip("/")
def is_configured(self) -> bool:
return bool(self._settings.lidarr_api_key)
@ -78,7 +78,13 @@ class LidarrBase:
if not self.is_configured():
raise ExternalServiceError("Lidarr is not configured (no API key)")
url = f"{self._base_url}{endpoint}"
path = endpoint.lstrip("/")
url = f"{self._base_url}/{path}" if path else self._base_url
timeout = httpx.Timeout(
self._settings.lidarr_timeout,
connect=self._settings.http_connect_timeout,
)
try:
response = await self._client.request(
@ -87,6 +93,7 @@ class LidarrBase:
headers=self._get_headers(),
params=params,
json=json_data,
timeout=timeout,
)
if method == "DELETE" and response.status_code in (200, 202, 204):