from apollo_utils.service.schemas.fields.datetime import DateStringField from apollo_utils.service.schemas.fields.enum import EnumField from apollo_utils.service.schemas.mixins.date import DateRangeMixin from apollo_utils.service.schemas.mixins.isrc import IsrcRequiredMixin from apollo_utils.service.schemas.mixins.market import get_market_mixin from marshmallow import fields from server.constants.charts import TiktokChartDay, TiktokChartType from server.schemas.base.image import ImageSizeTrackSpotifyDefaultMixin from server.schemas.base.schemas import RequestSchema, Schema class ChartDaysDayMixin: chart_days = EnumField(TiktokChartDay, data_key="days", missing=TiktokChartDay.DAY) class ChartTypeCreationsMixin: chart_type = EnumField(TiktokChartType, data_key="type", missing=TiktokChartType.CREATIONS) class TracksTiktokPositions: class Request( IsrcRequiredMixin, get_market_mixin(max_len=18), DateRangeMixin, ChartDaysDayMixin, ChartTypeCreationsMixin, RequestSchema, ): pass class Response(Schema): class PositionItem(Schema): date = DateStringField() value = fields.Integer() isrc = fields.String() start_date = DateStringField(attribute="min_date") end_date = DateStringField(attribute="max_date") days_on_list = fields.Integer() min_position = fields.Integer(attribute="max_position") peak_position = fields.Integer(attribute="min_position") total_tracks_in_chart = fields.Integer() items = fields.List(fields.Nested(PositionItem)) class TracksTiktokCharts: class Request( get_market_mixin(max_len=18), ChartDaysDayMixin, ChartTypeCreationsMixin, ImageSizeTrackSpotifyDefaultMixin, RequestSchema, ): chart_date = fields.Date(required=True, data_key="date") class Response(Schema): class Track(Schema): class Artist(Schema): class ExternalUrl(Schema): spotify = fields.String() id = fields.String() name = fields.String() external_urls = fields.Nested(ExternalUrl) href = fields.String() type = fields.String() uri = fields.String() id = fields.String() name = fields.String() isrc = fields.String() cover = fields.String() artists = fields.List(fields.Nested(Artist)) class Selected(Schema): class Position(Schema): value = fields.Integer() trend = fields.Integer() is_new = fields.Boolean() is_re_entry = fields.Boolean() class Change(Schema): value = fields.Integer() percent = fields.Integer() is_new = fields.Boolean() is_re_entry = fields.Boolean() start_date = DateStringField() end_date = DateStringField() position = fields.Nested(Position) change = fields.Nested(Change) creations = fields.Integer() class Previous(Schema): start_date = DateStringField() end_date = DateStringField() creations = fields.Integer() class Week(Schema): class Change(Schema): value = fields.Integer() percent = fields.Integer() start_date = DateStringField() creations = fields.Integer() change = fields.Nested(Change) track = fields.Nested(Track) selected = fields.Nested(Selected) previous = fields.Nested(Previous) week = fields.Nested(Week) top_markets = fields.List(fields.String()) days_on_list = fields.Integer() added_date = DateStringField() latest_date = DateStringField()