From e7ee92868f68d2a603c2c834e413f7fde40ab348 Mon Sep 17 00:00:00 2001 From: Mark Hoekveen Date: Tue, 6 Feb 2024 01:13:57 +0100 Subject: [PATCH] Adds object creation from spotify Now includes functions to convert json to track, artist and album --- playlist/models.py | 74 +++++++++++++++++++++++++++++++++++++++++++-- playlist/spotify.py | 2 +- playlist/urls.py | 2 +- playlist/views.py | 18 ++++++++--- 4 files changed, 87 insertions(+), 9 deletions(-) diff --git a/playlist/models.py b/playlist/models.py index e2d26c7..f8e7f61 100644 --- a/playlist/models.py +++ b/playlist/models.py @@ -1,12 +1,44 @@ from django.db import models +class ArtistManager(models.Manager): + def from_json(self, json): + try: + return Artist.objects.get(pk=json["id"]) + except Artist.DoesNotExist: + keys = [f.name for f in Artist._meta.get_fields()] + subset = {key:json[key] for key in set(keys) & set(json.keys())} + artist = self.create(**subset) + return artist + class Artist(models.Model): + def __str__(self): + return self.name id = models.CharField(primary_key=True, max_length=128) name = models.CharField(max_length=255) popularity = models.SmallIntegerField(null=True, blank=True) - genres = models.JSONField() + genres = models.JSONField(null=True) + + objects = ArtistManager() + +class AlbumManager(models.Manager): + def from_json(self, json): + try: + return Album.objects.get(pk=json["id"]) + except Album.DoesNotExist: + artists = [] + for artist in json["artists"]: + artists.append(Artist.objects.from_json(artist)) + del json["artists"] + keys = [f.name for f in Album._meta.get_fields()] + subset = {key:json[key] for key in set(keys) & set(json.keys())} + album = self.create(**subset) + for artist in artists: + album.artists.add(artist) + return album class Album(models.Model): + def __str__(self): + return self.name id = models.CharField(primary_key=True, max_length=128) name = models.CharField(max_length=255) artists = models.ManyToManyField(Artist) @@ -14,10 +46,42 @@ class Album(models.Model): total_tracks = models.PositiveSmallIntegerField(null=True) image = models.ImageField(upload_to="albums/") + objects = AlbumManager() + +class TrackManager(models.Manager): + def get_queryset(self): + return super().get_queryset().filter(old=False) + def from_json(self, json): + artists = [] + for artist in json["artists"]: + artists.append(Artist.objects.from_json(artist)) + del json["artists"] + + album = Album.objects.from_json(json["album"]) + del json["album"] + + keys = [f.name for f in Track._meta.get_fields()] + subset = {key:json[key] for key in set(keys) & set(json.keys())} + track = self.create(**subset) + track.album = album + for artist in artists: + track.artists.add(artist) + track.save() + return track class Track(models.Model): + def __str__(self): + s = f"'{self.name}'" + if self.artists.count() > 0: + artists = list(map(lambda a:a.name, self.artists.all())) + s += " by " + s += " & ".join(artists) + + if self.explicit: + s += " PARENTAL ADVISORY" + return s id = models.CharField(primary_key=True, max_length=128) - title = models.CharField(max_length=255) + name = models.CharField(max_length=255) artists = models.ManyToManyField(Artist) album = models.ForeignKey(Album, null=True, on_delete=models.SET_NULL) @@ -25,6 +89,10 @@ class Track(models.Model): duration_ms = models.PositiveIntegerField(null=True) popularity = models.PositiveIntegerField(null=True) - banter = models.TextField() + banter = models.TextField(blank=True) + + old = models.BooleanField(default=False) + + objects = TrackManager() #class TrackFeatures(models.Model): diff --git a/playlist/spotify.py b/playlist/spotify.py index cee121d..80b3074 100644 --- a/playlist/spotify.py +++ b/playlist/spotify.py @@ -5,7 +5,7 @@ from dotenv import load_dotenv load_dotenv() -class SpotifyFactory(): +class Spotify(): def __init__(self): self.token = None self.valid_until = None diff --git a/playlist/urls.py b/playlist/urls.py index 004c626..44dc186 100644 --- a/playlist/urls.py +++ b/playlist/urls.py @@ -2,5 +2,5 @@ from django.urls import path from . import views urlpatterns = [ - path('tracks/', views.TrackView.as_view()), + path('track/', views.TrackView.as_view()), ] diff --git a/playlist/views.py b/playlist/views.py index df67480..6f69feb 100644 --- a/playlist/views.py +++ b/playlist/views.py @@ -4,8 +4,18 @@ from django.http import HttpResponse from . import models from . import spotify +spt = spotify.Spotify() + class TrackView(View): - def get(self, request): - return HttpResponse("Hello world!") - def post(self, request): - return HttpResponse("Bye world") + def get(self, request, spotify_id): + # TODO: Dit is eigenlijk wat moet gebeuren op post + try: + track = models.Track.objects.get(pk=spotify_id) + except models.Track.DoesNotExist: + data = spt.get_song_info(spotify_id) + track = models.Track.objects.from_json(data) + return HttpResponse(str(track)) + def post(self, request, spotify_id): + data = spt.get_song_info(spotify_id) + print(data) + return HttpResponse(data["name"])