diff --git a/server/proj/audio/service.py b/server/proj/audio/service.py new file mode 100644 index 0000000..b9caaa6 --- /dev/null +++ b/server/proj/audio/service.py @@ -0,0 +1,25 @@ +from conf.settings import AZURACAST_URL, AZURACAST_API_KEY +import requests + + +def authorize_url(url): + file_url = url + API_KEY = AZURACAST_API_KEY + headers = { + "Authorization": f"Bearer {API_KEY}" + } + return requests.get(file_url, headers=headers) + +class AzuraCast: + api_key = AZURACAST_API_KEY + url = AZURACAST_URL + + @staticmethod + def add_to_playlist(azura_id, data): + file_url = f"{AZURACAST_URL}api/station/it-radio/file/{azura_id}" + response = authorize_url(file_url) + file_play = f"{AZURACAST_URL}api/station/it-radio/file/{response.json()['unique_id']}/play" + data.update(unique_id=file_play) + return data + + \ No newline at end of file diff --git a/server/proj/audio/views.py b/server/proj/audio/views.py index d3a6c94..8f53713 100644 --- a/server/proj/audio/views.py +++ b/server/proj/audio/views.py @@ -6,12 +6,12 @@ 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, AllowAny -import requests +from audio.service import AzuraCast from django.http import HttpResponse - -from .schemas import SongSchema, DeleteSongSchema, PlayListSchema -from .models import Song, FavoriteSong, PlayList, Podkast -from .serializers import SongSerializer, FavoriteSongSerializer, PlayListSerializer, PodkastSerializer +import requests +from audio.schemas import SongSchema, DeleteSongSchema, PlayListSchema +from audio.models import Song, FavoriteSong, PlayList, Podkast +from audio.serializers import SongSerializer, FavoriteSongSerializer, PlayListSerializer, PodkastSerializer from conf.settings.base import AZURACAST_URL, AZURACAST_API_KEY def authorize_url(url): @@ -22,7 +22,6 @@ def authorize_url(url): } return requests.get(file_url, headers=headers) - class PodkastViewSet(GenericViewSet): queryset = Podkast serializer_class = PodkastSerializer @@ -44,7 +43,8 @@ class PodkastViewSet(GenericViewSet): class PlayListViewSet(GenericViewSet): - queryset = PlayList + azura = AzuraCast() + queryset = PlayList.objects.all() serializer_class = PlayListSerializer permission_classes = (IsAuthenticated,) def list(self, request): @@ -64,7 +64,6 @@ class PlayListViewSet(GenericViewSet): @action(detail=False, methods=['post'], schema=PlayListSchema()) def create_playlist(self, request): - if request.data.get('name', False): try: instance = self.get_queryset().objects.get(pk=request.data['playlist_id'], user=request.user.pk) @@ -80,8 +79,7 @@ class PlayListViewSet(GenericViewSet): status=status.HTTP_404_NOT_FOUND) else: playlist_pk = self.get_queryset().objects.filter(user=request.user.pk) - number_playlist = len(playlist_pk) + 1 - name = f"Плейлист № {number_playlist}" + name = f"Плейлист № {len(playlist_pk)+1}" data = request.data data.update(user=request.user.pk, name=name) serializer = self.get_serializer(data=request.data) @@ -126,36 +124,20 @@ class PlayListViewSet(GenericViewSet): status=status.HTTP_404_NOT_FOUND) - @action(detail=False, methods=['post'], schema=PlayListSchema()) - def add_to_playlist(self, request): + @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: - file_url = f"{AZURACAST_URL}api/station/it-radio/file/{request.data['azura_id']}" - response = authorize_url(file_url) - data = request.data - file_play = f"{AZURACAST_URL}api/station/it-radio/file/{response.json()['unique_id']}/play" - data.update(unique_id=file_play) + 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.get('id') - try: - instance = self.get_queryset().objects.get(pk=request.data.get('playlist_id')) - except ObjectDoesNotExist: - return Response( - {'detail': 'Плейлиста не существует', 'error': {'PlayList': 'Плейлиста не существует'}}, - status=status.HTTP_404_NOT_FOUND) - - songs = list(instance.song.all().values_list('pk', flat=True)) + [song] - data = { - 'playlist_id': request.data.get('playlist_id'), - 'song': songs - } - serializer = PlayListSerializer(data=data, partial=True, instance=instance) - serializer.is_valid(raise_exception=True) - serializer.save() + song = song_serializer.data + instance = self.get_object() + instance.song.add(song) + serializer = self.get_serializer(instance) return Response(serializer.data) @@ -163,6 +145,7 @@ class SongViewSet(GenericViewSet): queryset = Song serializer_class = SongSerializer permission_classes = (IsAuthenticated,) + def list(self, request): songs_pk = FavoriteSong.objects.filter(user=request.user, song__isnull=False).values_list('song_id', flat=True) diff --git a/server/proj/conf/settings/__pycache__/base.cpython-310.pyc b/server/proj/conf/settings/__pycache__/base.cpython-310.pyc index dc54fe6..696451e 100644 Binary files a/server/proj/conf/settings/__pycache__/base.cpython-310.pyc and b/server/proj/conf/settings/__pycache__/base.cpython-310.pyc differ