1
- from .requests import Request
1
+ from dataclasses import dataclass
2
+ from http import HTTPStatus
3
+
2
4
from .exceptions import UserNotFound
5
+ from .requests import Request
3
6
4
- from dataclasses import dataclass
5
7
6
8
@dataclass (frozen = True )
7
9
class TrackItem :
@@ -18,6 +20,7 @@ class TrackItem:
18
20
Type: int
19
21
"""
20
22
23
+
21
24
@dataclass (frozen = True )
22
25
class TrackList :
23
26
"""Track data list"""
@@ -28,21 +31,18 @@ class TrackList:
28
31
Type: list[TrackItem]
29
32
"""
30
33
31
- def __init__ (self ):
32
- super ().__init__ ()
33
-
34
34
def filter (self , name : str ) -> TrackItem | None :
35
35
"""Filters the tracks
36
36
37
- Returns: TrackItem | None
37
+ Returns: TrackItem | None
38
38
"""
39
39
40
- data = [x for x in self .tracks if x .get ('name' ).lower () == name .lower ()]
40
+ data : TrackItem | None = next (
41
+ (x for x in self .tracks if x .name .lower () == name .lower ()), None
42
+ )
41
43
42
- if len (data ) == 0 :
43
- return None
44
+ return data
44
45
45
- return TrackItem (data [0 ].get ('name' ), data [0 ].get ('plays' ))
46
46
47
47
@dataclass (frozen = True )
48
48
class ArtistItem :
@@ -53,12 +53,13 @@ class ArtistItem:
53
53
54
54
Type: str
55
55
"""
56
- tracks : list [ TrackItem ]
56
+ tracks : TrackList
57
57
"""Amount of tracks
58
58
59
- Type: list[TrackItem]
59
+ Type: TrackList
60
60
"""
61
61
62
+
62
63
@dataclass (frozen = True )
63
64
class ArtistList :
64
65
"""Artist data list"""
@@ -69,21 +70,17 @@ class ArtistList:
69
70
Type: list[ArtistItem]
70
71
"""
71
72
72
- def __init__ (self ):
73
- super ().__init__ ()
74
-
75
73
def filter (self , name : str ) -> ArtistItem | None :
76
74
"""Filters the artist
77
75
78
- Returns: ArtistItem | None
76
+ Returns: ArtistItem | None
79
77
"""
80
78
81
- data = [x for x in self .artists if x .get ('name' ).lower () == name .lower ()]
82
-
83
- if len (data ) == 0 :
84
- return None
85
-
86
- return ArtistItem (data [0 ].get ('name' ), TrackList ([TrackItem (x , y ) for x , y in data [0 ].get ('tracks' ).items ()]))
79
+ data : ArtistItem | None = next (
80
+ (artist for artist in self .artists if artist .name .lower () == name .lower ()),
81
+ None ,
82
+ )
83
+ return data
87
84
88
85
89
86
@dataclass (frozen = True )
@@ -104,12 +101,12 @@ class MusicResponse:
104
101
105
102
class Music :
106
103
"""Music class for requesting Music data"""
107
-
104
+
108
105
@staticmethod
109
- async def get_top_ten (id : str | int ):
106
+ async def get_top_ten (id : str | int ) -> MusicResponse :
110
107
"""Gets the top 10 music data request
111
108
112
- Returns: MusicResponse
109
+ Returns: MusicResponse
113
110
"""
114
111
response = await Request (
115
112
headers = {"Content-Type" : "application/json" },
@@ -118,20 +115,27 @@ async def get_top_ten(id: str | int):
118
115
"/music"
119
116
)
120
117
121
- if response .status == 404 :
118
+ if response .status == HTTPStatus . NOT_FOUND :
122
119
raise UserNotFound ()
123
-
124
- else :
125
- json_response = await response .json ()
126
-
127
- return MusicResponse (
128
- json_response .get ('_id' ),
129
- ArtistList (
130
- [ArtistItem (
131
- x .get ('name' ),
132
- TrackList (
133
- [TrackItem (x , y ) for x , y in x .get ('tracks' ).items ()]
134
- )
135
- ) for x in json_response .get ('artists' )]
136
- )
137
- )
120
+
121
+ json_response = await response .json ()
122
+
123
+ return MusicResponse (
124
+ id = json_response ["_id" ],
125
+ artists = ArtistList (
126
+ [
127
+ ArtistItem (
128
+ name = artist_data ["name" ],
129
+ tracks = TrackList (
130
+ [
131
+ TrackItem (name = track_name , plays = track_plays )
132
+ for track_name , track_plays in artist_data [
133
+ "tracks"
134
+ ].items ()
135
+ ]
136
+ ),
137
+ )
138
+ for artist_data in json_response .get ("artists" , [])
139
+ ]
140
+ ),
141
+ )
0 commit comments