Graphs and tables for your Spotify account.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.7 KiB

  1. # imports {{{ #
  2. import math
  3. import random
  4. import requests
  5. import os
  6. import urllib
  7. import secrets
  8. import pprint
  9. import string
  10. from datetime import datetime
  11. from django.http import JsonResponse
  12. from django.db.models import Count, Q
  13. from .utils import parse_library, get_artists_in_genre, update_track_genres
  14. from .models import User, Track, AudioFeatures, Artist
  15. # }}} imports #
  16. TRACKS_TO_QUERY = 200
  17. # get_artist_data {{{ #
  18. def get_artist_data(request, user_secret):
  19. """Returns artist data as a JSON serialized list of dictionaries
  20. The (key, value) pairs are (artist name, song count for said artist)
  21. :param request: the HTTP request
  22. :param user_secret: the user secret used for identification
  23. :return: a JsonResponse
  24. """
  25. user = User.objects.get(user_secret=user_secret)
  26. artist_counts = Artist.objects.annotate(num_songs=Count('track',
  27. filter=Q(track__users=user)))
  28. processed_artist_counts = [{'name': artist.name,
  29. 'num_songs': artist.num_songs} for artist in artist_counts]
  30. return JsonResponse(data=processed_artist_counts, safe=False)
  31. # }}} get_artist_data #
  32. # get_audio_feature_data {{{ #
  33. def get_audio_feature_data(request, audio_feature, user_secret):
  34. """Returns all data points for a given audio feature
  35. Args:
  36. request: the HTTP request
  37. audio_feature: The audio feature to be queried
  38. user_secret: client secret, used to identify the user
  39. """
  40. user = User.objects.get(user_secret=user_secret)
  41. user_tracks = Track.objects.filter(users=user)
  42. response_payload = {
  43. 'data_points': [],
  44. }
  45. for track in user_tracks:
  46. try:
  47. audio_feature_obj = AudioFeatures.objects.get(track=track)
  48. response_payload['data_points'].append(getattr(audio_feature_obj, audio_feature))
  49. except AudioFeatures.DoesNotExist:
  50. continue
  51. return JsonResponse(response_payload)
  52. # }}} get_audio_feature_data #
  53. # get_genre_data {{{ #
  54. def get_genre_data(request, user_secret):
  55. """Return genre data needed to create the graph user.
  56. TODO
  57. """
  58. user = User.objects.get(user_secret=user_secret)
  59. genre_counts = (Track.objects.filter(users__exact=user)
  60. .values('genre')
  61. .order_by('genre')
  62. .annotate(num_songs=Count('genre'))
  63. )
  64. for genre_dict in genre_counts:
  65. genre_dict['artists'] = get_artists_in_genre(user, genre_dict['genre'],
  66. genre_dict['num_songs'])
  67. print("*** Genre Breakdown ***")
  68. pprint.pprint(list(genre_counts))
  69. return JsonResponse(data=list(genre_counts), safe=False)
  70. # }}} get_genre_data #