|
9 | 9 | import webbrowser |
10 | 10 | #flask server |
11 | 11 | from flask import Flask, request |
| 12 | +import pickle |
12 | 13 |
|
13 | 14 |
|
14 | 15 | class Spotify(object): |
@@ -43,44 +44,90 @@ def code(): |
43 | 44 |
|
44 | 45 | class User(object): |
45 | 46 |
|
46 | | - def __init__( |
47 | | - self, |
48 | | - client_id = '83e4430b4700434baa21228a9c7d11c5', |
49 | | - client_secret = '9bb9e131ff28424cb6a420afdf41d44a' |
50 | | - ): |
| 47 | + def __init__(self): |
51 | 48 |
|
52 | | - self.__client_id = client_id |
53 | | - self.__client_secret = client_secret |
54 | 49 | self.__grant_type = 'authorization_code' |
55 | 50 | self.__scope = 'user-library-read' |
| 51 | + self.__getData() |
56 | 52 | self.__redirect = 'http://localhost:5000/' |
57 | 53 | self.__urlCode = f'https://accounts.spotify.com/authorize?client_id={self.__client_id}&response_type=code&redirect_uri={self.__redirect}&scope={self.__scope}' |
58 | 54 | self.__url = 'https://accounts.spotify.com/api/token' |
59 | 55 |
|
| 56 | + self.__getRefreshToken() |
60 | 57 |
|
| 58 | + self.__client = spotipy.Spotify(auth=self.__access_token) |
| 59 | + |
| 60 | + |
| 61 | + def __getAccessToken(self): |
| 62 | + #start server |
61 | 63 | #handling the code |
62 | 64 | webbrowser.open_new(self.__urlCode) |
63 | 65 | Spotify.Server.run() |
64 | 66 | self.__code = Spotify.Server.code |
65 | 67 |
|
66 | | - |
67 | 68 | self.__body_params = { |
68 | 69 | 'grant_type': self.__grant_type, |
69 | 70 | 'code': self.__code, |
70 | 71 | 'redirect_uri': self.__redirect, |
71 | 72 | } |
72 | 73 |
|
73 | 74 | #getting access_token by POST request to Spotify API |
74 | | - self.__access_token = requests.post( |
| 75 | + response = requests.post( |
75 | 76 | self.__url, |
76 | 77 | data=self.__body_params, |
77 | 78 | auth=( |
78 | 79 | self.__client_id, |
79 | 80 | self.__client_secret |
80 | 81 | ) |
81 | | - ).json()['access_token'] |
| 82 | + ).json() |
82 | 83 |
|
83 | | - self.__client = spotipy.Spotify(auth=self.__access_token) |
| 84 | + self.__access_token = response['access_token'] |
| 85 | + self.__refresh_token = response['refresh_token'] |
| 86 | + |
| 87 | + data = {'refresh_token' : self.__refresh_token} |
| 88 | + |
| 89 | + with open('.spotify_refresh_token.secret', 'wb') as f: |
| 90 | + pickle.dump(data, f) |
| 91 | + |
| 92 | + |
| 93 | + def __getAccessTokenByRefreshToken(self, refresh_token): |
| 94 | + response = requests.post('https://accounts.spotify.com/api/token?', |
| 95 | + { |
| 96 | + 'grant_type': 'refresh_token', |
| 97 | + 'refresh_token': str(refresh_token), |
| 98 | + 'client_id': self.__client_id, |
| 99 | + 'client_secret': self.__client_secret |
| 100 | + } |
| 101 | + ).json() |
| 102 | + self.__access_token = response['access_token'] |
| 103 | + |
| 104 | + |
| 105 | + def __getRefreshToken(self): |
| 106 | + try: |
| 107 | + |
| 108 | + with open('.spotify_refresh_token.secret', 'rb') as f: |
| 109 | + data = pickle.load(f) |
| 110 | + self.__getAccessTokenByRefreshToken(data['refresh_token']) |
| 111 | + |
| 112 | + except: |
| 113 | + self.__getAccessToken() |
| 114 | + |
| 115 | + |
| 116 | + def __getData(self): |
| 117 | + try: |
| 118 | + |
| 119 | + with open('.spotify_data.secret', 'rb') as f: |
| 120 | + data = pickle.load(f) |
| 121 | + |
| 122 | + self.__client_id = data['client_id'] |
| 123 | + self.__client_secret = data['client_secret'] |
| 124 | + |
| 125 | + except: |
| 126 | + print(''' |
| 127 | + A new version is available on GitHub.\n |
| 128 | + Download: https://github.com/artyshko/smd |
| 129 | + ''') |
| 130 | + sys.exit() |
84 | 131 |
|
85 | 132 |
|
86 | 133 | def getPlaylistTracks(self, playlist_uri): |
@@ -110,47 +157,64 @@ def getPlaylistTracks(self, playlist_uri): |
110 | 157 | 'name' : data['name'], |
111 | 158 | 'artist' : [ artist['name'] for artist in data['artists']], |
112 | 159 | 'album' : data['album']['name'], |
113 | | - 'image' : data['album']['images'][0]['url'] |
| 160 | + 'image' : data['album']['images'][0]['url'], |
| 161 | + 'duration_ms':data['duration_ms'] |
114 | 162 | }) |
115 | 163 |
|
116 | 164 | return tracks |
117 | 165 |
|
118 | 166 |
|
119 | | - def __init__( |
120 | | - self, |
121 | | - client_id = '83e4430b4700434baa21228a9c7d11c5', |
122 | | - client_secret = '9bb9e131ff28424cb6a420afdf41d44a' |
123 | | - ): |
| 167 | + def __init__(self): |
124 | 168 |
|
125 | 169 | ''' |
126 | 170 | Init function |
127 | 171 | Creating spotify object with access_token |
128 | 172 |
|
129 | | - :param client_id: spotify client_id parametr |
130 | | - :param client_secret: spotify client_secret parametr |
131 | 173 | :return: None |
132 | 174 | ''' |
133 | 175 |
|
134 | 176 | self.__url = 'https://accounts.spotify.com/api/token' |
135 | | - self.__client_id = client_id |
136 | | - self.__client_secret = client_secret |
137 | 177 | self.__grant_type = 'client_credentials' |
138 | 178 | self.__body_params = { |
139 | 179 | 'grant_type': self.__grant_type |
140 | 180 | } |
141 | 181 |
|
| 182 | + self.__getData() |
| 183 | + self.__getAccessToken() |
| 184 | + |
| 185 | + #initialization of spotify client |
| 186 | + self.client = spotipy.Spotify(self.__access_token) |
| 187 | + |
| 188 | + |
| 189 | + def __getData(self): |
| 190 | + try: |
| 191 | + |
| 192 | + with open('.spotify_data.secret', 'rb') as f: |
| 193 | + data = pickle.load(f) |
| 194 | + |
| 195 | + self.__client_id = data['client_id'] |
| 196 | + self.__client_secret = data['client_secret'] |
| 197 | + |
| 198 | + except: |
| 199 | + print(''' |
| 200 | + A new version is available on GitHub.\n |
| 201 | + Download: https://github.com/artyshko/smd |
| 202 | + ''') |
| 203 | + sys.exit() |
| 204 | + |
| 205 | + |
| 206 | + def __getAccessToken(self): |
142 | 207 | #getting access_token by POST request to Spotify API |
143 | | - self.__access_token = requests.post( |
| 208 | + response = requests.post( |
144 | 209 | self.__url, |
145 | 210 | data=self.__body_params, |
146 | 211 | auth=( |
147 | 212 | self.__client_id, |
148 | 213 | self.__client_secret |
149 | 214 | ) |
150 | | - ).json()['access_token'] |
| 215 | + ).json() |
151 | 216 |
|
152 | | - #initialization of spotify client |
153 | | - self.client = spotipy.Spotify(self.__access_token) |
| 217 | + self.__access_token = response['access_token'] |
154 | 218 |
|
155 | 219 |
|
156 | 220 | def getSongInfo(self, uri): |
@@ -185,11 +249,13 @@ def search(self, query): |
185 | 249 | except: |
186 | 250 | return False |
187 | 251 |
|
| 252 | + |
188 | 253 | def getDuration(self, uri): |
189 | 254 |
|
190 | 255 | data = self.client.track(uri) |
191 | 256 | return data['duration_ms'] |
192 | 257 |
|
| 258 | + |
193 | 259 | def getAlbum(self, uri): |
194 | 260 | try: |
195 | 261 |
|
|
0 commit comments