from apollo_utils.core.constants.dsp import DSP from apollo_utils.core.constants.market import Market from apollo_utils.service.schemas.fields.amazon_id import AmazonPlaylistIdField 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 SourceTrackISRCLowerMixin from apollo_utils.service.schemas.mixins.market import MarketDefaultGlobalMixin, convert_any_global_mixin from apollo_utils.service.schemas.mixins.search import SearchNoneLowerMixin from marshmallow import fields, post_load, validate from server.constants.tracks import BaseTrackListOrder from server.schemas.base.image import ImageSizeTrackAppleDefaultMixin from server.schemas.base.pagination import PaginationMixin from server.schemas.base.schemas import RequestSchema, Schema from server.schemas.clients.apollo_api import ApolloPaginationResponse class AmazonPlaylistTracklist: class Request( RequestSchema, MarketDefaultGlobalMixin, SearchNoneLowerMixin, SourceTrackISRCLowerMixin, PaginationMixin, ImageSizeTrackAppleDefaultMixin, convert_any_global_mixin("market", Market.US), ): """Amazon Playlist tracklist view params""" playlist_id = AmazonPlaylistIdField(required=True, dsp=DSP.AMAZON) order_by = SplitUniqueListField( fields.String(validate=validate.OneOf(BaseTrackListOrder.values())), default=[BaseTrackListOrder.ADDED_DATE.value], missing=[BaseTrackListOrder.ADDED_DATE.value], ) @post_load def reformat_search(self, data, *args, **kwargs): search = data.get("search") if search: data["search"] = search.split(",") if search.find(",") > 0 else [search] return data class Response(ApolloPaginationResponse): class SingleTrack(Schema): track_id = fields.String() current_position = fields.Integer(attribute="current") added_date = DateStringField(attribute="earliest_position_date") name = fields.String() isrc = fields.String() artists = fields.List(fields.String(), default=None) image_url = fields.String(default=None) previous_position = fields.Integer(attribute="previous_position_change_14_days") position_change_date = DateStringField(attribute="last_date_change_14_days") trend = fields.Integer(attribute="trend_change_14_days") is_new = fields.Function(lambda obj: not obj["num_days_on"]) update_date = DateTimeStringField(attribute="date") items = fields.List(fields.Nested(SingleTrack))