from apollo_utils.service.schemas.fields.datetime import DateStringField, DateTimeStringField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.mixins.isrc import IsrcRequiredMixin from marshmallow import fields, validate from server.constants.playlists.v0.misc import NMF_REGIONS, NMFTrackInclude, NMFTrackOrder from server.schemas.base.schemas import RequestSchema, Schema from server.schemas.clients.apollo_api import ApolloPaginationResponse class PlaylistsSummaryNMF: class Response(Schema): class NMFPlaylistsItem(Schema): playlistId = fields.String() name = fields.String() rank = fields.Integer() countryCode = fields.String() followers = fields.Integer() fridayLastUpdatedDate = DateStringField() trackLastAdded = DateTimeStringField() available_dates = fields.List(DateStringField()) playlists = fields.List(fields.Nested(NMFPlaylistsItem)) outdated_playlists = fields.List(fields.Nested(NMFPlaylistsItem)) last_updated = DateTimeStringField() class PlaylistsNMFCompleteness: class Response(Schema): last_updated = fields.String() markets_delayed = fields.List(fields.String()) class PlaylistsNMFTrack: class Request(RequestSchema, IsrcRequiredMixin): offset = fields.Integer(validate=validate.Range(min=0), default=0, missing=0) limit = fields.Integer(validate=validate.Range(min=1, max=2000), default=200, missing=200) order_by = SplitUniqueListField( fields.String(validate=validate.OneOf(NMFTrackOrder.values())), default=[NMFTrackOrder.POSITION.value, NMFTrackOrder.CODE.value], missing=[NMFTrackOrder.POSITION.value, NMFTrackOrder.CODE.value], ) include = SplitUniqueListField( fields.String(validate=validate.OneOf(NMFTrackInclude.values(with_all=True))), default=[], missing=[] ) region = fields.String(validate=validate.OneOf(NMF_REGIONS), missing=None, default=None) fields_with_all = {"include": NMFTrackInclude} class Response(ApolloPaginationResponse): class NMFTrackRegionResponseItem(Schema): name = fields.String() code = fields.String() placements = fields.Integer() total = fields.Integer() class NMFTrackPlaylistResponseItem(Schema): code = fields.String() name = fields.String() position = fields.Integer() playlist_id = fields.String() dsp = fields.String() playlist_name = fields.String() image_url = fields.String() items = fields.List(fields.Nested(NMFTrackPlaylistResponseItem)) total = fields.Integer() positions_avg = fields.Integer() positions_top_total = fields.Integer() top_playlist_image_url = fields.String() regions = fields.List(fields.Nested(NMFTrackRegionResponseItem))