Spotify user api integration

En een begin aan een playlist maker. Doet op het moment niet veel.
This commit is contained in:
2024-03-13 11:01:23 +01:00
parent aba8d64bed
commit 8dca25f861
15 changed files with 258 additions and 39 deletions
+61 -8
View File
@@ -3,15 +3,15 @@ from django.views import View
from django.http import HttpResponse, HttpResponseRedirect
from django.template.response import TemplateResponse
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Avg
from django.urls import reverse
import re
from collections import OrderedDict
from .models import Track, Artist, Album, Vote, Background, Profile
from .utils import from_json, get_unvoted
from . import spotify
from .spotify import spt
from .tasks import get_banter, get_and_dither_image
spt = spotify.Spotify()
class AuthView(View):
def get(self, request):
if request.user.is_authenticated:
@@ -29,7 +29,7 @@ class VoteView(LoginRequiredMixin, View):
try:
spotify_id = self.request.POST['spotify_id']
score = int(self.request.POST['vote'])
score = min(max(-2, score), 2)
score = min(max(1, score), 5)
track = Track.objects.get(pk=spotify_id)
try:
Vote.objects.get(user=request.user, track=track)
@@ -82,7 +82,8 @@ class NominateView(LoginRequiredMixin, View):
except Track.DoesNotExist:
try:
json = spt.get_song_info(spotify_id)
except:
except Exception as e:
print(e)
return TemplateResponse(request, "Nominate.html", {"error": "Fout bij het ophalen van het liedje."})
# Album artists
@@ -133,12 +134,22 @@ class SettingsView(LoginRequiredMixin, View):
"backgrounds": backgrounds,
"currentBackground": (profile.background.id if profile.background else 1)
}
spt_token = profile.get_or_update_spt()
if spt_token:
context["sptDisplayName"] = spt.get_profile(spt_token).get('display_name')
return TemplateResponse(request, "Settings.html", context)
def post(self, request):
try:
bg = Background.objects.get(pk=request.POST['background'])
bg = request.POST.get('background', None)
unlink_spotify = request.POST.get('unlink-spotify', None)
(profile,_) = Profile.objects.get_or_create(user=request.user)
profile.background = bg
if bg:
bg = Background.objects.get(pk=request.POST['background'])
profile.background = bg
if unlink_spotify:
print("unlink spt")
profile.unlink_spt()
profile.save()
except:
pass
@@ -183,4 +194,46 @@ class OverView(LoginRequiredMixin, View):
context = {
"artists": artists_ordered
}
return TemplateResponse(request, "Overview.html", context)
return TemplateResponse(request, "Overview.html", context)
class PlaylistMake(LoginRequiredMixin, View):
def get(self, request, count=None):
context = {}
if count:
#tracks = Track.objects.order_by('score')[count]
tracks = Track.objects.annotate(average_points=Avg('vote__points')).order_by('-average_points')[:count]
context["tracks"] = tracks
return TemplateResponse(request, "PlaylistMaker.html", context)
def post(self, request):
try:
count = int(self.request.POST['count'])
return self.get(request, count=count)
except Exception as e:
print(e)
return self.get(request)
class SpotifyView(LoginRequiredMixin, View):
def get(self, request):
url = spt.get_oauth_redirect()
return HttpResponseRedirect(url)
class SpotifyCallbackView(LoginRequiredMixin, View):
def get(self, request):
error = self.request.GET.get('error')
code = self.request.GET.get('code')
if error:
return TemplateResponse(request, "Nominate.html", {"error": "Je moet wel accepteren, pannenkoek."})
elif code:
(profile,_) = Profile.objects.get_or_create(user=request.user)
profile.init_spt(code)
# data = spt.get_user_token(code)
# access = data.get('access_token', None)
# refresh = data.get('refresh_token', None)
# expires = data.get('expires_in', 3600)
# if access and refresh:
# profile.set_spotify(access, refresh, expires)
# else:
# return TemplateResponse(request, "Nominate.html", {"error": "No."})
return HttpResponseRedirect(reverse('settings'))
#return TemplateResponse(request, "Nominate.html", {"warning": code})