Skip to content

Commit a54d669

Browse files
authored
Add method to get saved audiobooks (#477)
1 parent 096bea9 commit a54d669

File tree

5 files changed

+369
-7
lines changed

5 files changed

+369
-7
lines changed

src/spotifyaio/models.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,19 @@ def __pre_deserialize__(cls, d: dict[str, Any]) -> dict[str, Any]:
172172
return {"items": items}
173173

174174

175+
@dataclass
176+
class SavedAudiobookResponse(DataClassORJSONMixin):
177+
"""Saved audiobook response model."""
178+
179+
items: list[SimplifiedAudiobook]
180+
181+
@classmethod
182+
def __pre_deserialize__(cls, d: dict[str, Any]) -> dict[str, Any]:
183+
"""Pre deserialize hook."""
184+
items = [item for item in d["items"] if item is not None]
185+
return {"items": items}
186+
187+
175188
@dataclass
176189
class NewReleasesResponse(DataClassORJSONMixin):
177190
"""NewReleases response model."""
@@ -670,25 +683,31 @@ class Narrator(DataClassORJSONMixin):
670683

671684

672685
@dataclass
673-
class Audiobook(DataClassORJSONMixin):
674-
"""Audiobook model."""
686+
class SimplifiedAudiobook(DataClassORJSONMixin):
687+
"""SimplifiedAudiobook model."""
675688

676689
authors: list[Author]
677-
chapters: list[Chapter]
678690
description: str
679691
edition: str
692+
html_description: str
680693
external_urls: dict[str, str]
681694
explicit: bool
682-
html_description: str
683695
audiobook_id: str = field(metadata=field_options(alias="id"))
684696
images: list[Image]
685-
languages: list[str]
686697
name: str
698+
uri: str
699+
languages: list[str]
687700
narrators: list[Narrator]
688701
publisher: str
689702
total_chapters: int
690703
type: str
691-
uri: str
704+
705+
706+
@dataclass
707+
class Audiobook(SimplifiedAudiobook):
708+
"""Audiobook model."""
709+
710+
chapters: list[Chapter]
692711

693712
@classmethod
694713
def __pre_deserialize__(cls, d: dict[str, Any]) -> dict[str, Any]:

src/spotifyaio/spotify.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,14 @@
4646
RepeatMode,
4747
SavedAlbum,
4848
SavedAlbumResponse,
49+
SavedAudiobookResponse,
4950
SavedShow,
5051
SavedShowResponse,
5152
SavedTrack,
5253
SavedTrackResponse,
5354
Show,
5455
ShowEpisodesResponse,
56+
SimplifiedAudiobook,
5557
SimplifiedEpisode,
5658
TopArtistsResponse,
5759
TopTracksResponse,
@@ -298,7 +300,11 @@ async def get_audiobook_chapters(self, audiobook_id: str) -> list[Chapter]:
298300
)
299301
return AudiobookChapterResponse.from_json(response).items
300302

301-
# Get saved audiobooks
303+
async def get_saved_audiobooks(self) -> list[SimplifiedAudiobook]:
304+
"""Get saved audiobooks."""
305+
params: dict[str, Any] = {"limit": 48}
306+
response = await self._get("v1/me/audiobooks", params=params)
307+
return SavedAudiobookResponse.from_json(response).items
302308

303309
# Save an audiobook
304310

tests/__snapshots__/test_spotify.ambr

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19622,6 +19622,68 @@
1962219622
}),
1962319623
])
1962419624
# ---
19625+
# name: test_get_saved_audiobooks
19626+
list([
19627+
dict({
19628+
'audiobook_id': '58cFIY8IT7yGqR3kHnKqzV',
19629+
'authors': list([
19630+
dict({
19631+
'name': 'Anya Niewierra',
19632+
}),
19633+
]),
19634+
'description': '''
19635+
Author(s): Anya Niewierra
19636+
Narrator(s): Nienke Brinkhuis, Cees van Ede, Mattijn Hartemink<p>Na het succes van de bestsellers <i>Het bloemenmeisje</i> en <i>De Camino</i> komt Anya Niewierra met <i>De nomade</i>. Een aangrijpende thriller over vaderliefde en een verborgen verleden.</p><p>De 37-jarige documentairemaker Olga Liebke woont met haar zonderlinge vader in het Harz-gebergte. Olga heeft een innige band met de inmiddels dementerende man. Haar moeder stierf in het kraambed en ze heeft verder geen familie. Tenminste, zo is het verhaal.</p><p>Maar dan vertelt haar vader herinneringen die niet rijmen met de geschiedenis zoals zij die kent. Ze gaat twijfelen over haar achtergrond en ontdekt documenten uit de voormalige Sovjet-Unie.</p><p>Olga reist naar de driehoek Polen, Litouwen en Belarus en stuit op een huiveringwekkend geheim.</p>
19637+
<br>
19638+
<p>‘Anya Niewierra heeft met <i>De nomade</i> weer een magnifiek boek afgeleverd, dat mogelijk nog indrukwekkender is dan <i>De Camino</i>.’<br>
19639+
Heleen Spanjaard, <i>Margriet</i></p><p>‘Verrassend, meeslepend en bloedstollend. <i>De nomade</i> is een waardige opvolger van <i>De Camino</i>.’<br>
19640+
Rob Cobben, cultuurverslaggever <i>Dagblad De Limburger</i></p>
19641+
''',
19642+
'edition': 'Unabridged',
19643+
'explicit': False,
19644+
'external_urls': dict({
19645+
'spotify': 'https://open.spotify.com/show/58cFIY8IT7yGqR3kHnKqzV',
19646+
}),
19647+
'html_description': 'Author(s): Anya Niewierra<br/>Narrator(s): Nienke Brinkhuis, Cees van Ede, Mattijn Hartemink<br/>&lt;p&gt;Na het succes van de bestsellers &lt;i&gt;Het bloemenmeisje&lt;/i&gt; en &lt;i&gt;De Camino&lt;/i&gt; komt Anya Niewierra met &lt;i&gt;De nomade&lt;/i&gt;. Een aangrijpende thriller over vaderliefde en een verborgen verleden.&lt;/p&gt;<br/>&lt;p&gt;De 37-jarige documentairemaker Olga Liebke woont met haar zonderlinge vader in het Harz-gebergte. Olga heeft een innige band met de inmiddels dementerende man. Haar moeder stierf in het kraambed en ze heeft verder geen familie. Tenminste, zo is het verhaal.&lt;/p&gt;<br/>&lt;p&gt;Maar dan vertelt haar vader herinneringen die niet rijmen met de geschiedenis zoals zij die kent. Ze gaat twijfelen over haar achtergrond en ontdekt documenten uit de voormalige Sovjet-Unie.&lt;/p&gt;<br/>&lt;p&gt;Olga reist naar de driehoek Polen, Litouwen en Belarus en stuit op een huiveringwekkend geheim.&lt;/p&gt;<br/>&lt;br&gt;<br/>&lt;p&gt;‘Anya Niewierra heeft met &lt;i&gt;De nomade&lt;/i&gt; weer een magnifiek boek afgeleverd, dat mogelijk nog indrukwekkender is dan &lt;i&gt;De Camino&lt;/i&gt;.’&lt;br&gt;<br/>Heleen Spanjaard, &lt;i&gt;Margriet&lt;/i&gt;&lt;/p&gt;<br/>&lt;p&gt;‘Verrassend, meeslepend en bloedstollend. &lt;i&gt;De nomade&lt;/i&gt; is een waardige opvolger van &lt;i&gt;De Camino&lt;/i&gt;.’&lt;br&gt;<br/>Rob Cobben, cultuurverslaggever &lt;i&gt;Dagblad De Limburger&lt;/i&gt;&lt;/p&gt;',
19648+
'images': list([
19649+
dict({
19650+
'height': 640,
19651+
'url': 'https://i.scdn.co/image/ab676663000022a8ecf13d909d494c02ba057feb',
19652+
'width': 640,
19653+
}),
19654+
dict({
19655+
'height': 300,
19656+
'url': 'https://i.scdn.co/image/ab6766630000db5becf13d909d494c02ba057feb',
19657+
'width': 300,
19658+
}),
19659+
dict({
19660+
'height': 64,
19661+
'url': 'https://i.scdn.co/image/ab6766630000703becf13d909d494c02ba057feb',
19662+
'width': 64,
19663+
}),
19664+
]),
19665+
'languages': list([
19666+
'nl',
19667+
]),
19668+
'name': 'De nomade',
19669+
'narrators': list([
19670+
dict({
19671+
'name': 'Nienke Brinkhuis',
19672+
}),
19673+
dict({
19674+
'name': 'Cees van Ede',
19675+
}),
19676+
dict({
19677+
'name': 'Mattijn Hartemink',
19678+
}),
19679+
]),
19680+
'publisher': 'Anya Niewierra',
19681+
'total_chapters': 49,
19682+
'type': 'audiobook',
19683+
'uri': 'spotify:show:58cFIY8IT7yGqR3kHnKqzV',
19684+
}),
19685+
])
19686+
# ---
1962519687
# name: test_get_saved_shows
1962619688
list([
1962719689
dict({

0 commit comments

Comments
 (0)