ITRadio/server/proj/audio/views.py

196 lines
8.4 KiB
Python

from rest_framework.viewsets import GenericViewSet
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework import status
from django.core.exceptions import ObjectDoesNotExist
from rest_framework.permissions import IsAuthenticated, AllowAny
from audio.services.service import AzuraCast
from audio.schemas import SongSchema, PlayListSchema
from audio.models import Song, FavoriteSong, PlayList, Podkast
from audio.serializers import SongSerializer, FavoriteSongSerializer, PlayListSerializer, PodkastSerializer
class PodkastViewSet(GenericViewSet):
queryset = Podkast.objects.all()
serializer_class = PodkastSerializer
permission_classes = (IsAuthenticated, )
def list(self, request):
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def retrieve(self, request, pk):
try:
queryset = self.get_queryset().get(pk=pk)
serializer = self.get_serializer(queryset)
return Response(serializer.data, status=status.HTTP_200_OK)
except ObjectDoesNotExist:
return Response(
{'detail': 'Объекта не существует', 'error': {'PlayList': 'Объекта не существует'}},
status=status.HTTP_404_NOT_FOUND)
class PlayListViewSet(GenericViewSet):
azura = AzuraCast()
queryset = PlayList.objects.all()
serializer_class = PlayListSerializer
permission_classes = (IsAuthenticated,)
def list(self, request):
queryset = self.get_queryset().filter(user=request.user)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def retrieve(self, request, pk):
try:
queryset = self.get_queryset().get(pk=pk, user=request.user)
serializer = self.get_serializer(queryset)
return Response(serializer.data, status=status.HTTP_200_OK)
except ObjectDoesNotExist:
return Response(
{'detail': 'Объекта не существует', 'error': {'PlayList': 'Объекта не существует'}},
status=status.HTTP_404_NOT_FOUND)
@action(detail=False, methods=['post'], schema=PlayListSchema())
def create_playlist(self, request):
if request.data.get('name', False):
data = request.data
data.update(user=request.user.pk)
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
else:
playlist_pk = self.get_queryset().filter(user=request.user.pk)
name = f"Плейлист № {len(playlist_pk)+1}"
data = request.data
data.update(user=request.user.pk, name=name)
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@action(detail=True, methods=['post'], schema=PlayListSchema())
def update_playlist(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(data=request.data, partial=True, instance=instance)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
@action(detail=True, methods=['post'])
def delete_playlist(self, request, *args, **kwargs):
item = self.get_object()
item.delete()
return Response({'detail': 'Объект удалён'}, status=status.HTTP_200_OK)
@action(detail=True, methods=['post'], schema=PlayListSchema())
def delete_song_with_playlist(self, request, *args, **kwargs):
try:
song = Song.objects.get(azura_id=request.data.get('azura_id'))
item = self.get_object()
item.song.remove(song)
return Response({'detail': 'Объект удалён'}, status=status.HTTP_200_OK)
except ObjectDoesNotExist:
return Response(
{'detail': 'Объекта не существует', 'error': {'PlayList': 'Объекта не существует'}},
status=status.HTTP_404_NOT_FOUND)
@action(detail=True, methods=['post'], schema=PlayListSchema())
def add_to_playlist(self, request, *args, **kwargs):
song = None
try:
song = Song.objects.get(azura_id=request.data.get('azura_id')).pk
except ObjectDoesNotExist:
data = self.azura.add_to_playlist(request.data['azura_id'], request.data)
song_serializer = SongSerializer(data=data)
if song_serializer.is_valid():
song_serializer.save()
song = song_serializer.data['id']
instance = self.get_object()
instance.song.add(song)
serializer = self.get_serializer(instance)
return Response(serializer.data)
class FavoriteSongViewSet(GenericViewSet):
azura = AzuraCast()
queryset = FavoriteSong.objects.all()
serializer_class = FavoriteSongSerializer
#permission_classes = (IsAuthenticated, )
lookup_field = 'azura_id'
def list(self, request):
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True, request_user=request.user)
return Response(serializer.data)
@action(detail=False, methods=['get'])
def check_is_favorite(self, request, azura_id, *args, **kwargs):
try:
song_obj = Song.objects.get(azura_id=azura_id)
favorite_songs = self.get_queryset().get(user=request.user, song=song_obj)
return Response({"is_favorite": True}, status=status.HTTP_200_OK)
except ObjectDoesNotExist:
return Response({"is_favorite": False}, status=status.HTTP_200_OK)
@action(detail=False, methods=['post'], schema=SongSchema())
def add_favorite(self, request, *args, **kwargs):
data = None
try:
song = Song.objects.get(azura_id=request.data.get('azura_id'))
data = {
'song': song.pk,
'user': request.user.pk
}
except ObjectDoesNotExist:
unique_id = self.azura.get_unique_id(azura_id = request.data.get('azura_id'))
data = request.data
data.update(unique_id=unique_id)
serializer = SongSerializer(data=data)
if serializer.is_valid():
serializer.save()
data = {
"song": serializer.data['id'],
"user": request.user.pk
}
serializer = self.get_serializer(data=data)
if serializer.validate(data):
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@action(detail=True, methods=['delete'])
def delete_song(self, request, *args, **kwargs):
try:
song = Song.objects.get(azura_id=kwargs.get('azura_id'))
queryset = self.get_queryset().get(user=request.user, song=song.pk)
queryset.delete()
return Response(status=status.HTTP_202_ACCEPTED)
except ObjectDoesNotExist:
return Response(
{'detail': 'Объекта не существует', 'error': {'Song': 'Объекта не существует'}},
status=status.HTTP_404_NOT_FOUND)
class SongViewSet(GenericViewSet):
azura = AzuraCast()
lookup_field = 'azura_id'
@action(detail=True, methods=['get'])
def get_audio(self, *args, **kwargs):
response = self.azura.get_audio(self.get_object())
return response
@action(detail=False, methods=['get'])
def get_all_song(self, request):
return Response(self.azura.get_all_songs(), status=status.HTTP_200_OK)
@action(detail=False, methods=['get'], permission_classes=(AllowAny,))
def get_nowplaying(self, request):
return Response(self.azura.get_nowplaying(), status=status.HTTP_200_OK)