196 lines
8.4 KiB
Python
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)
|