from apollo_utils.service.schemas.fields.amazon_id import AmazonPlaylistIdField from apollo_utils.service.schemas.fields.datetime import DateTimeStringField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.mixins.date import DateRangeOptionalMixin from apollo_utils.service.schemas.mixins.isrc import IsrcRequiredMixin from apollo_utils.service.schemas.mixins.market import MarketListOptionalMixin from marshmallow import fields, validate from server.constants.playlists.v0.misc import StreamsType from server.constants.tracks import TrackPlaylistsAmazonOrder from server.schemas.base.pagination import PaginationMixin from server.schemas.base.schemas import RequestSchema, Schema from server.schemas.clients.apollo_api import ApolloPaginationResponse from server.schemas.playlists.v0.base import StreamsTypeTrackMixin class PlaylistsAmazonByTrack: class Request( RequestSchema, MarketListOptionalMixin, DateRangeOptionalMixin, IsrcRequiredMixin, StreamsTypeTrackMixin, PaginationMixin, ): """Request schema to get amazon playlists by tracks.""" recent_adds_only = fields.Bool(data_key="recent_adds_only", missing=False, default=False) keep_zero_streams = fields.Bool(data_key="keep_zero_streams", missing=True, default=True) search = fields.String(validate=validate.Length(min=1, max=50), required=False, missing=None) order_by = SplitUniqueListField( fields.String(validate=validate.OneOf(TrackPlaylistsAmazonOrder.values())), default=[TrackPlaylistsAmazonOrder.ADDED_DATE.value], missing=[TrackPlaylistsAmazonOrder.ADDED_DATE.value], ) class Response(ApolloPaginationResponse): class ItemResponse(Schema): id = AmazonPlaylistIdField() added_date = DateTimeStringField(attribute="earliest_position_date") name = fields.String(attribute="playlist.name") country_code = fields.String(attribute="playlist.country_code") image_url = fields.String(attribute="playlist.image.uri") current_position = fields.Integer(attribute="current") updated_date = DateTimeStringField(attribute="date") is_new = fields.Function(lambda obj: not obj["num_days_on"]) trend = fields.Integer(attribute="trend_change_14_days") position_change_date = DateTimeStringField(attribute="last_date_change_14_days") current_streams = fields.Integer() prev_streams = fields.Integer() items = fields.List(fields.Nested(ItemResponse)) streams_type = fields.String(default=StreamsType.TRACK.value)