|
25 | 25 | import dateutil.parser |
26 | 26 | from typing_extensions import NoReturn |
27 | 27 |
|
28 | | -from tidalapi.exceptions import ObjectNotFound, TooManyRequests |
| 28 | +from tidalapi.exceptions import MetadataNotAvailable, ObjectNotFound, TooManyRequests |
29 | 29 | from tidalapi.types import JsonObj |
30 | 30 |
|
| 31 | +from . import mix |
| 32 | + |
31 | 33 | if TYPE_CHECKING: |
32 | 34 | from tidalapi.album import Album |
33 | 35 | from tidalapi.media import Track, Video |
@@ -226,21 +228,45 @@ def get_similar(self) -> List["Artist"]: |
226 | 228 | ), |
227 | 229 | ) |
228 | 230 |
|
229 | | - def get_radio(self) -> List["Track"]: |
230 | | - """Queries TIDAL for the artist radio, which is a mix of tracks that are similar |
231 | | - to what the artist makes. |
| 231 | + def get_radio(self, limit: int = 100) -> List["Track"]: |
| 232 | + """Queries TIDAL for the artist radio, i.e. a list of tracks similar to this |
| 233 | + artist. |
232 | 234 |
|
233 | 235 | :return: A list of :class:`Tracks <tidalapi.media.Track>` |
234 | 236 | """ |
235 | | - params = {"limit": 100} |
236 | | - return cast( |
237 | | - List["Track"], |
238 | | - self.request.map_request( |
239 | | - f"artists/{self.id}/radio", |
240 | | - params=params, |
241 | | - parse=self.session.parse_track, |
242 | | - ), |
243 | | - ) |
| 237 | + params = {"limit": limit} |
| 238 | + |
| 239 | + try: |
| 240 | + request = self.request.request( |
| 241 | + "GET", "artists/%s/radio" % self.id, params=params |
| 242 | + ) |
| 243 | + except ObjectNotFound: |
| 244 | + raise MetadataNotAvailable("Track radio not available for this track") |
| 245 | + except TooManyRequests: |
| 246 | + raise TooManyRequests("Track radio unavailable") |
| 247 | + else: |
| 248 | + json_obj = request.json() |
| 249 | + radio = self.request.map_json(json_obj, parse=self.session.parse_track) |
| 250 | + assert isinstance(radio, list) |
| 251 | + return cast(List["Track"], radio) |
| 252 | + |
| 253 | + def get_radio_mix(self) -> mix.Mix: |
| 254 | + """Queries TIDAL for the artist radio, i.e. mix of tracks that are similar to |
| 255 | + this artist. |
| 256 | +
|
| 257 | + :return: A :class:`Mix <tidalapi.mix.Mix>` |
| 258 | + :raises: A :class:`exceptions.MetadataNotAvailable` if no track radio mix is available |
| 259 | + """ |
| 260 | + |
| 261 | + try: |
| 262 | + request = self.request.request("GET", "artists/%s/mix" % self.id) |
| 263 | + except ObjectNotFound: |
| 264 | + raise MetadataNotAvailable("Artist radio not available for this artist") |
| 265 | + except TooManyRequests: |
| 266 | + raise TooManyRequests("Artist radio unavailable") |
| 267 | + else: |
| 268 | + json_obj = request.json() |
| 269 | + return self.session.mix(json_obj.get("id")) |
244 | 270 |
|
245 | 271 | def items(self) -> List[NoReturn]: |
246 | 272 | """The artist page does not supply any items. This only exists for symmetry with |
|
0 commit comments