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