|
8 | 8 | from pydantic import BaseModel |
9 | 9 |
|
10 | 10 | from korone.config import ConfigManager |
| 11 | +from korone.utils.logging import logger |
11 | 12 |
|
12 | 13 | from .errors import ERROR_CODE_MAP, LastFMError |
13 | 14 | from .types import LastFMAlbum, LastFMArtist, LastFMTrack, LastFMUser |
@@ -39,19 +40,61 @@ async def _request(self, params: dict[str, Any]) -> dict[str, Any]: |
39 | 40 | async with httpx.AsyncClient(http2=True, timeout=20) as client: |
40 | 41 | response = await client.get(self.base_url, params=params) |
41 | 42 | response.raise_for_status() |
42 | | - return response.json() |
| 43 | + |
| 44 | + if not response.content or response.content.strip() == b"": |
| 45 | + logger.warning( |
| 46 | + "Empty response from Last.fm API for method: %s", |
| 47 | + params.get("method", "unknown"), |
| 48 | + ) |
| 49 | + msg = "Empty response from Last.fm API" |
| 50 | + raise LastFMError(msg) |
| 51 | + |
| 52 | + try: |
| 53 | + return response.json() |
| 54 | + except ValueError as json_error: |
| 55 | + logger.error( |
| 56 | + "Invalid JSON response from Last.fm API for method: %s, response: %s", |
| 57 | + params.get("method", "unknown"), |
| 58 | + response.text[:100], |
| 59 | + ) |
| 60 | + msg = f"Invalid JSON response from Last.fm API: {response.text[:100]}" |
| 61 | + raise LastFMError(msg) from json_error |
| 62 | + |
43 | 63 | except httpx.HTTPStatusError as e: |
44 | 64 | error_message = "API request failed" |
45 | 65 | try: |
46 | | - error_json = e.response.json() |
47 | | - error_message = f"API request failed: {error_json.get('message', 'Unknown error')}" |
48 | | - error_code = error_json.get("error") |
49 | | - error_class = ERROR_CODE_MAP.get(error_code, LastFMError) |
50 | | - raise error_class(error_message, error_code, e.response) from e |
| 66 | + if e.response.content and e.response.content.strip(): |
| 67 | + error_json = e.response.json() |
| 68 | + error_message = ( |
| 69 | + f"API request failed: {error_json.get('message', 'Unknown error')}" |
| 70 | + ) |
| 71 | + error_code = error_json.get("error") |
| 72 | + error_class = ERROR_CODE_MAP.get(error_code, LastFMError) |
| 73 | + raise error_class(error_message, error_code, e.response) from e |
| 74 | + logger.warning( |
| 75 | + "API request failed with empty response (HTTP %s) for method: %s", |
| 76 | + e.response.status_code, |
| 77 | + params.get("method", "unknown"), |
| 78 | + ) |
| 79 | + error_message = ( |
| 80 | + f"API request failed with empty response (HTTP {e.response.status_code})" |
| 81 | + ) |
| 82 | + raise LastFMError(error_message) from e |
51 | 83 | except ValueError: |
52 | 84 | raise LastFMError(error_message) from e |
53 | 85 | except httpx.RequestError as e: |
54 | | - msg = "Request error occurred" |
| 86 | + if isinstance(e, httpx.TimeoutException): |
| 87 | + logger.warning( |
| 88 | + "Request timeout for Last.fm API method: %s", params.get("method", "unknown") |
| 89 | + ) |
| 90 | + msg = "Request timeout occurred" |
| 91 | + else: |
| 92 | + logger.error( |
| 93 | + "Request error occurred for Last.fm API method: %s, error: %s", |
| 94 | + params.get("method", "unknown"), |
| 95 | + str(e), |
| 96 | + ) |
| 97 | + msg = "Request error occurred" |
55 | 98 | raise LastFMError(msg) from e |
56 | 99 |
|
57 | 100 | @staticmethod |
|
0 commit comments