from apollo_utils.service.schemas.fields.datetime import DateStringField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.mixins.country_code import CountryCodeListOptionalMixin from apollo_utils.service.schemas.mixins.isrc import IsrcRequiredMixin from marshmallow import fields, validate from server.constants.youtube import YoutubeVideosOrder from server.schemas.base.pagination import PaginationMixin from server.schemas.base.schemas import RequestSchema, Schema class TrackPerformance: """Visited tracks schema.""" class Request(RequestSchema, CountryCodeListOptionalMixin): video_id = fields.String(required=True) latest_date = DateStringField(required=True) class Response(Schema): class TrafficSource(Schema): sources = fields.List(fields.String()) percentage = fields.Int() class Trends(Schema): weekly_views = fields.Int() weekly_trend = fields.Int() latest_date_views = fields.Int() daily_trend = fields.Int() class DailyMetrics(Schema): class TrafficSourceTypes(Schema): browse_features = fields.Int() direct_or_unknown = fields.Int() external = fields.Int() hashtag_pages = fields.Int() interactive_video_endscreen = fields.Int() notifications = fields.Int() other_youtube_features = fields.Int() playlist_pages = fields.Int() playlists = fields.Int() product_pages = fields.Int() programming_from_claimed_content = fields.Int() shorts = fields.Int() sound_pages = fields.Int() stories = fields.Int() suggested_videos = fields.Int() unknown = fields.Int() video_cards_and_annotations = fields.Int() youtube_advertising = fields.Int() youtube_channels = fields.Int() youtube_search = fields.Int() date = fields.String() timestampt = fields.Int() views = fields.Int() average_view_duration_percentage = fields.Float() average_view_duration_seconds = fields.Float() comments = fields.Int() dislikes = fields.Int() likes = fields.Int() shares = fields.Int() traffic_source_types = fields.Nested(TrafficSourceTypes) biggest_traffic_source = fields.Nested(TrafficSource) trends = fields.Nested(Trends) daily_metrics = fields.List(fields.Nested(DailyMetrics)) class TrackStreamsGraph: class Request(RequestSchema, CountryCodeListOptionalMixin): video_id = fields.String(required=True) latest_date = DateStringField(required=True) class Response(Schema): class CoordinatesSchema(Schema): x = fields.Integer() y = fields.Dict() coordinates = fields.List(fields.Nested(CoordinatesSchema)) class TrackVideos: class Request(RequestSchema, IsrcRequiredMixin, PaginationMixin): views = fields.Integer(required=False, default=1000, missing=1000) sort_by = SplitUniqueListField( fields.String(validate=validate.OneOf(YoutubeVideosOrder.values())), default=[YoutubeVideosOrder.VIEWS_DESC.value, YoutubeVideosOrder.VIDEO_TITLE.value], missing=[YoutubeVideosOrder.VIEWS_DESC.value, YoutubeVideosOrder.VIDEO_TITLE.value], ) class Response(Schema): class YoutubeVideo(Schema): channel_id = fields.String() channel_title = fields.String() content_type = fields.String() date_uploaded = DateStringField() dsp = fields.String() dsp_channel_id = fields.String() dsp_video_id = fields.String() duration_seconds = fields.Integer() thumbnails = fields.Dict() video_id = fields.String() video_title = fields.String() views = fields.Integer() items = fields.List(fields.Nested(YoutubeVideo))