from apollo_utils.core.constants import MARKET_WORLDWIDE from apollo_utils.service.schemas.fields.datetime import DateStringField from apollo_utils.service.schemas.fields.enum import EnumListField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.fields.market import MarketField from marshmallow import fields, post_load, validate from server.constants.charts.tracks.streams import ChartsTracksInclude from server.constants.common import SortOrder from server.constants.distributors import DISTRIBUTORS from server.schemas.base.image import ImageSizeTrackSpotifyDefaultMixin from server.schemas.base.schemas import RequestSchema, Schema class Streams(Schema): streams_days_7 = fields.Integer() streams_days_8_14 = fields.Integer() class ChartsTracks: class Request(ImageSizeTrackSpotifyDefaultMixin, RequestSchema): distributors = EnumListField(DISTRIBUTORS, unify=True, missing=None, as_enum=True) country_code = SplitUniqueListField( MarketField(gl=MARKET_WORLDWIDE), required=True, validate=validate.Length(min=1) ) include = EnumListField(ChartsTracksInclude, as_enum=True) isrc_country_code = SplitUniqueListField(MarketField(gl=MARKET_WORLDWIDE)) percent_change = fields.Float() min_product_sale_date = fields.Date() max_product_sale_date = fields.Date() sort_by = fields.String( validate=validate.OneOf( ( "streams_days_7", "streams_days_8_14", "streams_change_7_to_14_days", "streams_change_percent_7_to_14_days", "streams_change_7_to_14_days_lean_back", "streams_change_7_to_14_days_lean_forward", "streams_change_percent_7_to_14_days_lean_back", "streams_change_percent_7_to_14_days_lean_forward", ), ), ) sort_order = fields.String(validate=validate.OneOf((SortOrder.ASC.value, SortOrder.DESC.value))) limit = fields.Integer(validate=validate.Range(min=1)) offset = fields.Integer(validate=validate.Range(min=0)) spotify_country_code = MarketField(gl="us", missing="us") @post_load def check_country_code(self, data, **kwargs): if data.get("country_code") and MARKET_WORLDWIDE in data["country_code"]: data["country_code"] = [MARKET_WORLDWIDE] return data class Response(Schema): class SpotifyTrackMeta(Schema): spotify_track_id = fields.String() track_name = fields.String() artist_names = fields.List(fields.String()) track_uri = fields.String() class GrasTrackMeta(Schema): class Label(Schema): name = fields.String() label_id = fields.String() class Artist(Schema): class Image(Schema): uri = fields.String() height = fields.Integer() width = fields.Integer() artist_id = fields.String() full_name = fields.String() first_name = fields.String() last_name = fields.String() apple_artist_id = fields.Integer() spotify_artist_id = fields.String() spotify_popularity = fields.Integer() image = fields.Nested(Image) track_id = fields.String() track_name = fields.String() release_date = DateStringField() label = fields.Nested(Label) artists = fields.List(fields.Nested(Artist)) class Metrics(Schema): class Change(Schema): streams_change_7_to_14_days = fields.Integer() streams_change_percent_7_to_14_days = fields.Float() class Demographics(Schema): male = fields.Nested(Streams) female = fields.Nested(Streams) totals = fields.Nested(Streams) change = fields.Nested(Change) lean_back = fields.Nested(Streams) lean_forward = fields.Nested(Streams) demographics = fields.Nested(Demographics) isrc = fields.String() distributed_by = fields.String(default=None) latest_entry_date = DateStringField() product_sale_date = DateStringField() country_code = fields.List(fields.String()) isrc_country_code = fields.String() spotify_top_track_meta = fields.Nested(SpotifyTrackMeta) gras_track_meta = fields.Nested(GrasTrackMeta) metrics = fields.Nested(Metrics) is_starred = fields.Boolean() spotify_meta = fields.Raw() image_url = fields.String()