Change database settings
Edited settings.py to use PostgreSQL. Made some minor changes in views.py to incorporate the new models.
This commit is contained in:
@@ -76,8 +76,12 @@ WSGI_APPLICATION = 'musicvis.wsgi.application'
|
|||||||
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
'default': {
|
'default': {
|
||||||
'ENGINE': 'django.db.backends.sqlite3',
|
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||||
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
|
'NAME': 'spotifyvis',
|
||||||
|
'USER': 'django',
|
||||||
|
'PASSWORD': 'django',
|
||||||
|
'HOST': 'localhost',
|
||||||
|
'PORT': '',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ idna==2.6
|
|||||||
isort==4.3.4
|
isort==4.3.4
|
||||||
lazy-object-proxy==1.3.1
|
lazy-object-proxy==1.3.1
|
||||||
mccabe==0.6.1
|
mccabe==0.6.1
|
||||||
|
psycopg2==2.7.4
|
||||||
pylint==1.8.4
|
pylint==1.8.4
|
||||||
pytz==2018.4
|
pytz==2018.4
|
||||||
requests==2.18.4
|
requests==2.18.4
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
class Artist(models.Model):
|
|
||||||
|
|
||||||
|
class Artist(models.Model):
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Artist"
|
verbose_name = "Artist"
|
||||||
verbose_name_plural = "Artists"
|
verbose_name_plural = "Artists"
|
||||||
@@ -16,13 +16,12 @@ class Artist(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
class User(models.Model):
|
class User(models.Model):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "User"
|
verbose_name = "User"
|
||||||
verbose_name_plural = "Users"
|
verbose_name_plural = "Users"
|
||||||
|
|
||||||
user_id = models.CharField(primary_key=True, max_length=30)
|
user_id = models.CharField(primary_key=True, max_length=30) # the user's Spotify ID
|
||||||
username = models.CharField(max_length=30)
|
username = models.CharField(max_length=30) # User's Spotify user name, if set
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.username
|
return self.username
|
||||||
@@ -65,5 +64,3 @@ class AudioFeatures(models.Model):
|
|||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return super(AudioFeatures, self).__str__()
|
return super(AudioFeatures, self).__str__()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
import requests
|
import requests
|
||||||
import math
|
import math
|
||||||
import pprint
|
import pprint
|
||||||
|
from .models import Artist, User, Track, AudioFeatures
|
||||||
|
|
||||||
# parse_library {{{ #
|
# parse_library {{{ #
|
||||||
|
|
||||||
def parse_library(headers, tracks, library_stats):
|
def parse_library(headers, tracks, library_stats, user):
|
||||||
"""Scans user's library for certain number of tracks to update library_stats with.
|
"""Scans user's library for certain number of tracks to update library_stats with.
|
||||||
|
|
||||||
:headers: For API call.
|
:headers: For API call.
|
||||||
:tracks: Number of tracks to get from user's library.
|
:tracks: Number of tracks to get from user's library.
|
||||||
:library_stats: Dictionary containing the data mined from user's library
|
:library_stats: Dictionary containing the data mined from user's library
|
||||||
|
:user: a User object representing the user whose library we are parsing
|
||||||
|
|
||||||
:returns: None
|
:returns: None
|
||||||
|
|
||||||
@@ -20,20 +22,25 @@ def parse_library(headers, tracks, library_stats):
|
|||||||
# keeps track of point to get songs from
|
# keeps track of point to get songs from
|
||||||
offset = 0
|
offset = 0
|
||||||
payload = {'limit': str(limit)}
|
payload = {'limit': str(limit)}
|
||||||
|
# use two separate variables to track, because the average popularity also requires num_samples
|
||||||
|
num_samples = 0 # number of actual track samples
|
||||||
|
feature_data_points = 0 # number of feature data analyses (some tracks do not have analyses available)
|
||||||
|
|
||||||
for _ in range(0, tracks, limit):
|
for _ in range(0, tracks, limit):
|
||||||
payload['offset'] = str(offset)
|
payload['offset'] = str(offset)
|
||||||
saved_tracks_response = requests.get('https://api.spotify.com/v1/me/tracks', headers=headers, params=payload).json()
|
saved_tracks_response = requests.get('https://api.spotify.com/v1/me/tracks', headers=headers, params=payload).json()
|
||||||
num_samples = offset
|
|
||||||
for track_dict in saved_tracks_response['items']:
|
for track_dict in saved_tracks_response['items']:
|
||||||
# Track the number of samples for calculating
|
num_samples += 1
|
||||||
# audio feature averages and standard deviations on the fly
|
|
||||||
get_track_info(track_dict['track'], library_stats, num_samples)
|
get_track_info(track_dict['track'], library_stats, num_samples)
|
||||||
# get_genre(headers, track_dict['track']['album']['id'])
|
# get_genre(headers, track_dict['track']['album']['id'])
|
||||||
audio_features_dict = get_audio_features(headers, track_dict['track']['id'])
|
audio_features_dict = get_audio_features(headers, track_dict['track']['id'])
|
||||||
if len(audio_features_dict) != 0:
|
if len(audio_features_dict) != 0:
|
||||||
num_samples += 1
|
# Track the number of audio analyses for calculating
|
||||||
|
# audio feature averages and standard deviations on the fly
|
||||||
|
feature_data_points += 1
|
||||||
|
|
||||||
for feature, feature_data in audio_features_dict.items():
|
for feature, feature_data in audio_features_dict.items():
|
||||||
update_audio_feature_stats(feature, feature_data, num_samples, library_stats)
|
update_audio_feature_stats(feature, feature_data, feature_data_points, library_stats)
|
||||||
for artist_dict in track_dict['track']['artists']:
|
for artist_dict in track_dict['track']['artists']:
|
||||||
increase_artist_count(headers, artist_dict['name'], artist_dict['id'], library_stats)
|
increase_artist_count(headers, artist_dict['name'], artist_dict['id'], library_stats)
|
||||||
# calculates num_songs with offset + songs retrieved
|
# calculates num_songs with offset + songs retrieved
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ import json
|
|||||||
import pprint
|
import pprint
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from .utils import parse_library, process_library_stats
|
from .utils import parse_library, process_library_stats
|
||||||
|
from .models import User, Track, AudioFeatures, Artist
|
||||||
|
|
||||||
TIME_FORMAT = '%Y-%m-%d-%H-%M-%S'
|
TIME_FORMAT = '%Y-%m-%d-%H-%M-%S'
|
||||||
library_stats = {"audio_features":{}, "genres":{}, "year_released":{}, "artists":{}, "num_songs":0, "popularity":[], "total_runtime":0}
|
TRACKS_TO_QUERY = 5
|
||||||
|
|
||||||
# generate_random_string {{{ #
|
# generate_random_string {{{ #
|
||||||
|
|
||||||
@@ -133,12 +134,18 @@ def user_data(request):
|
|||||||
}
|
}
|
||||||
|
|
||||||
user_data_response = requests.get('https://api.spotify.com/v1/me', headers = headers).json()
|
user_data_response = requests.get('https://api.spotify.com/v1/me', headers = headers).json()
|
||||||
context = {
|
request.session['user_id'] = user_data_response['id'] # store the user_id so it may be used to create model
|
||||||
'user_name': user_data_response['display_name'],
|
request.session['user_name'] = user_data_response['display_name']
|
||||||
'id': user_data_response['id'],
|
user = None # will be set to the current user object later
|
||||||
}
|
try:
|
||||||
|
user = User.objects.get(user_id=request.session['user_id'])
|
||||||
|
except User.DoesNotExist:
|
||||||
|
user = User.objects.create(user_id=request.session['user_id'], user_name=request.session['user_name'])
|
||||||
|
# context = {
|
||||||
|
# 'user_name': user_data_response['display_name'],
|
||||||
|
# 'id': user_data_response['id'],
|
||||||
|
# }
|
||||||
|
|
||||||
tracks_to_query = 5
|
|
||||||
library_stats = {
|
library_stats = {
|
||||||
"audio_features":{},
|
"audio_features":{},
|
||||||
"genres":{},
|
"genres":{},
|
||||||
@@ -151,7 +158,7 @@ def user_data(request):
|
|||||||
},
|
},
|
||||||
"total_runtime": 0
|
"total_runtime": 0
|
||||||
}
|
}
|
||||||
parse_library(headers, tracks_to_query, library_stats)
|
parse_library(headers, TRACKS_TO_QUERY, library_stats, user)
|
||||||
processed_library_stats = process_library_stats(library_stats)
|
processed_library_stats = process_library_stats(library_stats)
|
||||||
print("================================================")
|
print("================================================")
|
||||||
print("Processed data follows\n")
|
print("Processed data follows\n")
|
||||||
|
|||||||
Reference in New Issue
Block a user