Add playlist field to MusikGame model and update YouTube credentials handling in views

This commit is contained in:
Edgar P. Burkhart 2025-06-13 23:08:41 +02:00
parent 4b2f695afb
commit 122ae40570
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227
8 changed files with 128 additions and 4 deletions

View file

@ -1,6 +1,8 @@
import random
import google.oauth2.credentials
import google_auth_oauthlib
import googleapiclient.discovery
from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Count, Q
@ -131,6 +133,42 @@ class GameCreateView(LoginRequiredMixin, CreateView):
models.MusicGameOrder.objects.create(
game=form.instance, player=player, music_video=music, order=order
)
if creds := self.request.user.youtubecredentials:
credentials = google.oauth2.credentials.Credentials(**creds.credentials)
yt_api = googleapiclient.discovery.build(
"youtube", "v3", credentials=credentials
)
pl_request = yt_api.playlists().insert(
part="snippet,status",
body={
"snippet": {
"title": f"Musik {group.name} {form.instance.date.strftime('%x')}",
"description": "Playlist générée par Musik",
},
"status": {
"privacyStatus": "private",
},
},
)
pl_response = pl_request.execute()
pl_id = pl_response.get("id")
form.instance.playlist = pl_id
form.instance.save()
for _, music in pm_list:
request = yt_api.playlistItems().insert(
part="snippet",
body={
"snippet": {
"playlistId": pl_id,
"resourceId": {
"kind": "youtube#video",
"videoId": music.yt_id,
},
}
},
)
request.execute()
return res
@ -173,8 +211,18 @@ class YoutubeCallbackView(LoginRequiredMixin, View):
flow.fetch_token(code=request.GET.get("code"))
credentials = models.YoutubeCredentials(
user=request.user, credentials=flow.credentials.to_json()
credentials = flow.credentials
models.YoutubeCredentials.objects.update_or_create(
user=request.user,
defaults={
"credentials": {
"token": credentials.token,
"refresh_token": credentials.refresh_token,
"token_uri": credentials.token_uri,
"client_id": credentials.client_id,
"client_secret": credentials.client_secret,
"granted_scopes": credentials.granted_scopes,
}
},
)
credentials.save()
return redirect("/")