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)