From: Marcel van der Veldt Date: Wed, 5 Feb 2025 18:27:03 +0000 (+0100) Subject: Chore: Return more detailed exceptions in builtin provider X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=83847f5bd74ab38cc015825f68ac33ef7507887a;p=music-assistant-server.git Chore: Return more detailed exceptions in builtin provider --- diff --git a/music_assistant/helpers/tags.py b/music_assistant/helpers/tags.py index e63afbb5..6ff8ece5 100644 --- a/music_assistant/helpers/tags.py +++ b/music_assistant/helpers/tags.py @@ -8,6 +8,7 @@ import logging import os import subprocess from collections.abc import Iterable +from contextlib import suppress from dataclasses import dataclass from json import JSONDecodeError from typing import Any @@ -17,6 +18,7 @@ from music_assistant_models.enums import AlbumType from music_assistant_models.errors import InvalidDataError from music_assistant.constants import MASS_LOGGER_NAME, UNKNOWN_ARTIST +from music_assistant.helpers.json import json_loads from music_assistant.helpers.process import AsyncProcess from music_assistant.helpers.util import try_parse_int @@ -478,6 +480,13 @@ def parse_tags(input_file: str, file_size: int | None = None) -> AudioTags: break del audiofile return tags + except subprocess.CalledProcessError as err: + error_msg = f"Unable to retrieve info for {input_file}" + if output := getattr(err, "stdout", None): + err_details = json_loads(output) + with suppress(KeyError): + error_msg = f"{error_msg} ({err_details['error']['string']})" + raise InvalidDataError(error_msg) from err except (KeyError, ValueError, JSONDecodeError, InvalidDataError) as err: msg = f"Unable to retrieve info for {input_file}: {err!s}" raise InvalidDataError(msg) from err diff --git a/music_assistant/providers/builtin/__init__.py b/music_assistant/providers/builtin/__init__.py index f8b44288..d53f9dec 100644 --- a/music_assistant/providers/builtin/__init__.py +++ b/music_assistant/providers/builtin/__init__.py @@ -312,7 +312,10 @@ class BuiltinProvider(MusicProvider): """Retrieve library tracks from the provider.""" stored_items: list[StoredItem] = self.mass.config.get(CONF_KEY_TRACKS, []) for item in stored_items: - yield await self.get_track(item["item_id"]) + try: + yield await self.get_track(item["item_id"]) + except MediaNotFoundError as err: + self.logger.warning("Track %s not found: %s", item, err) async def get_library_playlists(self) -> AsyncGenerator[Playlist, None]: """Retrieve library/subscribed playlists from the provider.""" @@ -330,7 +333,10 @@ class BuiltinProvider(MusicProvider): """Retrieve library/subscribed radio stations from the provider.""" stored_items: list[StoredItem] = self.mass.config.get(CONF_KEY_RADIOS, []) for item in stored_items: - yield await self.get_radio(item["item_id"]) + try: + yield await self.get_radio(item["item_id"]) + except MediaNotFoundError as err: + self.logger.warning("Radio station %s not found: %s", item, err) async def library_add(self, item: MediaItemType) -> bool: """Add item to provider's library. Return true on success.""" @@ -454,10 +460,7 @@ class BuiltinProvider(MusicProvider): force_radio: bool = False, ) -> Track | Radio: """Parse plain URL to MediaItem of type Radio or Track.""" - try: - media_info = await self._get_media_info(url, force_refresh) - except Exception as err: - raise MediaNotFoundError from err + media_info = await self._get_media_info(url, force_refresh) is_radio = media_info.get("icyname") or not media_info.duration provider_mappings = { ProviderMapping(