from apollo_utils.core.constants.dsp import DSP_SPOTIFY_APPLE, DSP_SPOTIFY_APPLE_AMAZON from apollo_utils.core.constants.market import Market 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 apollo_utils.service.schemas.fields.string import CustomStringField from apollo_utils.service.schemas.mixins.date import DateRangeMixin from marshmallow import fields, validate from server.constants import SPOTIFY_ARTIST_URI_PREFIX from server.constants.artists import TracksTopInclude from server.schemas.base.pagination import get_pagination_mixin from server.schemas.base.schemas import RequestSchema, Schema class ArtistsTracks: class Request(RequestSchema, get_pagination_mixin(None, None)): artist_uri = CustomStringField( required=True, action=lambda value: ( value if value.startswith(SPOTIFY_ARTIST_URI_PREFIX) else f"{SPOTIFY_ARTIST_URI_PREFIX}{value}" ), data_key="spotify_artist_id", ) country_code = MarketField(validate=validate.Length(max=10, min=2), gl=Market.WORLDWIDE) dsp_list = EnumListField( DSP_SPOTIFY_APPLE_AMAZON, allow_all=True, as_enum=False, unify=True, data_key="dsp", missing=[DSP_SPOTIFY_APPLE_AMAZON.SPOTIFY.value], ) class Response(Schema): class Item(Schema): class Track(Schema): class Artist(Schema): name = fields.String() uri = fields.String() class Album(Schema): albumId = fields.String() name = fields.String() albumType = fields.Integer() popularity = fields.Integer() copyright = fields.String() label = fields.String() upc = fields.String() releaseDate = DateStringField() releaseDatePrecision = fields.String() smallImageFilename = fields.String() albumImageUrl = fields.String() trackUri = fields.String() albumUri = fields.String() previewUrl = fields.String() albumId = fields.String() albumName = fields.String() trackId = fields.String() trackName = fields.String() artists = fields.List(fields.Nested(Artist)) isrc = fields.String() popularity = fields.Integer() danceability = fields.Float() energy = fields.Float() audioKey = fields.Integer() loudness = fields.Float() audioMode = fields.Integer() speechiness = fields.Float() acousticness = fields.Float() instrumentalness = fields.Float() liveness = fields.Float() valence = fields.Float() tempo = fields.Float() albumPosition = fields.Integer() album = fields.Nested(Album) spotifyTrack = fields.Nested(Track) playlists = fields.Integer() totalPlaylistSubscribers = fields.Integer() streams_7_days = fields.Integer() streams_8_14_days = fields.Integer() items = fields.List(fields.Nested(Item)) class ArtistsTracksTop: class Request(RequestSchema, DateRangeMixin): spotify_artist_id = fields.String(required=True) country_code_list = SplitUniqueListField(fields.String(), required=True, data_key="country_code") dsp_list = EnumListField( DSP_SPOTIFY_APPLE, allow_all=True, as_enum=False, unify=True, data_key="dsp", missing=DSP_SPOTIFY_APPLE.values(), ) meta_country_code = fields.String(missing="us") limit = fields.Int(missing=10) include_list = EnumListField( TracksTopInclude, allow_all=True, as_enum=True, unify=True, data_key="include", missing=[TracksTopInclude.NAME], ) class Response(Schema): class Item(Schema): isrc = fields.String() name = fields.String() streams = fields.Integer() meta = fields.Raw() items = fields.List(fields.Nested(Item))