Coverage for src/utils/spotify.py : 16%
Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from settings import SPOTIFY_PROVIDER, SPOTIFY_CLIENT_ID, SPOTIFY_CLIENT_SECRET, SPOTIFY_REDIRECT_URI, SPOTIFY_URL_TOKEN, SPOTIFY_SCOPE, SPOTIFY_USER_URL
2from urllib.parse import urlencode
3import base64
4import requests
5import dateutil.parser
6from flask_jwt_extended import create_access_token
9class Spotify:
10 @staticmethod
11 def oauth_url(user):
12 access_token = create_access_token(identity=user)
13 params = urlencode({
14 'client_id': SPOTIFY_CLIENT_ID,
15 'scope': SPOTIFY_SCOPE,
16 'redirect_uri': SPOTIFY_REDIRECT_URI,
17 'response_type': 'code',
18 'state': access_token
19 })
21 url = SPOTIFY_PROVIDER + '?' + params
22 return url
24 @staticmethod
25 def get_tokens(code):
26 payload = {
27 'grant_type': 'authorization_code',
28 'code': code,
29 'redirect_uri': SPOTIFY_REDIRECT_URI
30 }
31 auth_header = base64.b64encode(
32 (SPOTIFY_CLIENT_ID + ':' + SPOTIFY_CLIENT_SECRET).encode('ascii'))
33 headers = {'Authorization': 'Basic %s' % auth_header.decode('ascii')}
35 response = requests.post(
36 SPOTIFY_URL_TOKEN, data=payload, headers=headers)
38 return response.json()
40 @staticmethod
41 def refresh_token(refresh_token):
43 payload = {
44 'refresh_token': refresh_token,
45 'grant_type': 'refresh_token'
46 }
48 auth_header = base64.b64encode(
49 (SPOTIFY_CLIENT_ID + ':' + SPOTIFY_CLIENT_SECRET).encode('ascii'))
50 headers = {'Authorization': 'Basic %s' % auth_header.decode('ascii')}
52 response = requests.post(
53 SPOTIFY_URL_TOKEN, data=payload, headers=headers)
55 return response.json()
57 """ @staticmethod
58 def get_user_top_artist(access_token):
59 limit = 20
60 access_token = access_token # your function to pull the token
61 # from the place where you saved it
62 items_list = []
63 url = SPOTIFY_USER_URL + f"top/artists?limit={limit}"
64 headers = {'Authorization': "Bearer "+access_token}
65 all_loaded = False
66 while not all_loaded:
67 response = requests.get(url, headers=headers).json()
68 items = response['items']
69 for item in items:
70 elements = {}
71 elements['genres'] = item['genres']
72 elements['artist_name'] = item['name']
73 items_list.append(elements)
74 if response['next']:
75 url = response['next'] # + f"&access_token={access_token}"
76 else:
77 all_loaded = True
78 return items_list
79 """
80 @staticmethod
81 def get_user_top_track(access_token):
82 limit = 20
84 items_list = []
85 url = SPOTIFY_USER_URL + f"top/tracks?limit={limit}"
86 headers = {'Authorization': "Bearer "+access_token}
87 all_loaded = False
88 while not all_loaded:
89 response = requests.get(url, headers=headers).json()
90 items = response['items']
91 for item in items:
92 elements = {}
93 elements['artist_name'] = []
94 elements['release'] = item['album']['name']
95 if isinstance(item['album']['images'], list) and len(item['album']['images']) > 0:
96 elements['cover_art_url'] = item['album']['images'][0]["url"] if (isinstance(
97 item['album']['images'], list) and len(item['album']['images']) > 0) else None
98 else:
99 elements['cover_art_url'] = None
100 elements['year'] = item['album']['release_date'].split(
101 "-")[0] if item['album']['release_date'] is not None else None
102 for artist in item['artists']:
103 elements['artist_name'].append(artist['name'])
104 elements['artist_name'] = " & ".join(elements['artist_name'])
105 elements['title'] = item['name']
106 elements['spotify_id'] = item['id']
107 elements['played_at'] = None
108 items_list.append(elements)
109 if response['next']:
110 url = response['next']
111 else:
112 all_loaded = True
113 return items_list
115 @staticmethod
116 def get_user_recently_played(access_token):
117 limit = 20
118 items_list = []
119 url = SPOTIFY_USER_URL + f"player/recently-played?limit={limit}"
120 headers = {'Authorization': "Bearer "+access_token}
121 all_loaded = False
122 while not all_loaded:
123 response = requests.get(url, headers=headers).json()
124 items = response['items']
125 for item in items:
126 elements = {}
127 elements['artist_name'] = []
128 elements['title'] = item['track']['name']
129 elements['spotify_id'] = item['track']['id']
130 elements['release'] = item['track']['album']['name']
131 elements['year'] = item['track']['album']['release_date'].split(
132 "-")[0] if item['track']['album']['release_date'] is not None else None
133 elements['played_at'] = dateutil.parser.isoparse(
134 item['played_at'][:-1]) if "played_at" in item.keys() else None
135 for artist in item['track']['artists']:
136 elements['artist_name'].append(artist['name'])
137 elements['artist_name'] = " & ".join(elements['artist_name'])
138 url_cover = requests.get(
139 item['track']['href'], headers=headers).json()
140 elements['cover_art_url'] = url_cover['album']['images'][0]['url'] if (isinstance(
141 url_cover['album']['images'], list) and len(url_cover['album']['images']) > 0) else None
142 items_list.append(elements)
143 if response['next']:
144 url = response['next']
145 else:
146 all_loaded = True
147 return items_list
149 @staticmethod
150 def get_user_playlist(access_token):
151 limit = 20
152 items_list = []
153 url = SPOTIFY_USER_URL + f"playlists?limit={limit}"
154 headers = {'Authorization': "Bearer "+access_token}
155 all_loaded = False
156 while not all_loaded:
157 response = requests.get(url, headers=headers).json()
158 items = response['items']
159 for item in items:
160 elements = {}
161 elements['tracks'] = []
162 url_playlist = requests.get(
163 item['href'], headers=headers).json()
164 elements['cover_art_url'] = url_playlist['images'][0]['url'] if (isinstance(
165 url_playlist['images'], list) and len(url_playlist['images']) > 0) else None
166 elements['playlist_name'] = url_playlist['name']
167 for track in url_playlist["tracks"]["items"]:
168 tk = {}
169 tk['artist_name'] = []
170 tk['release'] = track['track']['album']['name']
171 tk['cover_art_url'] = track['track']['album']['images'][0]["url"] if (isinstance(
172 track['track']['album']['images'], list) and len(track['track']['album']['images']) > 0) else None
173 tk['year'] = track['track']['album']['release_date'].split(
174 "-")[0] if track['track']['album']['release_date'] is not None else None
175 for artist in track['track']['artists']:
176 tk['artist_name'].append(artist['name'])
177 tk['artist_name'] = " & ".join(tk['artist_name'])
178 tk['title'] = track['track']['name']
179 tk['spotify_id'] = track['track']['id']
180 tk['played_at'] = None
181 elements['tracks'].append(tk)
182 items_list.append(elements)
183 if response['next']:
184 url = response['next']
185 else:
186 all_loaded = True
187 return items_list