Skip to content

Commit 0b2207b

Browse files
authored
Add method to get chapter (#481)
1 parent 2a829e9 commit 0b2207b

File tree

5 files changed

+604
-5
lines changed

5 files changed

+604
-5
lines changed

src/spotifyaio/models.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,7 @@ class AudioFeatures(DataClassORJSONMixin):
646646

647647

648648
@dataclass
649-
class Chapter(DataClassORJSONMixin):
649+
class SimplifiedChapter(DataClassORJSONMixin):
650650
"""Chapter model."""
651651

652652
chapter_id: str = field(metadata=field_options(alias="id"))
@@ -661,11 +661,18 @@ class Chapter(DataClassORJSONMixin):
661661
external_urls: dict[str, str]
662662

663663

664+
@dataclass
665+
class Chapter(SimplifiedChapter):
666+
"""Chapter model."""
667+
668+
audiobook: SimplifiedAudiobook
669+
670+
664671
@dataclass
665672
class AudiobookChapterResponse(DataClassORJSONMixin):
666673
"""Audiobook chapter response model."""
667674

668-
items: list[Chapter]
675+
items: list[SimplifiedChapter]
669676

670677

671678
@dataclass
@@ -707,7 +714,7 @@ class SimplifiedAudiobook(DataClassORJSONMixin):
707714
class Audiobook(SimplifiedAudiobook):
708715
"""Audiobook model."""
709716

710-
chapters: list[Chapter]
717+
chapters: list[SimplifiedChapter]
711718

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

src/spotifyaio/spotify.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
Show,
5555
ShowEpisodesResponse,
5656
SimplifiedAudiobook,
57+
SimplifiedChapter,
5758
SimplifiedEpisode,
5859
TopArtistsResponse,
5960
TopTracksResponse,
@@ -291,7 +292,9 @@ async def get_audiobooks(self, audiobook_ids: list[str]) -> list[Audiobook]:
291292
response = await self._get("v1/audiobooks", params=params)
292293
return AudiobooksResponse.from_json(response).audiobooks
293294

294-
async def get_audiobook_chapters(self, audiobook_id: str) -> list[Chapter]:
295+
async def get_audiobook_chapters(
296+
self, audiobook_id: str
297+
) -> list[SimplifiedChapter]:
295298
"""Get audiobook chapters."""
296299
identifier = get_identifier(audiobook_id)
297300
params: dict[str, Any] = {"limit": 50}
@@ -343,7 +346,11 @@ async def get_category(self, category_id: str) -> Category:
343346
response = await self._get(f"v1/browse/categories/{category_id}")
344347
return Category.from_json(response)
345348

346-
# Get chapter
349+
async def get_chapter(self, chapter_id: str) -> Chapter:
350+
"""Get chapter."""
351+
identifier = chapter_id.split(":")[-1]
352+
response = await self._get(f"v1/chapters/{identifier}")
353+
return Chapter.from_json(response)
347354

348355
# Get several chapters
349356

tests/__snapshots__/test_spotify.ambr

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7895,6 +7895,98 @@
78957895
}),
78967896
])
78977897
# ---
7898+
# name: test_get_chapter
7899+
dict({
7900+
'audiobook': dict({
7901+
'audiobook_id': '58cFIY8IT7yGqR3kHnKqzV',
7902+
'authors': list([
7903+
dict({
7904+
'name': 'Anya Niewierra',
7905+
}),
7906+
]),
7907+
'description': '''
7908+
Author(s): Anya Niewierra
7909+
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>
7910+
<br>
7911+
<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>
7912+
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>
7913+
Rob Cobben, cultuurverslaggever <i>Dagblad De Limburger</i></p>
7914+
''',
7915+
'edition': 'Unabridged',
7916+
'explicit': False,
7917+
'external_urls': dict({
7918+
'spotify': 'https://open.spotify.com/show/58cFIY8IT7yGqR3kHnKqzV',
7919+
}),
7920+
'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;',
7921+
'images': list([
7922+
dict({
7923+
'height': 640,
7924+
'url': 'https://i.scdn.co/image/ab676663000022a8ecf13d909d494c02ba057feb',
7925+
'width': 640,
7926+
}),
7927+
dict({
7928+
'height': 300,
7929+
'url': 'https://i.scdn.co/image/ab6766630000db5becf13d909d494c02ba057feb',
7930+
'width': 300,
7931+
}),
7932+
dict({
7933+
'height': 64,
7934+
'url': 'https://i.scdn.co/image/ab6766630000703becf13d909d494c02ba057feb',
7935+
'width': 64,
7936+
}),
7937+
]),
7938+
'languages': list([
7939+
'nl',
7940+
]),
7941+
'name': 'De nomade',
7942+
'narrators': list([
7943+
dict({
7944+
'name': 'Nienke Brinkhuis',
7945+
}),
7946+
dict({
7947+
'name': 'Cees van Ede',
7948+
}),
7949+
dict({
7950+
'name': 'Mattijn Hartemink',
7951+
}),
7952+
]),
7953+
'publisher': 'Anya Niewierra',
7954+
'total_chapters': 49,
7955+
'type': 'audiobook',
7956+
'uri': 'spotify:show:58cFIY8IT7yGqR3kHnKqzV',
7957+
}),
7958+
'chapter_id': '3NW4BmIOG0qzQZgtLgsydR',
7959+
'chapter_number': 0,
7960+
'duration_ms': 249652,
7961+
'explicit': False,
7962+
'external_urls': dict({
7963+
'spotify': 'https://open.spotify.com/episode/3NW4BmIOG0qzQZgtLgsydR',
7964+
}),
7965+
'images': list([
7966+
dict({
7967+
'height': 640,
7968+
'url': 'https://i.scdn.co/image/ab676663000022a8ecf13d909d494c02ba057feb',
7969+
'width': 640,
7970+
}),
7971+
dict({
7972+
'height': 300,
7973+
'url': 'https://i.scdn.co/image/ab6766630000db5becf13d909d494c02ba057feb',
7974+
'width': 300,
7975+
}),
7976+
dict({
7977+
'height': 64,
7978+
'url': 'https://i.scdn.co/image/ab6766630000703becf13d909d494c02ba057feb',
7979+
'width': 64,
7980+
}),
7981+
]),
7982+
'languages': list([
7983+
'nl',
7984+
]),
7985+
'name': 'Track 1',
7986+
'type': 'chapter',
7987+
'uri': 'spotify:episode:3NW4BmIOG0qzQZgtLgsydR',
7988+
})
7989+
# ---
78987990
# name: test_get_current_playing
78997991
dict({
79007992
'context': dict({

0 commit comments

Comments
 (0)