Skip to content

Commit 5bb3a26

Browse files
authored
Add method to get several chapters (#487)
1 parent 93acdfa commit 5bb3a26

File tree

5 files changed

+640
-1
lines changed

5 files changed

+640
-1
lines changed

src/spotifyaio/models.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,19 @@ class Chapter(SimplifiedChapter):
668668
audiobook: SimplifiedAudiobook
669669

670670

671+
@dataclass
672+
class ChaptersResponse(DataClassORJSONMixin):
673+
"""Chapters response model."""
674+
675+
chapters: list[Chapter]
676+
677+
@classmethod
678+
def __pre_deserialize__(cls, d: dict[str, Any]) -> dict[str, Any]:
679+
"""Pre deserialize hook."""
680+
items = [item for item in d["chapters"] if item is not None]
681+
return {"chapters": items}
682+
683+
671684
@dataclass
672685
class AudiobookChapterResponse(DataClassORJSONMixin):
673686
"""Audiobook chapter response model."""

src/spotifyaio/spotify.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
Category,
3131
CategoryPlaylistResponse,
3232
Chapter,
33+
ChaptersResponse,
3334
CurrentPlaying,
3435
Device,
3536
Devices,
@@ -363,7 +364,18 @@ async def get_chapter(self, chapter_id: str) -> Chapter:
363364
response = await self._get(f"v1/chapters/{identifier}")
364365
return Chapter.from_json(response)
365366

366-
# Get several chapters
367+
async def get_chapters(self, chapter_ids: list[str]) -> list[Chapter]:
368+
"""Get chapters."""
369+
if not chapter_ids:
370+
return []
371+
if len(chapter_ids) > 50:
372+
msg = "Maximum of 50 chapters can be requested at once"
373+
raise ValueError(msg)
374+
params: dict[str, Any] = {
375+
"ids": ",".join([get_identifier(i) for i in chapter_ids])
376+
}
377+
response = await self._get("v1/chapters", params=params)
378+
return ChaptersResponse.from_json(response).chapters
367379

368380
async def get_episode(self, episode_id: str) -> Episode:
369381
"""Get episode."""

tests/__snapshots__/test_spotify.ambr

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21486,6 +21486,100 @@
2148621486
}),
2148721487
])
2148821488
# ---
21489+
# name: test_get_several_chapters
21490+
list([
21491+
dict({
21492+
'audiobook': dict({
21493+
'audiobook_id': '58cFIY8IT7yGqR3kHnKqzV',
21494+
'authors': list([
21495+
dict({
21496+
'name': 'Anya Niewierra',
21497+
}),
21498+
]),
21499+
'description': '''
21500+
Author(s): Anya Niewierra
21501+
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>
21502+
<br>
21503+
<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>
21504+
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>
21505+
Rob Cobben, cultuurverslaggever <i>Dagblad De Limburger</i></p>
21506+
''',
21507+
'edition': 'Unabridged',
21508+
'explicit': False,
21509+
'external_urls': dict({
21510+
'spotify': 'https://open.spotify.com/show/58cFIY8IT7yGqR3kHnKqzV',
21511+
}),
21512+
'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;',
21513+
'images': list([
21514+
dict({
21515+
'height': 640,
21516+
'url': 'https://i.scdn.co/image/ab676663000022a8ecf13d909d494c02ba057feb',
21517+
'width': 640,
21518+
}),
21519+
dict({
21520+
'height': 300,
21521+
'url': 'https://i.scdn.co/image/ab6766630000db5becf13d909d494c02ba057feb',
21522+
'width': 300,
21523+
}),
21524+
dict({
21525+
'height': 64,
21526+
'url': 'https://i.scdn.co/image/ab6766630000703becf13d909d494c02ba057feb',
21527+
'width': 64,
21528+
}),
21529+
]),
21530+
'languages': list([
21531+
'nl',
21532+
]),
21533+
'name': 'De nomade',
21534+
'narrators': list([
21535+
dict({
21536+
'name': 'Nienke Brinkhuis',
21537+
}),
21538+
dict({
21539+
'name': 'Cees van Ede',
21540+
}),
21541+
dict({
21542+
'name': 'Mattijn Hartemink',
21543+
}),
21544+
]),
21545+
'publisher': 'Anya Niewierra',
21546+
'total_chapters': 49,
21547+
'type': 'audiobook',
21548+
'uri': 'spotify:show:58cFIY8IT7yGqR3kHnKqzV',
21549+
}),
21550+
'chapter_id': '3NW4BmIOG0qzQZgtLgsydR',
21551+
'chapter_number': 0,
21552+
'duration_ms': 249652,
21553+
'explicit': False,
21554+
'external_urls': dict({
21555+
'spotify': 'https://open.spotify.com/episode/3NW4BmIOG0qzQZgtLgsydR',
21556+
}),
21557+
'images': list([
21558+
dict({
21559+
'height': 640,
21560+
'url': 'https://i.scdn.co/image/ab676663000022a8ecf13d909d494c02ba057feb',
21561+
'width': 640,
21562+
}),
21563+
dict({
21564+
'height': 300,
21565+
'url': 'https://i.scdn.co/image/ab6766630000db5becf13d909d494c02ba057feb',
21566+
'width': 300,
21567+
}),
21568+
dict({
21569+
'height': 64,
21570+
'url': 'https://i.scdn.co/image/ab6766630000703becf13d909d494c02ba057feb',
21571+
'width': 64,
21572+
}),
21573+
]),
21574+
'languages': list([
21575+
'nl',
21576+
]),
21577+
'name': 'Track 1',
21578+
'type': 'chapter',
21579+
'uri': 'spotify:episode:3NW4BmIOG0qzQZgtLgsydR',
21580+
}),
21581+
])
21582+
# ---
2148921583
# name: test_get_show
2149021584
dict({
2149121585
'description': 'Safety Third is a weekly show hosted by William Osman, NileRed, The Backyard Scientist, Allen Pan, and a couple other YouTube "Scientists". Sometimes we have guests, sometimes it\'s just us, but always: safety is our number three priority.',

0 commit comments

Comments
 (0)