Fix some small issues in the rss podcasts provider
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 6 Jan 2025 09:15:31 +0000 (10:15 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 6 Jan 2025 09:15:31 +0000 (10:15 +0100)
music_assistant/providers/podcastfeed/__init__.py

index 7c7837a1137d6d57b63d6e624584a6c5ce52e245..ee4b37bb0266c9ff0b00a191bac2b302641a2c1f 100644 (file)
@@ -96,7 +96,7 @@ class PodcastMusicprovider(MusicProvider):
         """Handle async initialization of the provider."""
         # ruff: noqa: S310
         feed_url = podcastparser.normalize_feed_url(self.config.get_value(CONF_FEED_URL))
-        self.podcast_id = hash(feed_url)
+        self.podcast_id = str(hash(feed_url))
         async with self.mass.http_session.get(feed_url) as response:
             if response.status == 200:
                 feed_data = await response.read()
@@ -120,6 +120,14 @@ class PodcastMusicprovider(MusicProvider):
         """
         return False
 
+    @property
+    def name(self) -> str:
+        """Return (custom) friendly name for this provider instance."""
+        if self.parsed:
+            postfix = self.parsed["title"]
+            return f"{self.manifest.name}: {postfix}"
+        return super().name
+
     async def get_library_podcasts(self) -> AsyncGenerator[Podcast, None]:
         """Retrieve library/subscribed podcasts from the provider."""
         """
@@ -130,17 +138,16 @@ class PodcastMusicprovider(MusicProvider):
 
     async def get_podcast(self, prov_podcast_id: str) -> Podcast:
         """Get full artist details by id."""
-        if prov_podcast_id in self.podcast_id:
-            return await self._parse_podcast()
-        else:
+        if prov_podcast_id != self.podcast_id:
             raise Exception(f"Podcast id not in provider: {prov_podcast_id}")
+        return await self._parse_podcast()
 
     async def get_podcast_episode(self, prov_episode_id: str) -> PodcastEpisode:
         """Get (full) podcast episode details by id."""
-        for episode in self.parsed["episodes"]:
+        for idx, episode in enumerate(self.parsed["episodes"]):
             if prov_episode_id == episode["guid"]:
-                return await self._parse_episode(episode)
-        raise MediaNotFoundError("Track not found")
+                return await self._parse_episode(episode, idx)
+        raise MediaNotFoundError("Episode not found")
 
     async def get_podcast_episodes(
         self,
@@ -148,8 +155,10 @@ class PodcastMusicprovider(MusicProvider):
     ) -> list[PodcastEpisode]:
         """List all episodes for the podcast."""
         episodes = []
-        for episode in self.parsed["episodes"]:
-            episodes.append(await self._parse_episode(episode))
+        if prov_podcast_id != self.podcast_id:
+            raise Exception(f"Podcast id not in provider: {prov_podcast_id}")
+        for idx, episode in enumerate(self.parsed["episodes"]):
+            episodes.append(await self._parse_episode(episode, idx))
         return episodes
 
     async def get_stream_details(
@@ -206,7 +215,7 @@ class PodcastMusicprovider(MusicProvider):
 
         return podcast
 
-    async def _parse_episode(self, episode_obj: dict) -> PodcastEpisode:
+    async def _parse_episode(self, episode_obj: dict, fallback_position: int) -> PodcastEpisode:
         name = episode_obj["title"]
         item_id = episode_obj["guid"]
         episode = PodcastEpisode(
@@ -214,7 +223,7 @@ class PodcastMusicprovider(MusicProvider):
             provider=self.domain,
             name=name,
             duration=episode_obj["total_time"],
-            position=episode_obj["number"],
+            position=episode_obj.get("number", fallback_position),
             podcast=ItemMapping(
                 item_id=self.podcast_id,
                 provider=self.instance_id,