Browse Source

Added admin command to scan personal history (#58)

Reverted exported history file to exclude timestamp. Simplified logging
for scanning user history.
master
Kevin Mok 6 years ago
parent
commit
4ddf11aa41
  1. 1
      .gitignore
  2. 10
      api/management/commands/update-history.py
  3. 13
      api/utils.py
  4. 54
      api/views.py
  5. 5
      graphs/views.py
  6. 1
      update-history.sh

1
.gitignore

@ -1,4 +1,5 @@
*.pyc *.pyc
*.log
db.sqlite3 db.sqlite3
*.bak *.bak
.idea/ .idea/

10
api/management/commands/update-history.py

@ -0,0 +1,10 @@
from django.core.management.base import BaseCommand, CommandError
from api.utils import parse_history
from login.models import User
class Command(BaseCommand):
help = 'Update history for users who requested it'
def handle(self, *args, **options):
user_id = "polarbier"
parse_history(User.objects.get(id=user_id).secret)

13
api/utils.py

@ -13,13 +13,14 @@ from . import views
from login.models import User from login.models import User
from pprint import pprint from pprint import pprint
from dateutil.parser import parse from dateutil.parser import parse
from datetime import datetime
HISTORY_ENDPOINT = 'https://api.spotify.com/v1/me/player/recently-played' HISTORY_ENDPOINT = 'https://api.spotify.com/v1/me/player/recently-played'
# }}} imports # # }}} imports #
console_logging = True
# console_logging = False
# console_logging = True
console_logging = False
artists_genre_processed = 0 artists_genre_processed = 0
features_processed = 0 features_processed = 0
@ -365,8 +366,7 @@ def parse_history(user_secret):
params=payload).json()['items'] params=payload).json()['items']
# pprint(history_response) # pprint(history_response)
if console_logging:
tracks_processed = 0
tracks_processed = 0
for track_dict in history_response: for track_dict in history_response:
# don't associate history track with User, not necessarily in their # don't associate history track with User, not necessarily in their
@ -379,9 +379,9 @@ def parse_history(user_secret):
track_artists, None) track_artists, None)
history_obj = save_history_obj(user_obj, parse(track_dict['played_at']), history_obj = save_history_obj(user_obj, parse(track_dict['played_at']),
track_obj) track_obj)
tracks_processed += 1
if console_logging: if console_logging:
tracks_processed += 1
print("Added history track #{}: {}".format( print("Added history track #{}: {}".format(
tracks_processed, history_obj,)) tracks_processed, history_obj,))
@ -391,5 +391,8 @@ def parse_history(user_secret):
# TODO: update track genres from History relation # TODO: update track genres from History relation
# update_track_genres(user_obj) # update_track_genres(user_obj)
print("Scanned {} history tracks for user {} at {}.".format(
tracks_processed, user_obj.id, datetime.now()))
# }}} get_history # # }}} get_history #

54
api/views.py

@ -115,59 +115,7 @@ def parse_library(request, user_secret):
# }}} parse_library # # }}} parse_library #
# # parse_history {{{ #
# def parse_history(request, user_secret):
# """Scans user's listening history and stores the information in a
# database.
# :user_secret: secret for User object who's library is being scanned.
# :returns: None
# """
# user_obj = User.objects.get(secret=user_secret)
# payload = {'limit': str(USER_TRACKS_LIMIT)}
# last_time_played = History.objects.filter(user=user_obj).aggregate(Max('timestamp'))['timestamp__max']
# if last_time_played is not None:
# payload['after'] = last_time_played.isoformat()
# artist_genre_queue = []
# user_headers = get_user_header(user_obj)
# history_response = requests.get(HISTORY_ENDPOINT,
# headers=user_headers,
# params=payload).json()['items']
# # pprint(history_response)
# if console_logging:
# tracks_processed = 0
# for track_dict in history_response:
# # don't associate history track with User, not necessarily in their
# # library
# # track_obj, track_created = save_track_obj(track_dict['track'],
# # track_artists, None)
# track_artists = save_track_artists(track_dict['track'], artist_genre_queue,
# user_headers)
# track_obj, track_created = save_track_obj(track_dict['track'],
# track_artists, None)
# history_obj = save_history_obj(user_obj, parse(track_dict['played_at']),
# track_obj)
# if console_logging:
# tracks_processed += 1
# print("Added history track #{}: {}".format(
# tracks_processed, history_obj,))
# if len(artist_genre_queue) > 0:
# add_artist_genres(user_headers, artist_genre_queue)
# # TODO: update track genres from History relation
# # update_track_genres(user_obj)
# return render(request, 'graphs/logged_in.html', get_user_context(user_obj))
# # }}} get_history #
# parse_history {{{ #
# parse_history_request {{{ #
def parse_history_request(request, user_secret): def parse_history_request(request, user_secret):
"""Request function to call parse_history. Scans user's listening history """Request function to call parse_history. Scans user's listening history

5
graphs/views.py

@ -71,8 +71,9 @@ class HistoryList(ExportMixin, SingleTableView):
def get_export_filename(self, export_format): def get_export_filename(self, export_format):
user_id = self.request.session['user_id'] user_id = self.request.session['user_id']
timestamp = strftime("%m%d%Y-%H%M")
return "{}.{}".format("-".join((user_id, timestamp)), export_format)
# timestamp = strftime("%m%d%Y-%H%M")
# return "{}.{}".format("-".join((user_id, timestamp)), export_format)
return "{}.{}".format(user_id, export_format)
def create_export(self, export_format): def create_export(self, export_format):
export_exclude = ('id', 'user', 'track', 'track_name', 'artists', export_exclude = ('id', 'user', 'track', 'track_name', 'artists',

1
update-history.sh

@ -0,0 +1 @@
/home/kevin/coding/spotify-lib-vis/bin/python /home/kevin/coding/spotify-lib-vis/src/manage.py update-history >> /home/kevin/coding/spotify-lib-vis/src/api/management/commands/update-history.log
Loading…
Cancel
Save