/
/
/
1"""
2Schema for iTunes Podcast Search.
3
4Only what is needed.
5"""
6
7from dataclasses import dataclass, field
8
9from mashumaro import field_options
10from mashumaro.config import BaseConfig
11from mashumaro.mixins.json import DataClassJSONMixin
12
13
14class _BaseModel(DataClassJSONMixin):
15 """Model shared between schema definitions."""
16
17 class Config(BaseConfig):
18 """Base configuration."""
19
20 forbid_extra_keys = False
21 serialize_by_alias = True
22
23
24@dataclass(kw_only=True)
25class PodcastSearchResult(_BaseModel):
26 """PodcastSearchResult."""
27
28 collection_id: int | None = field(metadata=field_options(alias="collectionId"), default=None)
29 kind: str | None = None
30 artist_name: str | None = field(metadata=field_options(alias="artistName"), default=None)
31 collection_name: str | None = field(
32 metadata=field_options(alias="collectionName"), default=None
33 )
34 collection_censored_name: str | None = field(
35 metadata=field_options(alias="collectionCensoredName"), default=None
36 )
37 track_name: str | None = field(metadata=field_options(alias="trackName"), default=None)
38 track_censored_name: str | None = field(
39 metadata=field_options(alias="trackCensoredName"), default=None
40 )
41 feed_url: str | None = field(metadata=field_options(alias="feedUrl"), default=None)
42 artwork_url_30: str | None = field(metadata=field_options(alias="artworkUrl30"), default=None)
43 artwork_url_60: str | None = field(metadata=field_options(alias="artworkUrl60"), default=None)
44 artwork_url_100: str | None = field(metadata=field_options(alias="artworkUrl100"), default=None)
45 artwork_url_600: str | None = field(metadata=field_options(alias="artworkUrl600"), default=None)
46 release_date: str | None = field(metadata=field_options(alias="releaseDate"), default=None)
47 track_count: int = field(metadata=field_options(alias="trackCount"), default=0)
48 primary_genre_name: str | None = field(
49 metadata=field_options(alias="primaryGenreName"), default=None
50 )
51 genres: list[str] = field(default_factory=list)
52
53
54@dataclass(kw_only=True)
55class ITunesSearchResults(_BaseModel):
56 """SearchResults."""
57
58 result_count: int = field(metadata=field_options(alias="resultCount"), default=0)
59 results: list[PodcastSearchResult] = field(default_factory=list)
60
61
62# below is only what we need
63
64
65@dataclass(kw_only=True)
66class TopPodcastsGenres(_BaseModel):
67 """TopPodcastsGenres."""
68
69 genre_id: str | int = field(metadata=field_options(alias="genreId"), default="")
70 name: str
71
72
73@dataclass(kw_only=True)
74class TopPodcastsResult(_BaseModel):
75 """TopPodcastsResult."""
76
77 artist_name: str = field(metadata=field_options(alias="artistName"), default="")
78 id_: str | int = field(metadata=field_options(alias="id"), default="")
79 name: str = ""
80 genres: list[TopPodcastsGenres] = field(default_factory=list)
81 artwork_url_30: str | None = field(metadata=field_options(alias="artworkUrl30"), default=None)
82 artwork_url_60: str | None = field(metadata=field_options(alias="artworkUrl60"), default=None)
83 artwork_url_100: str | None = field(metadata=field_options(alias="artworkUrl100"), default=None)
84 artwork_url_600: str | None = field(metadata=field_options(alias="artworkUrl600"), default=None)
85 content_advisory_rating: str | None = field(
86 metadata=field_options(alias="contentAdvisoryRating"), default=None
87 )
88
89
90@dataclass(kw_only=True)
91class TopPodcastsResults(_BaseModel):
92 """TopPodcastsResults."""
93
94 country: str
95 results: list[TopPodcastsResult] = field(default_factory=list)
96
97
98@dataclass(kw_only=True)
99class TopPodcastsResponse(_BaseModel):
100 """TopPodcastsResponse."""
101
102 feed: TopPodcastsResults | None = None
103
104
105# HELPER
106@dataclass(kw_only=True)
107class TopPodcastsHelper(_BaseModel):
108 """
109 TopPodcastsHelper.
110
111 This is used to cache the recommendations.
112 """
113
114 top_podcasts: list[PodcastSearchResult] = field(default_factory=list)
115