FIX: Audiobookshelf - use non admin user endpoint + wrong login credentials (#1883)
authorFabian Munkes <105975993+fmunkes@users.noreply.github.com>
Fri, 17 Jan 2025 16:11:13 +0000 (17:11 +0100)
committerGitHub <noreply@github.com>
Fri, 17 Jan 2025 16:11:13 +0000 (17:11 +0100)
music_assistant/providers/audiobookshelf/__init__.py
music_assistant/providers/audiobookshelf/abs_client.py
music_assistant/providers/audiobookshelf/manifest.json

index 8b5592843c14466cff6cd1283fb5b758c2491aa9..9b689e06f3ab3dc302d86fb847bae38702b5ace2 100644 (file)
@@ -18,7 +18,7 @@ from music_assistant_models.enums import (
     ProviderFeature,
     StreamType,
 )
-from music_assistant_models.errors import MediaNotFoundError
+from music_assistant_models.errors import LoginFailed, MediaNotFoundError
 from music_assistant_models.media_items import (
     Audiobook,
     AudioFormat,
@@ -125,13 +125,18 @@ class Audiobookshelf(MusicProvider):
     async def handle_async_init(self) -> None:
         """Pass config values to client and initialize."""
         self._client = ABSClient()
-        await self._client.init(
-            session=self.mass.http_session,
-            base_url=str(self.config.get_value(CONF_URL)),
-            username=str(self.config.get_value(CONF_USERNAME)),
-            password=str(self.config.get_value(CONF_PASSWORD)),
-            check_ssl=bool(self.config.get_value(CONF_VERIFY_SSL)),
-        )
+        base_url = str(self.config.get_value(CONF_URL))
+        try:
+            await self._client.init(
+                session=self.mass.http_session,
+                base_url=base_url,
+                username=str(self.config.get_value(CONF_USERNAME)),
+                password=str(self.config.get_value(CONF_PASSWORD)),
+                check_ssl=bool(self.config.get_value(CONF_VERIFY_SSL)),
+            )
+        except RuntimeError:
+            # login details were not correct
+            raise LoginFailed(f"Login to abs instance at {base_url} failed.")
         await self._client.sync()
 
     async def unload(self, is_removed: bool = False) -> None:
index ab1d984e7ffd971b1c79bd73885ef91682372eb9..d3ef110a64d92e935c43218cdf09bb8ffc1cbdb4 100644 (file)
@@ -123,9 +123,9 @@ class ABSClient:
         """Logout from ABS."""
         await self._post("logout", add_api_endpoint=False)
 
-    async def get_user(self, id_: str) -> ABSUser:
+    async def get_authenticated_user(self) -> ABSUser:
         """Get an ABS user."""
-        data = await self._get(f"users/{id_}")
+        data = await self._get("me")
         return ABSUser.from_json(data)
 
     async def sync(self) -> None:
@@ -141,7 +141,7 @@ class ABSClient:
                     self.audiobook_libraries.append(library)
                 elif media_type == "podcast":
                     self.podcast_libraries.append(library)
-        self.user = await self.get_user(self.user.id_)
+        self.user = await self.get_authenticated_user()
 
     async def get_all_podcasts(self) -> AsyncGenerator[ABSPodcast]:
         """Get all available podcasts."""
index 89c27f05fc5e12fb7eab85c836a53e7b3113a33a..4762620728a0846ebe85e7c27665ae4bfe404d3a 100644 (file)
@@ -6,5 +6,6 @@
   "codeowners": [
     "@fmunkes"
   ],
-  "documentation": "https://music-assistant.io/music-providers/audiobookshelf"
+  "documentation": "https://music-assistant.io/music-providers/audiobookshelf",
+  "multi_instance": true
 }