diff --git a/server/proj/audio/admin.py b/server/proj/audio/admin.py index 3f670a5..77f564c 100644 --- a/server/proj/audio/admin.py +++ b/server/proj/audio/admin.py @@ -12,4 +12,4 @@ class FavoriteSongAdmin(admin.ModelAdmin): @admin.register(PlayList) class PlayListAdmin(admin.ModelAdmin): - list_display = ('id', 'name', 'user', 'art') + list_display = ('id', 'name', 'user', 'playlist_art') diff --git a/server/proj/audio/models.py b/server/proj/audio/models.py index b7ca203..35e7c17 100644 --- a/server/proj/audio/models.py +++ b/server/proj/audio/models.py @@ -43,9 +43,8 @@ class PlayList(models.Model): name = models.CharField('Название плейлиста', max_length=50, blank=True, null=True) song = models.ManyToManyField(Song, blank=True, null=True) user = models.ForeignKey(MyUser, verbose_name='Пользователь', on_delete=models.CASCADE) - art = models.ImageField('Изображение плейлиста', blank=True, null=True, upload_to="playlist_images/") + playlist_art = models.FileField('Изображение плейлиста', blank=True, null=True, upload_to="playlist_images/") - class Meta: verbose_name = 'Плейлисты' verbose_name_plural = 'Плейлисты' \ No newline at end of file diff --git a/server/proj/audio/schemas.py b/server/proj/audio/schemas.py index 607ef1e..e47a7d5 100644 --- a/server/proj/audio/schemas.py +++ b/server/proj/audio/schemas.py @@ -69,10 +69,46 @@ class PlayListSchema(AutoSchema): required=False, schema=coreschema.Integer(description='ID плейлиста') ), + coreapi.Field( + name='playlist_art', + location='form', + required=False, + schema=coreschema.Integer(description='Обложка плейлиста') + ), coreapi.Field( name='azura_id', location='form', required=False, - schema=coreschema.String(description='ID трека с азуры') + schema=coreschema.String(description='ID трека с Азуры') + ), + coreapi.Field( + name='title', + location='form', + required=False, + schema=coreschema.String(description='Название трека') + ), + coreapi.Field( + name='artist', + location='form', + required=False, + schema=coreschema.String(description='Исполнитель') + ), + coreapi.Field( + name='album', + location='form', + required=False, + schema=coreschema.String(description='Альбом трека') + ), + coreapi.Field( + name='genre', + location='form', + required=False, + schema=coreschema.String(description='Жанр трека') + ), + coreapi.Field( + name='art', + location='form', + required=False, + schema=coreschema.String(description='Изображение трека') ), ] \ No newline at end of file diff --git a/server/proj/audio/serializers.py b/server/proj/audio/serializers.py index 317777c..5377488 100644 --- a/server/proj/audio/serializers.py +++ b/server/proj/audio/serializers.py @@ -9,7 +9,7 @@ class SongSerializer(serializers.ModelSerializer): class PlayListSerializer(serializers.ModelSerializer): class Meta: model = PlayList - fields = ('id', 'name', 'song', 'user') + fields = ('id', 'name', 'song', 'user', 'playlist_art') def to_representation(self, instance): rep = super().to_representation(instance) diff --git a/server/proj/audio/views.py b/server/proj/audio/views.py index c17aaa5..56e2d12 100644 --- a/server/proj/audio/views.py +++ b/server/proj/audio/views.py @@ -59,6 +59,19 @@ class PlayListViewSet(GenericViewSet): serializer.save() return Response(serializer.data) + @action(detail=False, methods=['post'], schema=PlayListSchema()) + def update_playlist(self, request): + try: + instance = PlayList.objects.get(pk=request.data['playlist_id'], user=request.user.pk) + serializer = self.get_serializer(data=request.data, partial=True, instance=instance) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(serializer.data) + except ObjectDoesNotExist: + return Response( + {'detail': 'Объекта не существует', 'error': {'PlayList': 'Объекта не существует'}}, + status=status.HTTP_404_NOT_FOUND) + @action(detail=False, methods=['post'], schema=PlayListSchema()) def delete_playlist(self, request): try: @@ -71,14 +84,37 @@ class PlayListViewSet(GenericViewSet): status=status.HTTP_404_NOT_FOUND) @action(detail=False, methods=['post'], schema=PlayListSchema()) - def add_to_playlist(self, request): + def delete_song_with_playlist(self, request): try: - song = list(Song.objects.filter(azura_id=request.data.get('azura_id')).values_list('pk', flat=True)) + song = Song.objects.get(azura_id=request.data.get('azura_id')) + item = PlayList.objects.get(user=request.user, pk=request.data.get('playlist_id')) + item.song.remove(song) + return Response({'detail': 'Объект удалён'}, status=status.HTTP_200_OK) except ObjectDoesNotExist: return Response( - {'detail': 'Песни не существует', 'error': {'Song': 'Песни не существует'}}, + {'detail': 'Объекта не существует', 'error': {'PlayList': 'Объекта не существует'}}, status=status.HTTP_404_NOT_FOUND) + + @action(detail=False, methods=['post'], schema=PlayListSchema()) + def add_to_playlist(self, request): + song = None + try: + song = Song.objects.get(azura_id=request.data.get('azura_id')).pk + except ObjectDoesNotExist: + file_url = f"http://82.97.242.49:10084/api/station/it-radio/file/{request.data['azura_id']}" + API_KEY = "49226d3488aac3f5:18d88659c6c1c5e131a0ce0a94d55235" + headers = { + "Authorization": f"Bearer {API_KEY}" + } + response = requests.get(file_url, headers=headers) + data = request.data + file_play = f"http://82.97.242.49:10084/api/station/it-radio/file/{response.json()['unique_id']}/play" + data.update(unique_id=file_play) + song_serializer = SongSerializer(data=data) + if song_serializer.is_valid(): + song_serializer.save() + song = song_serializer.data.get('id') try: instance = PlayList.objects.get(pk=request.data.get('playlist_id')) except ObjectDoesNotExist: @@ -86,7 +122,7 @@ class PlayListViewSet(GenericViewSet): {'detail': 'Плейлиста не существует', 'error': {'PlayList': 'Плейлиста не существует'}}, status=status.HTTP_404_NOT_FOUND) - songs = list(instance.song.all().values_list('pk', flat=True))+song + songs = list(instance.song.all().values_list('pk', flat=True)) + [song] data = { 'playlist_id': request.data.get('playlist_id'), 'song': songs @@ -204,9 +240,6 @@ class SongViewSet(GenericViewSet): for i in response.json(): i['azura_id'] = i.pop('song_id') data.append(i) - - - return Response(data, status=status.HTTP_200_OK) diff --git a/server/proj/conf/settings/production.py b/server/proj/conf/settings/production.py index a17a09c..7600045 100644 --- a/server/proj/conf/settings/production.py +++ b/server/proj/conf/settings/production.py @@ -2,7 +2,7 @@ import sys from .base import * DEBUG = False -ALLOWED_HOSTS = ['82.97.242.49'] +ALLOWED_HOSTS = ['82.97.242.49', 'itradio.team'] # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases