From 8a839ed0dc990fb12bebfaf4c2a0e57a93c26399 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Sat, 4 Jan 2025 01:36:24 +0100 Subject: [PATCH] More fixes for podcasts and audiobooks --- music_assistant/controllers/media/audiobooks.py | 2 +- music_assistant/controllers/media/podcasts.py | 7 +++---- music_assistant/controllers/player_queues.py | 4 ++-- music_assistant/providers/test/__init__.py | 16 ++++++++++++++-- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/music_assistant/controllers/media/audiobooks.py b/music_assistant/controllers/media/audiobooks.py index a5fcd729..d47f8b82 100644 --- a/music_assistant/controllers/media/audiobooks.py +++ b/music_assistant/controllers/media/audiobooks.py @@ -228,7 +228,7 @@ class AudiobooksController(MediaControllerBase[Audiobook]): if resume_info_db_row is None: return if resume_info_db_row["seconds_played"] is not None: - chapter.resume_position_ms = resume_info_db_row["seconds_played"] * 1000 + chapter.resume_position_ms = int(resume_info_db_row["seconds_played"] * 1000) if resume_info_db_row["fully_played"] is not None: chapter.fully_played = resume_info_db_row["fully_played"] diff --git a/music_assistant/controllers/media/podcasts.py b/music_assistant/controllers/media/podcasts.py index 3c16d42f..cf1f53b3 100644 --- a/music_assistant/controllers/media/podcasts.py +++ b/music_assistant/controllers/media/podcasts.py @@ -202,7 +202,7 @@ class PodcastsController(MediaControllerBase[Podcast]): # grab the episodes from the provider # note that we do not cache any of this because its # always a rather small list and we want fresh resume info - items = await prov.get_audiobook_chapters(item_id) + items = await prov.get_podcast_episodes(item_id) async def set_resume_position(episode: Episode) -> None: if episode.resume_position_ms is not None: @@ -215,19 +215,18 @@ class PodcastsController(MediaControllerBase[Podcast]): { "item_id": episode.item_id, "provider": prov.lookup_key, - "media_type": MediaType.CHAPTER, + "media_type": MediaType.EPISODE, }, ) if resume_info_db_row is None: return if resume_info_db_row["seconds_played"] is not None: - episode.resume_position_ms = resume_info_db_row["seconds_played"] * 1000 + episode.resume_position_ms = int(resume_info_db_row["seconds_played"] * 1000) if resume_info_db_row["fully_played"] is not None: episode.fully_played = resume_info_db_row["fully_played"] await asyncio.gather(*[set_resume_position(chapter) for chapter in items]) return items - return items async def _get_provider_dynamic_base_tracks( self, diff --git a/music_assistant/controllers/player_queues.py b/music_assistant/controllers/player_queues.py index ffd251ab..fe0c2fa9 100644 --- a/music_assistant/controllers/player_queues.py +++ b/music_assistant/controllers/player_queues.py @@ -785,9 +785,9 @@ class PlayerQueuesController(CoreController): # handle resume point of audiobook(chapter) or podcast(episode) if not seek_position and ( - resume_position := getattr(queue_item.media_item, "resume_position", 0) + resume_position_ms := getattr(queue_item.media_item, "resume_position_ms", 0) ): - seek_position = resume_position + seek_position = max(0, int((resume_position_ms - 500) / 1000)) # work out if we are playing an album and if we should prefer album loudness if ( diff --git a/music_assistant/providers/test/__init__.py b/music_assistant/providers/test/__init__.py index 669da45c..d7aac0e7 100644 --- a/music_assistant/providers/test/__init__.py +++ b/music_assistant/providers/test/__init__.py @@ -240,6 +240,8 @@ class TestProvider(MusicProvider): }, publisher="Test Publisher", total_chapters=10, + authors=UniqueList(["AudioBook Author"]), + narrators=UniqueList(["AudioBook Narrator"]), ) async def get_library_artists(self) -> AsyncGenerator[Artist, None]: @@ -297,6 +299,7 @@ class TestProvider(MusicProvider): provider=self.instance_id, name=f"Test Audiobook {prov_audiobook_id}", media_type=MediaType.AUDIOBOOK, + image=DEFAULT_THUMB, ), provider_mappings={ ProviderMapping( @@ -305,6 +308,11 @@ class TestProvider(MusicProvider): provider_instance=self.instance_id, ) }, + metadata=MediaItemMetadata( + description="This is a description for " + f"Test Chapter {chapter_idx} of Test Audiobook {prov_audiobook_id}" + ), + position=chapter_idx, ) for chapter_idx in range(num_chapters) ] @@ -326,6 +334,7 @@ class TestProvider(MusicProvider): provider=self.instance_id, name=f"Test Podcast {prov_podcast_id}", media_type=MediaType.PODCAST, + image=DEFAULT_THUMB, ), provider_mappings={ ProviderMapping( @@ -334,8 +343,11 @@ class TestProvider(MusicProvider): provider_instance=self.instance_id, ) }, - metadata=MediaItemMetadata(images=UniqueList([DEFAULT_THUMB])), - episode_number=episode_idx, + metadata=MediaItemMetadata( + description="This is a description for " + f"Test Episode {episode_idx} of Test Podcast {prov_podcast_id}" + ), + position=episode_idx, ) for episode_idx in range(num_episodes) ] -- 2.34.1