diff --git a/backend/src/media_library_viewer_api/workers/media_index_worker.py b/backend/src/media_library_viewer_api/workers/media_index_worker.py index 530191a..daffa83 100644 --- a/backend/src/media_library_viewer_api/workers/media_index_worker.py +++ b/backend/src/media_library_viewer_api/workers/media_index_worker.py @@ -114,27 +114,29 @@ def _resolve_jellyfin(service_id: str) -> tuple[Any, str]: 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: + # Try the configured user_id directly. It might be the internal + # Jellyfin Id (a long hash) — in that case libraries() succeeds + # without an extra users() round-trip. Only if it fails do we + # resolve it via the users API (the config field accepts usernames + # like 'admin' too, but Jellyfin's API rejects them on /Users/). + try: + client.libraries(user_id) + except Exception: + users = client.users() match = next((u for u in users if str(u.get("Name", "")) == user_id), None) if match: - user_id = match["Id"] + resolved = match["Id"] logger.info( "Resolved username '%s' to Jellyfin Id '%s'", - service.get("config", {}).get("user_id"), user_id, + resolved, ) + user_id = resolved elif users: user_id = users[0]["Id"] logger.warning( - "user_id '%s' not found; falling back to first user '%s'", + "user_id '%s' not found; falling back to first user", service.get("config", {}).get("user_id"), - user_id, ) return client, user_id