@@ -585,3 +585,73 @@ class AudioFeatures(DataClassORJSONMixin):
585585 valence : float
586586 tempo : float
587587 time_signature : TimeSignature
588+
589+
590+ @dataclass
591+ class Chapter (DataClassORJSONMixin ):
592+ """Chapter model."""
593+
594+ chapter_id : str = field (metadata = field_options (alias = "id" ))
595+ chapter_number : int
596+ duration_ms : int
597+ images : list [Image ]
598+ languages : list [str ]
599+ name : str
600+ explicit : bool
601+ type : str
602+ uri : str
603+ external_urls : dict [str , str ]
604+
605+
606+ @dataclass
607+ class Author (DataClassORJSONMixin ):
608+ """Author model."""
609+
610+ name : str
611+
612+
613+ @dataclass
614+ class Narrator (DataClassORJSONMixin ):
615+ """Narrator model."""
616+
617+ name : str
618+
619+
620+ @dataclass
621+ class Audiobook (DataClassORJSONMixin ):
622+ """Audiobook model."""
623+
624+ authors : list [Author ]
625+ chapters : list [Chapter ]
626+ description : str
627+ edition : str
628+ external_urls : dict [str , str ]
629+ explicit : bool
630+ html_description : str
631+ audiobook_id : str = field (metadata = field_options (alias = "id" ))
632+ images : list [Image ]
633+ languages : list [str ]
634+ name : str
635+ narrators : list [Narrator ]
636+ publisher : str
637+ total_chapters : int
638+ type : str
639+ uri : str
640+
641+ @classmethod
642+ def __pre_deserialize__ (cls , d : dict [str , Any ]) -> dict [str , Any ]:
643+ """Pre deserialize hook."""
644+ return {** d , "chapters" : d .get ("chapters" , {}).pop ("items" , [])}
645+
646+
647+ @dataclass
648+ class AudiobooksResponse (DataClassORJSONMixin ):
649+ """Audiobooks response model."""
650+
651+ audiobooks : list [Audiobook ]
652+
653+ @classmethod
654+ def __pre_deserialize__ (cls , d : dict [str , Any ]) -> dict [str , Any ]:
655+ """Pre deserialize hook."""
656+ items = [item for item in d ["audiobooks" ] if item is not None ]
657+ return {"audiobooks" : items }
0 commit comments