ITRadio/server/proj/audio/views.py

86 lines
3.5 KiB
Python

from django.shortcuts import render
from rest_framework.viewsets import ViewSet, GenericViewSet
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework import status
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from django.shortcuts import get_object_or_404, get_list_or_404
from rest_framework.permissions import IsAuthenticated
from decouple import config
from urllib.parse import urljoin
from django.http import HttpRequest
import requests
from .schemas import SongSchema, DeleteSongSchema
from .models import Song, FavoriteSong
from .serializers import SongSerializer, FavoriteSongSerializer
class SongViewSet(GenericViewSet):
serializer_class = SongSerializer
permission_classes = (IsAuthenticated,)
queryset = Song.objects.all()
def list(self, request):
songs_pk = FavoriteSong.objects.filter(user=request.user, song__isnull=False).values_list('song_id', flat=True)
queryset = Song.objects.filter(id__in=songs_pk)
serializer = SongSerializer(queryset, many=True)
return Response(f"{HttpRequest.build_absolute_uri()}")
def retrieve(self, request, pk=None):
try:
song_obj = Song.objects.get(azura_id=pk)
queryset = FavoriteSong.objects.get(user=request.user, song=song_obj)
except ObjectDoesNotExist:
return Response({"error": 'Объекта не существует'}, status=status.HTTP_404_NOT_FOUND)
serializer = FavoriteSongSerializer(queryset)
return Response(serializer.data)
@action(detail=False, methods=['post'], schema=SongSchema())
def create_song(self, request):
song = get_object_or_404(Song, azura_id=request.data['azura_id'])
data = None
#Если трек есть в базе
if song:
data = {
"song": song.pk,
"user": request.user.pk
}
#Если трека нету в базе
else:
file_url = urljoin(config('URL_PROD'), f'/api/station/it-radio/file/{request.data['azura_id']}')
API_KEY = config('API_KEY')
headers = {
"Authorization": f"Bearer {API_KEY}"
}
response = requests.get(file_url, headers=headers)
data = request.data
file_play = f"http://82.97.242.49:10084/api/station/it-radio/file/{response.json()['unique_id']}/play"
data.update(unique_id = file_play)
serializer = SongSerializer(data=data)
if serializer.is_valid():
serializer.save()
data = {
"song": serializer.data['id'],
"user": request.user.pk
}
serializer = FavoriteSongSerializer(data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@action(detail=False, methods=['post'], schema=DeleteSongSchema())
def delete_song(self, request):
song_id = request.data['song_id']
item = get_object_or_404(FavoriteSong, pk=song_id)
item.delete()
return Response(status=status.HTTP_202_ACCEPTED)
def get_permissions(self):
try:
return [permission() for permission in self.permission_classes_by_action[self.action]]
except KeyError:
return [permission() for permission in self.permission_classes]