Setup AudioFeatures table

This commit is contained in:
2018-06-06 05:36:00 -04:00
parent cdcc33c014
commit 62cc6c8ccd
4 changed files with 105 additions and 15 deletions

View File

@@ -0,0 +1,53 @@
# Generated by Django 2.0.5 on 2018-06-06 09:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('spotifyvis', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='audiofeatures',
name='acousticness',
field=models.DecimalField(decimal_places=3, max_digits=3),
),
migrations.AlterField(
model_name='audiofeatures',
name='danceability',
field=models.DecimalField(decimal_places=3, max_digits=3),
),
migrations.AlterField(
model_name='audiofeatures',
name='energy',
field=models.DecimalField(decimal_places=3, max_digits=3),
),
migrations.AlterField(
model_name='audiofeatures',
name='instrumentalness',
field=models.DecimalField(decimal_places=3, max_digits=3),
),
migrations.AlterField(
model_name='audiofeatures',
name='loudness',
field=models.DecimalField(decimal_places=3, max_digits=3),
),
migrations.AlterField(
model_name='audiofeatures',
name='speechiness',
field=models.DecimalField(decimal_places=3, max_digits=3),
),
migrations.AlterField(
model_name='audiofeatures',
name='tempo',
field=models.DecimalField(decimal_places=3, max_digits=3),
),
migrations.AlterField(
model_name='audiofeatures',
name='valence',
field=models.DecimalField(decimal_places=3, max_digits=3),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 2.0.5 on 2018-06-06 09:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('spotifyvis', '0002_auto_20180606_0523'),
]
operations = [
migrations.AlterField(
model_name='audiofeatures',
name='loudness',
field=models.DecimalField(decimal_places=3, max_digits=6),
),
migrations.AlterField(
model_name='audiofeatures',
name='tempo',
field=models.DecimalField(decimal_places=3, max_digits=6),
),
]

View File

@@ -67,14 +67,14 @@ class AudioFeatures(models.Model):
verbose_name_plural = "AudioFeatures" verbose_name_plural = "AudioFeatures"
track = models.OneToOneField(Track, on_delete=models.CASCADE, primary_key=True,) track = models.OneToOneField(Track, on_delete=models.CASCADE, primary_key=True,)
danceability = models.DecimalField(decimal_places=2, max_digits=2) acousticness = models.DecimalField(decimal_places=3, max_digits=3)
energy = models.DecimalField(decimal_places=2, max_digits=2) danceability = models.DecimalField(decimal_places=3, max_digits=3)
loudness = models.DecimalField(decimal_places=2, max_digits=2) energy = models.DecimalField(decimal_places=3, max_digits=3)
speechiness = models.DecimalField(decimal_places=2, max_digits=2) instrumentalness = models.DecimalField(decimal_places=3, max_digits=3)
acousticness = models.DecimalField(decimal_places=2, max_digits=2) loudness = models.DecimalField(decimal_places=3, max_digits=6)
instrumentalness = models.DecimalField(decimal_places=2, max_digits=2) speechiness = models.DecimalField(decimal_places=3, max_digits=3)
valence = models.DecimalField(decimal_places=2, max_digits=2) tempo = models.DecimalField(decimal_places=3, max_digits=6)
tempo = models.DecimalField(decimal_places=2, max_digits=2) valence = models.DecimalField(decimal_places=3, max_digits=3)
def __str__(self): def __str__(self):
return super(AudioFeatures, self).__str__() return super(AudioFeatures, self).__str__()

View File

@@ -51,9 +51,10 @@ def parse_library(headers, tracks, library_stats, user):
name=artist_dict['name'], name=artist_dict['name'],
)[0]) )[0])
save_track_obj(track_dict['track'], track_artists, user) track_obj = save_track_obj(track_dict['track'], track_artists, user)
get_track_info(track_dict['track'], library_stats, num_samples) get_track_info(track_dict['track'], library_stats, num_samples)
audio_features_dict = get_audio_features(headers, track_dict['track']['id']) audio_features_dict = get_audio_features(headers,
track_dict['track']['id'], track_obj)
if len(audio_features_dict) != 0: if len(audio_features_dict) != 0:
# Track the number of audio analyses for calculating # Track the number of audio analyses for calculating
# audio feature averages and standard deviations on the fly # audio feature averages and standard deviations on the fly
@@ -70,16 +71,19 @@ def parse_library(headers, tracks, library_stats, user):
# }}} parse_library # # }}} parse_library #
# save_track_obj {{{ #
def save_track_obj(track_dict, artists, user): def save_track_obj(track_dict, artists, user):
"""Make an entry in the database for this track if it doesn't exist already. """Make an entry in the database for this track if it doesn't exist already.
:track_dict: TODO :track_dict: dictionary from the API call containing track information.
:artists: artists of the song, passed in as a list of Artist objects. :artists: artists of the song, passed in as a list of Artist objects.
:user: TODO :user: User object for which this Track is to be associated with.
:returns: None :returns: The created/retrieved Track object.
""" """
if len(Track.objects.filter(track_id__exact=track_dict['id'])) == 0: track_obj_query = Track.objects.filter(track_id__exact=track_dict['id'])
if len(track_obj_query) == 0:
new_track = Track.objects.create( new_track = Track.objects.create(
track_id=track_dict['id'], track_id=track_dict['id'],
year=track_dict['album']['release_date'].split('-')[0], year=track_dict['album']['release_date'].split('-')[0],
@@ -95,15 +99,21 @@ def save_track_obj(track_dict, artists, user):
new_track.artists.add(artist) new_track.artists.add(artist)
new_track.users.add(user) new_track.users.add(user)
new_track.save() new_track.save()
return new_track
elif len(track_obj_query) == 1:
return track_obj_query[0]
# }}} save_track_obj #
# get_audio_features {{{ # # get_audio_features {{{ #
def get_audio_features(headers, track_id): def get_audio_features(headers, track_id, track):
"""Returns the audio features of a soundtrack """Returns the audio features of a soundtrack
Args: Args:
headers: headers containing the API token headers: headers containing the API token
track_id: the id of the soundtrack, needed to query the Spotify API track_id: the id of the soundtrack, needed to query the Spotify API
track: Track object to associate with the AudioFeatures object
Returns: Returns:
A dictionary with the features as its keys, if audio feature data is missing for the track, A dictionary with the features as its keys, if audio feature data is missing for the track,
@@ -119,9 +129,13 @@ def get_audio_features(headers, track_id):
useless_keys = [ useless_keys = [
"key", "mode", "type", "liveness", "id", "uri", "track_href", "analysis_url", "time_signature", "key", "mode", "type", "liveness", "id", "uri", "track_href", "analysis_url", "time_signature",
] ]
audio_features_entry = AudioFeatures()
audio_features_entry.track = track
for key, val in response.items(): for key, val in response.items():
if key not in useless_keys: if key not in useless_keys:
features_dict[key] = val features_dict[key] = val
setattr(audio_features_entry, key, val)
audio_features_entry.save()
return features_dict return features_dict