-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspotify.py
92 lines (86 loc) · 3.32 KB
/
spotify.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import requests
import json
def _get_song_uri(spotify_token, song_name):
headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': f'Bearer {spotify_token}',
}
params = {
'q': song_name,
'type': 'track',
'limit': 1
}
response = requests.get('https://api.spotify.com/v1/search', params=params, headers=headers)
search_result = json.loads(response.text)
if "tracks" in search_result:
return search_result["tracks"]["items"][0]["uri"]
else:
if "error" in search_result:
print(f" [!] Spotify API Error: {search_result['error']['message']}")
return None
def _get_playlist_id(spotify_token, playlist_name):
headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': f'Bearer {spotify_token}',
}
response = requests.get('https://api.spotify.com/v1/me/playlists', headers=headers)
search_result = json.loads(response.text)
for playlist in search_result["items"]:
if playlist["name"] == playlist_name:
return playlist["id"]
return None
def _add_songs_to_playlist(spotify_token, playlist_name, track_uris):
playlist_id = _get_playlist_id(spotify_token, playlist_name)
print(f"[*] Found playlist {playlist_name} -> {playlist_id}")
uris = ""
for uri in track_uris:
uris += f'{uri},'
print(uris)
headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': f'Bearer {spotify_token}',
}
params = {
'playlist_id': playlist_id,
'uris': uris[:-1],
}
response = requests.post(f'https://api.spotify.com/v1/playlists/{playlist_id}/tracks', params=params, headers=headers)
def add_to_spotify_playlist(token, track_names, playlist_name):
track_names = list(dict.fromkeys(track_names))
uris = []
for name in track_names:
print(f"[*] Searching track: {name}")
uri = _get_song_uri(token, name)
if uri is None:
print(f" [-] No uri found for track {name}")
else:
print(f" [*] Adding track {name} -> {uri}")
uris.append(uri)
_add_songs_to_playlist(token, playlist_name, uris)
def _get_auth_code(client_id):
scope = "playlist-read-private playlist-modify-private"
url = f"https://accounts.spotify.com/authorize?client_id={client_id}&response_type=code&scope={scope}&redirect_uri=https://whatever"
auth_code_request = requests.get(url ,allow_redirects=True)
redirect_url = auth_code_request.url
print(redirect_url)
while "?code=" not in redirect_url:
pass
code = redirect_url.split("?code=")[1]
return code
def get_api_token(client_id, client_secret, redirect_uri):
code = _get_auth_code(client_id)
authorization = requests.post(
"https://accounts.spotify.com/api/token",
auth=(client_id, client_secret),
data={
"grant_type": "authorization_code",
"code": code,
"redirect_uri": redirect_uri
},
)
print(authorization.text)
authorization_JSON = authorization.json()
return authorization_JSON["access_token"]