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