from apollo_utils.core.constants.dsp import DSP from apollo_utils.service.schemas.fields.datetime import DateStringField, ExtremeDateStringField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.fields.market import MarketField from apollo_utils.service.schemas.fields.playlists import PlaylistIdField from apollo_utils.service.schemas.swagger.types import ApispecTypes from marshmallow import fields, validate from server.constants.market import Market from server.schemas.base.schemas import RequestSchema, Schema from server.schemas.images.core_image_service import CoreImageServiceImageUrlField, \ get_core_image_service_image_size_mixin class V1PlaylistsAppleInfo: class Request(RequestSchema, get_core_image_service_image_size_mixin(load_default=300)): playlist_ids = SplitUniqueListField( PlaylistIdField(required=True, dsp=DSP.APPLE, validate=validate.Length(max=50)), data_key="id", required=True, ) country_code = MarketField( data_key="market", missing=None, validate=validate.Length(min=2, max=10), gl=Market.US ) class Response(Schema): id = PlaylistIdField(required=True, dsp=DSP.APPLE, validate=validate.Length(max=50)) name = fields.String() updated_date = ExtremeDateStringField( attribute="playlist.dsp_sync_date_time", truncate_str=True, example=ApispecTypes.DATE ) image_url = CoreImageServiceImageUrlField() country_code = fields.String() owner = fields.String(attribute="owner.display_name", default=None) class V1PlaylistApple: class Request(RequestSchema): playlist_id = fields.List( PlaylistIdField(required=True, dsp=DSP.APPLE, validate=validate.Length(max=50)), required=True ) country = fields.String(validate=validate.Length(max=10, min=2), load_default="us") class Response(Schema): class NestedOwner(Schema): accountName = fields.String(attribute="display_name") categoryName = fields.String(attribute="owner_category.name", default=None) id = fields.String() artwork = fields.Url(attribute="image_url") name = fields.String() tracklistCountryCode = fields.String(attribute="country_code") latestUpdate = DateStringField(attribute="playlist.dsp_update_date_time", truncate_str=True) appleMusicUpdate = ExtremeDateStringField( truncate_str=True, attribute="playlist.dsp_sync_date_time", example=ApispecTypes.DATE ) owner = fields.Nested(NestedOwner)