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
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
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
"""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."""
"""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."""
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(