import aiohttp
import podcastparser
+from aiohttp.client import ClientError
from music_assistant_models.enums import ContentType, ImageType, MediaType
+from music_assistant_models.errors import MediaNotFoundError
from music_assistant_models.media_items import (
AudioFormat,
ItemMapping,
# but, reports on discord show, that also the opposite may be true
for headers in [{"User-Agent": "Mozilla/5.0"}, {}]:
# raises ClientError on status failure
- response = await session.get(feed_url, headers=headers, raise_for_status=True)
- assert response is not None # for type checking
+ # ClientError is the base class of all possible Error, i.e. not authorized,
+ # url doesn't exist etc.
+ try:
+ response = await session.get(feed_url, headers=headers, raise_for_status=True)
+ except ClientError:
+ continue
+ break
+ if response is None:
+ # we did not get a single acceptable response
+ raise MediaNotFoundError(
+ f"Did not get acceptable response while trying to access {feed_url}."
+ )
feed_data = await response.read()
feed_stream = BytesIO(feed_data)
- return podcastparser.parse(feed_url, feed_stream, max_episodes=max_episodes) # type: ignore[no-any-return]
+ try:
+ return podcastparser.parse(feed_url, feed_stream, max_episodes=max_episodes) # type: ignore[no-any-return]
+ except podcastparser.FeedParseError:
+ raise MediaNotFoundError(f"The url at {feed_url} returns invalid RSS data.")
def parse_podcast(
from collections.abc import AsyncGenerator
from typing import TYPE_CHECKING, Any
-from aiohttp.client_exceptions import ClientError
from music_assistant_models.config_entries import ConfigEntry, ConfigValueType, ProviderConfig
from music_assistant_models.enums import (
ConfigEntryType,
feed_url=feed_url,
max_episodes=self.max_episodes,
)
- except ClientError:
+ except MediaNotFoundError:
self.logger.warning(f"Was unable to obtain podcast with feed {feed_url}")
continue
await self._cache_set_podcast(feed_url, parsed_podcast)
default=None,
)
if parsed_podcast is None:
+ # raises MediaNotFoundError
parsed_podcast = await get_podcastparser_dict(
session=self.mass.http_session,
feed_url=prov_podcast_id,
import aiofiles
import orjson
-from aiohttp.client_exceptions import ClientError
from music_assistant_models.config_entries import ConfigEntry, ConfigValueOption
from music_assistant_models.enums import (
ConfigEntryType,
default=None,
)
if parsed_podcast is None:
- try:
- parsed_podcast = await get_podcastparser_dict(
- session=self.mass.http_session,
- feed_url=prov_podcast_id,
- max_episodes=self.max_episodes,
- )
- except ClientError as exc:
- raise MediaNotFoundError from exc
+ # get_podcastparser_dict raises MediaNotFoundError if data is invalid
+ parsed_podcast = await get_podcastparser_dict(
+ session=self.mass.http_session,
+ feed_url=prov_podcast_id,
+ max_episodes=self.max_episodes,
+ )
await self._cache_set_podcast(feed_url=prov_podcast_id, parsed_podcast=parsed_podcast)
# this is a dictionary from podcastparser