More fixes for podcasts and audiobooks
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 4 Jan 2025 00:36:24 +0000 (01:36 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 4 Jan 2025 00:36:24 +0000 (01:36 +0100)
music_assistant/controllers/media/audiobooks.py
music_assistant/controllers/media/podcasts.py
music_assistant/controllers/player_queues.py
music_assistant/providers/test/__init__.py

index a5fcd729ae30af7ea9ff2ba138c9f7bfbebef8dd..d47f8b828e0e449b4fac0ebbcd02738e22df075e 100644 (file)
@@ -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"]
 
index 3c16d42f8486c56ca2285655fadac2fc343397a5..cf1f53b30383dfdb4ee3bb55db7d6613440af5da 100644 (file)
@@ -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,
index ffd251ab17635554753e1065c9869e6368a78bb4..fe0c2fa9b94f61d635ff69e1314ce7dca280ac67 100644 (file)
@@ -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 (
index 669da45c218b8ec165a235e9560c5b2ff4fe66a8..d7aac0e775662f7ccb8c01dd073ffcf9e7ae6fd8 100644 (file)
@@ -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)
         ]