Implement asynchronous playlist management for MusikGame creation and deletion

This commit is contained in:
Edgar P. Burkhart 2025-06-14 16:22:25 +02:00
parent 51b44bcec1
commit 3d180d3359
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227
3 changed files with 25 additions and 13 deletions

View file

@ -1,12 +1,12 @@
import google.oauth2.credentials
import googleapiclient.discovery
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import models from django.db import models
from django.db.models.functions import Lower from django.db.models.functions import Lower
from django.db.models.signals import post_delete from django.db.models.signals import post_delete, post_save
from django.dispatch import receiver from django.dispatch import receiver
from django.urls import reverse from django.urls import reverse
from . import tasks
class YoutubeCredentials(models.Model): class YoutubeCredentials(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE) user = models.OneToOneField(User, on_delete=models.CASCADE)
@ -57,18 +57,22 @@ class MusikGame(models.Model):
return reverse("game_detail", kwargs={"pk": self.pk}) return reverse("game_detail", kwargs={"pk": self.pk})
@receiver(post_save, sender=MusikGame)
def generateYoutubePlaylist(sender, instance, created, **kwargs):
if not instance.playlist_loading or instance.playlist:
return
if creds := instance.group.owner.youtubecredentials:
tasks.generate_playlist.delay_on_commit(creds.credentials, instance.pk)
@receiver(post_delete, sender=MusikGame) @receiver(post_delete, sender=MusikGame)
def deleteYoutubePlaylist(sender, instance, using, **kwargs): def deleteYoutubePlaylist(sender, instance, using, **kwargs):
if not instance.playlist: if not instance.playlist:
return return
game = instance if creds := instance.group.owner.youtubecredentials:
credentials = google.oauth2.credentials.Credentials( tasks.delete_playlist.delay_on_commit(creds.credentials, instance.playlist)
**game.group.owner.youtubecredentials.credentials
)
yt_api = googleapiclient.discovery.build("youtube", "v3", credentials=credentials)
pl_request = yt_api.playlists().delete(id=game.playlist)
pl_request.execute()
class MusicGameOrder(models.Model): class MusicGameOrder(models.Model):

View file

@ -43,3 +43,12 @@ def generate_playlist(creds, game_pk):
game.playlist_loading = False game.playlist_loading = False
game.save() game.save()
@shared_task
def delete_playlist(creds, playlist_id):
credentials = google.oauth2.credentials.Credentials(**creds)
yt_api = googleapiclient.discovery.build("youtube", "v3", credentials=credentials)
pl_request = yt_api.playlists().delete(id=playlist_id)
pl_request.execute()

View file

@ -13,7 +13,7 @@ from django.views import View
from django.views.generic.detail import DetailView, SingleObjectMixin from django.views.generic.detail import DetailView, SingleObjectMixin
from django.views.generic.edit import CreateView, DeleteView, UpdateView from django.views.generic.edit import CreateView, DeleteView, UpdateView
from . import forms, models, tasks, utils from . import forms, models, utils
class OwnerFilterMixin(LoginRequiredMixin): class OwnerFilterMixin(LoginRequiredMixin):
@ -285,10 +285,9 @@ class GameCreateView(LoginRequiredMixin, CreateView):
game=form.instance, player=player, music_video=music, order=order game=form.instance, player=player, music_video=music, order=order
) )
if creds := self.request.user.youtubecredentials: if self.request.user.youtubecredentials:
form.instance.playlist_loading = True form.instance.playlist_loading = True
form.instance.save() form.instance.save()
tasks.generate_playlist.delay_on_commit(creds.credentials, form.instance.pk)
return res return res