Fix: user_id 'admin' rejected by Jellyfin API (400)
The Jellyfin service config's user_id field accepts either the internal Jellyfin user ID (a long hash) or a username (e.g. 'admin'). The worker passed the raw value directly to client.libraries(user_id), but Jellyfin's API rejects usernames with a 400. Now validates the configured user_id against the Jellyfin users API: 1. If it matches a user's Id (internal hash), use it directly. 2. If it matches a user's Name (username like 'admin'), resolve the Id. 3. If no match, fall back to the first user and log a warning. 283 backend tests pass; ruff clean.
This commit is contained in:
@@ -113,6 +113,29 @@ def _resolve_jellyfin(service_id: str) -> tuple[Any, str]:
|
||||
if not users:
|
||||
raise RuntimeError("No Jellyfin users found and no user_id configured on the service")
|
||||
user_id = users[0]["Id"]
|
||||
else:
|
||||
# The config field accepts either a Jellyfin internal user ID (a long
|
||||
# hash) or a username (e.g. "admin"). Validate against the users API:
|
||||
# if the configured value doesn't match any user's Id, try matching by
|
||||
# Name, then fall back to the first user.
|
||||
users = client.users()
|
||||
valid_ids = {str(u.get("Id", "")) for u in users}
|
||||
if user_id not in valid_ids:
|
||||
match = next((u for u in users if str(u.get("Name", "")) == user_id), None)
|
||||
if match:
|
||||
user_id = match["Id"]
|
||||
logger.info(
|
||||
"Resolved username '%s' to Jellyfin Id '%s'",
|
||||
service.get("config", {}).get("user_id"),
|
||||
user_id,
|
||||
)
|
||||
elif users:
|
||||
user_id = users[0]["Id"]
|
||||
logger.warning(
|
||||
"user_id '%s' not found; falling back to first user '%s'",
|
||||
service.get("config", {}).get("user_id"),
|
||||
user_id,
|
||||
)
|
||||
return client, user_id
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user