Adds object creation from spotify

Now includes functions to convert json to track, artist and album
This commit is contained in:
2024-02-06 01:13:57 +01:00
parent 727cfc9a14
commit e7ee92868f
4 changed files with 87 additions and 9 deletions
+71 -3
View File
@@ -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):
+1 -1
View File
@@ -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
+1 -1
View File
@@ -2,5 +2,5 @@ from django.urls import path
from . import views
urlpatterns = [
path('tracks/', views.TrackView.as_view()),
path('track/<str:spotify_id>', views.TrackView.as_view()),
]
+14 -4
View File
@@ -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"])