"""video serializers""" # pylint: disable=abstract-method from channel.serializers import ChannelSerializer from common.serializers import PaginationSerializer from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from video.src.constants import OrderEnum, SortEnum, VideoTypeEnum, WatchedEnum class PlayerSerializer(serializers.Serializer): """serialize player""" watched = serializers.BooleanField() watched_date = serializers.IntegerField(required=False) duration = serializers.IntegerField() duration_str = serializers.CharField() progress = serializers.FloatField(required=False) position = serializers.FloatField(required=False) class SponsorBlockSegmentSerializer(serializers.Serializer): """serialize sponsorblock segment""" actionType = serializers.CharField() videoDuration = serializers.FloatField() segment = serializers.ListField(child=serializers.FloatField()) votes = serializers.IntegerField() category = serializers.CharField() UUID = serializers.CharField() locked = serializers.IntegerField() class SponsorBlockSerializer(serializers.Serializer): """serialize sponsorblock""" is_enabled = serializers.BooleanField() last_refresh = serializers.IntegerField() has_unlocked = serializers.BooleanField(required=False) segments = SponsorBlockSegmentSerializer(many=True) class StatsSerializer(serializers.Serializer): """serialize stats""" like_count = serializers.IntegerField() average_rating = serializers.FloatField() view_count = serializers.IntegerField() dislike_count = serializers.IntegerField() class StreamItemSerializer(serializers.Serializer): """serialize stream item""" bitrate = serializers.IntegerField() codec = serializers.CharField() height = serializers.IntegerField(required=False) index = serializers.IntegerField() type = serializers.ChoiceField(choices=["video", "audio"]) width = serializers.IntegerField(required=False) class SubtitleFragmentSerializer(serializers.Serializer): """serialize subtitle fragment""" subtitle_channel = serializers.CharField() subtitle_channel_id = serializers.CharField() subtitle_end = serializers.CharField() subtitle_fragment_id = serializers.CharField() subtitle_index = serializers.IntegerField() subtitle_lang = serializers.CharField() subtitle_last_refresh = serializers.IntegerField() subtitle_line = serializers.CharField() subtitle_source = serializers.ChoiceField(choices=["user", "auto"]) subtitle_start = serializers.CharField() title = serializers.CharField() youtube_id = serializers.CharField() class SubtitleItemSerializer(serializers.Serializer): """serialize subtitle item""" ext = serializers.ChoiceField(choices=["json3", "vtt"]) lang = serializers.CharField() media_url = serializers.CharField() name = serializers.CharField() source = serializers.ChoiceField(choices=["user", "auto"]) url = serializers.URLField(allow_null=True) class VideoSerializer(serializers.Serializer): """serialize video item""" active = serializers.BooleanField() category = serializers.ListField(child=serializers.CharField()) channel = ChannelSerializer(required=False) comment_count = serializers.IntegerField(allow_null=True, required=False) date_downloaded = serializers.IntegerField() description = serializers.CharField(allow_null=True, required=False) media_size = serializers.IntegerField() media_url = serializers.CharField() player = PlayerSerializer() playlist = serializers.ListField( child=serializers.CharField(), required=False ) published = serializers.CharField() sponsorblock = SponsorBlockSerializer(allow_null=True, required=False) stats = StatsSerializer() streams = StreamItemSerializer(many=True) subtitles = SubtitleItemSerializer(many=True, required=False) tags = serializers.ListField(child=serializers.CharField()) title = serializers.CharField() vid_last_refresh = serializers.CharField() vid_thumb_url = serializers.CharField() vid_type = serializers.ChoiceField(choices=VideoTypeEnum.values_known()) youtube_id = serializers.CharField() _index = serializers.CharField(required=False) _score = serializers.FloatField(required=False) class VideoListSerializer(serializers.Serializer): """serialize video list""" data = VideoSerializer(many=True) paginate = PaginationSerializer() class VideoListQuerySerializer(serializers.Serializer): """serialize query for video list""" playlist = serializers.CharField(required=False) channel = serializers.CharField(required=False) watch = serializers.ChoiceField( choices=WatchedEnum.values(), required=False, allow_null=True ) sort = serializers.ChoiceField(choices=SortEnum.names(), required=False) order = serializers.ChoiceField(choices=OrderEnum.values(), required=False) type = serializers.ChoiceField( choices=VideoTypeEnum.values_known(), required=False ) page = serializers.IntegerField(required=False) height = serializers.IntegerField(required=False) class CommentItemSerializer(serializers.Serializer): """serialize comment item""" comment_author = serializers.CharField() comment_author_id = serializers.CharField() comment_author_is_uploader = serializers.BooleanField() comment_author_thumbnail = serializers.URLField() comment_id = serializers.CharField() comment_is_favorited = serializers.BooleanField() comment_likecount = serializers.IntegerField() comment_parent = serializers.CharField() comment_text = serializers.CharField() comment_time_text = serializers.CharField() comment_timestamp = serializers.IntegerField() comment_replies = serializers.SerializerMethodField() @extend_schema_field(serializers.ListField()) def get_comment_replies(self, obj): """recursive replies""" return CommentItemSerializer( obj.get("comment_replies", []), many=True ).data class CommentsSerializer(serializers.Serializer): """serialize comments as indexed""" comment_channel_id = serializers.CharField() comment_comments = CommentItemSerializer(many=True) comment_last_refresh = serializers.IntegerField() youtube_id = serializers.CharField() class PlaylistNavMetaSerializer(serializers.Serializer): """serialize playlist nav meta""" current_idx = serializers.IntegerField() playlist_id = serializers.CharField() playlist_name = serializers.CharField() playlist_channel = serializers.CharField() class PlaylistNavVideoSerializer(serializers.Serializer): """serialize video item on playlist nav""" youtube_id = serializers.CharField() title = serializers.CharField() uploader = serializers.CharField() idx = serializers.IntegerField() downloaded = serializers.BooleanField() vid_thumb = serializers.CharField() class PlaylistNavItemSerializer(serializers.Serializer): """serialize nav on playlist""" playlist_meta = PlaylistNavMetaSerializer() playlist_previous = PlaylistNavVideoSerializer(allow_null=True) playlist_next = PlaylistNavVideoSerializer(allow_null=True) class VideoProgressUpdateSerializer(serializers.Serializer): """serialize progress update data""" position = serializers.FloatField(default=0)