mirror of
https://git.vectorsigma.ru/public/tubearchivist.git
synced 2026-08-04 20:49:27 +00:00
add playlist list and item serializer
This commit is contained in:
51
backend/playlist/serializers.py
Normal file
51
backend/playlist/serializers.py
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
"""playlist serializers"""
|
||||||
|
|
||||||
|
# pylint: disable=abstract-method
|
||||||
|
|
||||||
|
from common.serializers import PaginationSerializer
|
||||||
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
|
||||||
|
class PlaylistEntrySerializer(serializers.Serializer):
|
||||||
|
"""serialize single playlist entry"""
|
||||||
|
|
||||||
|
youtube_id = serializers.CharField()
|
||||||
|
title = serializers.CharField()
|
||||||
|
uploader = serializers.CharField()
|
||||||
|
idx = serializers.IntegerField()
|
||||||
|
downloaded = serializers.BooleanField()
|
||||||
|
|
||||||
|
|
||||||
|
class PlaylistSerializer(serializers.Serializer):
|
||||||
|
"""serialize playlist"""
|
||||||
|
|
||||||
|
playlist_active = serializers.BooleanField()
|
||||||
|
playlist_channel = serializers.CharField()
|
||||||
|
playlist_channel_id = serializers.CharField()
|
||||||
|
playlist_description = serializers.CharField()
|
||||||
|
playlist_entries = PlaylistEntrySerializer(many=True)
|
||||||
|
playlist_id = serializers.CharField()
|
||||||
|
playlist_last_refresh = serializers.CharField()
|
||||||
|
playlist_name = serializers.CharField()
|
||||||
|
playlist_subscribed = serializers.BooleanField()
|
||||||
|
playlist_thumbnail = serializers.CharField()
|
||||||
|
playlist_type = serializers.ChoiceField(choices=["regular", "custom"])
|
||||||
|
_index = serializers.CharField(required=False)
|
||||||
|
_score = serializers.IntegerField(required=False)
|
||||||
|
|
||||||
|
|
||||||
|
class PlaylistListSerializer(serializers.Serializer):
|
||||||
|
"""serialize list of playlists"""
|
||||||
|
|
||||||
|
data = PlaylistSerializer(many=True)
|
||||||
|
paginate = PaginationSerializer()
|
||||||
|
|
||||||
|
|
||||||
|
class PlaylistListQuerySerializer(serializers.Serializer):
|
||||||
|
"""serialize playlist list query params"""
|
||||||
|
|
||||||
|
channel = serializers.CharField(required=False)
|
||||||
|
subscribed = serializers.BooleanField(required=False)
|
||||||
|
type = serializers.ChoiceField(
|
||||||
|
choices=["regular", "custom"], required=False
|
||||||
|
)
|
||||||
@@ -2,8 +2,15 @@
|
|||||||
|
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
|
from common.serializers import ErrorResponseSerializer
|
||||||
from common.views_base import AdminWriteOnly, ApiBaseView
|
from common.views_base import AdminWriteOnly, ApiBaseView
|
||||||
from download.src.subscriptions import PlaylistSubscription
|
from download.src.subscriptions import PlaylistSubscription
|
||||||
|
from drf_spectacular.utils import OpenApiResponse, extend_schema
|
||||||
|
from playlist.serializers import (
|
||||||
|
PlaylistListQuerySerializer,
|
||||||
|
PlaylistListSerializer,
|
||||||
|
PlaylistSerializer,
|
||||||
|
)
|
||||||
from playlist.src.index import YoutubePlaylist
|
from playlist.src.index import YoutubePlaylist
|
||||||
from playlist.src.query_building import QueryBuilder
|
from playlist.src.query_building import QueryBuilder
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
@@ -25,17 +32,34 @@ class PlaylistApiListView(ApiBaseView):
|
|||||||
search_base = "ta_playlist/_search/"
|
search_base = "ta_playlist/_search/"
|
||||||
permission_classes = [AdminWriteOnly]
|
permission_classes = [AdminWriteOnly]
|
||||||
|
|
||||||
|
@extend_schema(
|
||||||
|
responses={
|
||||||
|
200: OpenApiResponse(PlaylistListSerializer()),
|
||||||
|
400: OpenApiResponse(
|
||||||
|
ErrorResponseSerializer(), description="Bad request"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
parameters=[PlaylistListQuerySerializer],
|
||||||
|
)
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
"""get request"""
|
"""get playlist list"""
|
||||||
|
query_serializer = PlaylistListQuerySerializer(
|
||||||
|
data=request.query_params
|
||||||
|
)
|
||||||
|
query_serializer.is_valid(raise_exception=True)
|
||||||
|
validated_query = query_serializer.validated_data
|
||||||
try:
|
try:
|
||||||
data = QueryBuilder(**request.GET).build_data()
|
data = QueryBuilder(**validated_query).build_data()
|
||||||
except ValueError as err:
|
except ValueError as err:
|
||||||
return Response({"error": str(err)}, status=400)
|
error = ErrorResponseSerializer({"error": str(err)})
|
||||||
|
return Response(error.data, status=400)
|
||||||
|
|
||||||
self.data = data
|
self.data = data
|
||||||
self.get_document_list(request)
|
self.get_document_list(request)
|
||||||
|
|
||||||
return Response(self.response)
|
response_serializer = PlaylistListSerializer(self.response)
|
||||||
|
|
||||||
|
return Response(response_serializer.data)
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
"""subscribe/unsubscribe to list of playlists"""
|
"""subscribe/unsubscribe to list of playlists"""
|
||||||
@@ -88,11 +112,25 @@ class PlaylistApiView(ApiBaseView):
|
|||||||
permission_classes = [AdminWriteOnly]
|
permission_classes = [AdminWriteOnly]
|
||||||
valid_custom_actions = ["create", "remove", "up", "down", "top", "bottom"]
|
valid_custom_actions = ["create", "remove", "up", "down", "top", "bottom"]
|
||||||
|
|
||||||
|
@extend_schema(
|
||||||
|
responses={
|
||||||
|
200: OpenApiResponse(PlaylistSerializer()),
|
||||||
|
404: OpenApiResponse(
|
||||||
|
ErrorResponseSerializer(), description="playlist not found"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
)
|
||||||
def get(self, request, playlist_id):
|
def get(self, request, playlist_id):
|
||||||
# pylint: disable=unused-argument
|
# pylint: disable=unused-argument
|
||||||
"""get request"""
|
"""get playlist"""
|
||||||
self.get_document(playlist_id)
|
self.get_document(playlist_id)
|
||||||
return Response(self.response, status=self.status_code)
|
if not self.response:
|
||||||
|
error = ErrorResponseSerializer({"error": "playlist not found"})
|
||||||
|
return Response(error.data, status=404)
|
||||||
|
|
||||||
|
response_serializer = PlaylistSerializer(self.response)
|
||||||
|
|
||||||
|
return Response(response_serializer.data)
|
||||||
|
|
||||||
def post(self, request, playlist_id):
|
def post(self, request, playlist_id):
|
||||||
"""post to custom playlist to add a video to list"""
|
"""post to custom playlist to add a video to list"""
|
||||||
|
|||||||
Reference in New Issue
Block a user