4040 ATTR_PROVIDERS ,
4141 ATTR_QUEUE_ID ,
4242 ATTR_QUEUE_ITEM_ID ,
43+ ATTR_RELEASE_DATE ,
4344 ATTR_VOLUME_LEVEL ,
4445 CONF_DOWNLOAD_LOCAL ,
4546 DEFAULT_QUEUE_ITEMS_LIMIT ,
@@ -365,6 +366,12 @@ async def get_playlist_details(self, playlist_uri):
365366 LOGGER .debug (f"Getting album details for provider { provider } " )
366367 return await self ._client .music .get_playlist (item_id , provider )
367368
369+ async def get_podcast_details (self , podcast_uri ):
370+ """Retrieves the details for a podcast."""
371+ provider , item_id = parse_uri (podcast_uri )
372+ LOGGER .debug (f"Getting podcast details for provider { provider } " )
373+ return await self ._client .music .get_podcast (item_id , provider )
374+
368375 async def get_artist_tracks (self , artist_uri : str , page : int | None = None ):
369376 """Retrieves a limited number of tracks from an artist."""
370377 details = await self .get_artist_details (artist_uri )
@@ -399,6 +406,17 @@ async def get_album_tracks(self, album_uri: str, page: int | None = None):
399406 )
400407 return [self .format_track_item (item .to_dict ()) for item in resp ]
401408
409+ async def get_podcast_episodes (self , podcast_uri ):
410+ """Retrieves all episodes for a podcast."""
411+ provider , item_id = parse_uri (podcast_uri )
412+ LOGGER .debug (
413+ f"Getting podcast episodes for provider { provider } , item_id { item_id } " ,
414+ )
415+ resp : list = await self ._client .music .get_podcast_episodes (item_id , provider )
416+ formatted = [self .format_podcast_episode (item .to_dict ()) for item in resp ]
417+ formatted .sort (key = lambda x : x [ATTR_RELEASE_DATE ], reverse = True )
418+ return formatted
419+
402420 async def get_playlist_tracks (self , playlist_uri : str , page : int | None = None ):
403421 """Retrieves all playlist items."""
404422 provider , item_id = parse_uri (playlist_uri )
@@ -418,25 +436,37 @@ def format_playlist_track(self, playlist_track: dict) -> TRACK_ITEM_SCHEMA:
418436 result [ATTR_POSITION ] = playlist_track ["position" ]
419437 return result
420438
421- def format_track_item (self , playlist_item : dict ) -> TRACK_ITEM_SCHEMA :
422- """Processes the individual items in a playlist ."""
423- media_title = playlist_item . get ( "name" ) or "N/A"
424- media_album = playlist_item .get ("album" ) or "N/A"
439+ def format_track_item (self , track_item : dict ) -> TRACK_ITEM_SCHEMA :
440+ """Process an individual track item ."""
441+ result = self . format_item ( track_item )
442+ media_album = track_item .get ("album" ) or "N/A"
425443 media_album_name = "" if media_album is None else media_album .get ("name" , "" )
426- media_content_id = playlist_item ["uri" ]
427- media_image = find_image (playlist_item ) or ""
428- local_image_encoded = playlist_item .get (ATTR_LOCAL_IMAGE_ENCODED )
429- favorite = playlist_item ["favorite" ]
430- duration = playlist_item ["duration" ] or 0
431-
432- artists = playlist_item ["artists" ]
444+ artists = track_item ["artists" ]
433445 artist_names = [artist ["name" ] for artist in artists ]
434446 media_artist = ", " .join (artist_names )
447+ result [ATTR_MEDIA_ALBUM_NAME ] = media_album_name
448+ result [ATTR_MEDIA_ARTIST ] = media_artist
449+ return result
450+
451+ def format_podcast_episode (self , podcast_episode : dict ) -> TRACK_ITEM_SCHEMA :
452+ """Process an individual track item."""
453+ result = self .format_item (podcast_episode )
454+ result [ATTR_RELEASE_DATE ] = podcast_episode .get ("metadata" , {}).get (
455+ "release_date" ,
456+ )
457+ return result
458+
459+ def format_item (self , media_item : dict ) -> TRACK_ITEM_SCHEMA :
460+ """Processes the individual items in a playlist."""
461+ media_title = media_item .get ("name" ) or "N/A"
462+ media_content_id = media_item ["uri" ]
463+ media_image = find_image (media_item ) or ""
464+ local_image_encoded = media_item .get (ATTR_LOCAL_IMAGE_ENCODED )
465+ favorite = media_item ["favorite" ]
466+ duration = media_item ["duration" ] or 0
435467 response : ServiceResponse = TRACK_ITEM_SCHEMA (
436468 {
437469 ATTR_MEDIA_TITLE : media_title ,
438- ATTR_MEDIA_ALBUM_NAME : media_album_name ,
439- ATTR_MEDIA_ARTIST : media_artist ,
440470 ATTR_MEDIA_CONTENT_ID : media_content_id ,
441471 ATTR_DURATION : duration ,
442472 ATTR_MEDIA_IMAGE : media_image ,
0 commit comments