| 
					
					
						
							
						
					
					
				 | 
				@ -5,7 +5,9 @@ import random | 
			
		
		
	
		
			
				 | 
				 | 
				import requests | 
				 | 
				 | 
				import requests | 
			
		
		
	
		
			
				 | 
				 | 
				import os | 
				 | 
				 | 
				import os | 
			
		
		
	
		
			
				 | 
				 | 
				import urllib | 
				 | 
				 | 
				import urllib | 
			
		
		
	
		
			
				 | 
				 | 
				import datetime | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				from datetime import datetime | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				TIME_FORMAT = '%Y-%m-%d-%H-%M-%S' | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				def generate_random_string(length): | 
				 | 
				 | 
				def generate_random_string(length): | 
			
		
		
	
		
			
				 | 
				 | 
				    """Generates a random string of a certain length | 
				 | 
				 | 
				    """Generates a random string of a certain length | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -32,7 +34,7 @@ def token_expired(token_obtained_at, valid_for): | 
			
		
		
	
		
			
				 | 
				 | 
				        token_obtained_at: datetime object representing the date and time when the token was obtained | 
				 | 
				 | 
				        token_obtained_at: datetime object representing the date and time when the token was obtained | 
			
		
		
	
		
			
				 | 
				 | 
				        valid_for: the time duration for which the token is valid, in seconds | 
				 | 
				 | 
				        valid_for: the time duration for which the token is valid, in seconds | 
			
		
		
	
		
			
				 | 
				 | 
				    """ | 
				 | 
				 | 
				    """ | 
			
		
		
	
		
			
				 | 
				 | 
				    time_elapsed = (datetime.datetime.today() - token_obtained_at).seconds | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    time_elapsed = (datetime.today() - token_obtained_at).total_seconds() | 
			
		
		
	
		
			
				 | 
				 | 
				    return time_elapsed >= valid_for | 
				 | 
				 | 
				    return time_elapsed >= valid_for | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -78,13 +80,33 @@ def callback(request): | 
			
		
		
	
		
			
				 | 
				 | 
				    response = requests.post('https://accounts.spotify.com/api/token', data = payload).json() | 
				 | 
				 | 
				    response = requests.post('https://accounts.spotify.com/api/token', data = payload).json() | 
			
		
		
	
		
			
				 | 
				 | 
				    # despite its name, datetime.today() returns a datetime object, not a date object | 
				 | 
				 | 
				    # despite its name, datetime.today() returns a datetime object, not a date object | 
			
		
		
	
		
			
				 | 
				 | 
				    # use datetime.strptime() to get a datetime object from a string | 
				 | 
				 | 
				    # use datetime.strptime() to get a datetime object from a string | 
			
		
		
	
		
			
				 | 
				 | 
				    request.session['token_obtained_at'] = str(datetime.datetime.today())  | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    request.session['token_obtained_at'] = datetime.strftime(datetime.today(), TIME_FORMAT)  | 
			
		
		
	
		
			
				 | 
				 | 
				    request.session['access_token'] = response['access_token'] | 
				 | 
				 | 
				    request.session['access_token'] = response['access_token'] | 
			
		
		
	
		
			
				 | 
				 | 
				    request.session['refresh_token'] = response['refresh_token'] | 
				 | 
				 | 
				    request.session['refresh_token'] = response['refresh_token'] | 
			
		
		
	
		
			
				 | 
				 | 
				    request.session['valid_for'] = response['expires_in'] | 
				 | 
				 | 
				    request.session['valid_for'] = response['expires_in'] | 
			
		
		
	
		
			
				 | 
				 | 
				    print(response) | 
				 | 
				 | 
				    print(response) | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				    auth_token_str = "Bearer " + response['access_token'] | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    return redirect('user_data') | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				def user_data(request): | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    token_obtained_at = datetime.strptime(request.session['token_obtained_at'], TIME_FORMAT) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    valid_for = int(request.session['valid_for']) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if token_expired(token_obtained_at, valid_for): | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        req_body = { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            'grant_type': 'refresh_token', | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            'refresh_token': request.session['refresh_token'], | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            'client_id': os.environ['SPOTIFY_CLIENT_ID'], | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            'client_secret': os.environ['SPOTIFY_CLIENT_SECRET'] | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				         | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        refresh_token_response = requests.post('https://accounts.spotify.com/api/token', data = req_body).json() | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        request.session['access_token'] = refresh_token_response['access_token'] | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        request.session['valid_for'] = refresh_token_response['expires_in'] | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    auth_token_str = "Bearer " + request.session['access_token'] | 
			
		
		
	
		
			
				 | 
				 | 
				    headers = { | 
				 | 
				 | 
				    headers = { | 
			
		
		
	
		
			
				 | 
				 | 
				        'Authorization': auth_token_str | 
				 | 
				 | 
				        'Authorization': auth_token_str | 
			
		
		
	
		
			
				 | 
				 | 
				    } | 
				 | 
				 | 
				    } | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
					
				 | 
				
  |