202 lines
9.1 KiB
Python
202 lines
9.1 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)
|
|
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)
|
|
else:
|
|
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)
|
|
if serializer.is_valid(raise_exception=True):
|
|
serializer.save()
|
|
return Response(serializer.data)
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
@action(detail=True, methods=['delete'])
|
|
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_obj = Song.objects.get(azura_id=request.data.get('azura_id'))
|
|
except ObjectDoesNotExist:
|
|
return Response({'detail': 'Объекта не существует', 'error': {'Song': 'Объекта не существует'}},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
if not self.get_queryset().filter(user=request.user, song=song_obj).exists():
|
|
return Response({'detail': 'Объекта не существует', 'error': {'Song': 'Объекта отсутствует плейлисте'}},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
playlist = self.get_object()
|
|
playlist.song.remove(song_obj)
|
|
serializer = self.get_serializer(playlist)
|
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
|
|
@action(detail=True, methods=['post'], schema=PlayListSchema())
|
|
def add_to_playlist(self, request, *args, **kwargs):
|
|
instance = self.get_object()
|
|
try:
|
|
song = Song.objects.get(azura_id=request.data.get('azura_id')).pk
|
|
except ObjectDoesNotExist:
|
|
data = self.azura.add_to_playlist(request.data)
|
|
song_serializer = SongSerializer(data=data)
|
|
if song_serializer.is_valid():
|
|
song_serializer.save()
|
|
song = song_serializer.data['id']
|
|
else:
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
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)
|
|
return Response(serializer.data)
|
|
|
|
@action(detail=True, methods=['get'])
|
|
def check_is_favorite(self, request, azura_id, *args, **kwargs):
|
|
try:
|
|
song_obj = Song.objects.get(azura_id=azura_id)
|
|
except ObjectDoesNotExist:
|
|
return Response({'detail': 'Объекта не существует', 'error': {'Song': 'Объекта не существует'}},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
if self.get_queryset().filter(user=request.user, song=song_obj).exists():
|
|
return Response({"is_favorite": True}, status=status.HTTP_200_OK)
|
|
else:
|
|
return Response({"is_favorite": False}, status=status.HTTP_200_OK)
|
|
|
|
@action(detail=False, methods=['post'], schema=SongSchema())
|
|
def add_favorite(self, request, *args, **kwargs):
|
|
try:
|
|
song = Song.objects.get(azura_id=request.data.get('azura_id'))
|
|
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()
|
|
song = serializer.data['id']
|
|
else:
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
obj, data = self.get_queryset().get_or_create(user=request.user)
|
|
obj.song.add(song)
|
|
serializer = self.get_serializer(obj)
|
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
|
|
@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.song.remove(song)
|
|
serializer = self.get_serializer(queryset)
|
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
except ObjectDoesNotExist:
|
|
return Response({'detail': 'Объекта не существует', 'error': {'Song': 'Объекта не существует'}},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
|
|
|
|
class SongViewSet(GenericViewSet):
|
|
azura = AzuraCast()
|
|
queryset = Song.objects.all()
|
|
permission_classes = (IsAuthenticated, )
|
|
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)
|
|
|
|
@action(detail=False, methods=['get'], permission_classes=(AllowAny,), schema=SongSchema())
|
|
def get_song_history(self, request):
|
|
return Response(
|
|
self.azura.get_song_history(
|
|
request.data['start'],
|
|
request.data['end']
|
|
),
|
|
status=status.HTTP_200_OK
|
|
)
|