from marshmallow import ValidationError, fields, validate, validates_schema from server.apple.constants import APPLE_MAX_IMAGE_SIZE, ITEM_TYPES, US_MARKET from server.core.deserializers import ListField, OffsetDefaultMixin, QueryWebArgs class LimitDefaultMixin: limit = fields.Integer(missing=10, validate=validate.Range(min=0, max=25)) class MarketMixin: market = fields.String(missing=US_MARKET) class IncludeMixin: include = ListField(fields.String(validate=validate.Length(min=1))) class ExtendMixin: extend = ListField(fields.String(validate=validate.Length(min=1))) class IdsMixin: ids = ListField(fields.Str(), validate=validate.Length(min=1), required=True) class LocalizationMixin: localization = fields.String(validate=validate.Length(min=2, max=2), data_key="l") class ImageSizeMixin: image_size = fields.Int( allow_none=True, validate=validate.Range(max=APPLE_MAX_IMAGE_SIZE, min=0, min_inclusive=False) ) class TrackDetailedDeserializer(QueryWebArgs, MarketMixin, IncludeMixin, LocalizationMixin): pass class TracksDeserializer(QueryWebArgs, MarketMixin, IncludeMixin, LocalizationMixin): ids = ListField(fields.Str()) isrc_list = ListField(fields.Str(), data_key="isrc") isrc_filter = ListField(fields.Str(), data_key="filter[isrc]") @validates_schema def validate_fields(self, data, *args, **kwargs): ids = data.get("ids") isrc_list = data.get("isrc_list") or data.get("isrc_filter") if not ids and not isrc_list: raise ValidationError("Please specify one of ids or isrc fields.") class TracksImagesDeserializer(TracksDeserializer, ImageSizeMixin): pass class TrackISRCDeserializer(QueryWebArgs): isrc_list = ListField(fields.Str(), data_key="isrc") market = fields.String(missing=US_MARKET) class PlaylistDeserializer(QueryWebArgs, MarketMixin, IncludeMixin, LocalizationMixin): include_songs = ListField(fields.String(validate=validate.Length(min=1)), data_key="include[songs]") include_music_videos = ListField(fields.String(validate=validate.Length(min=1)), data_key="include[music-videos]") include_library_playlists = ListField( fields.String(validate=validate.Length(min=1)), data_key="include[library-playlists]", ) class PlaylistsDeserializer(QueryWebArgs, IdsMixin, MarketMixin, IncludeMixin, LocalizationMixin): pass class PlaylistsImagesDeserializer(QueryWebArgs, IdsMixin, MarketMixin, ImageSizeMixin): pass class AlbumDeserializer(QueryWebArgs, MarketMixin, IncludeMixin, LocalizationMixin): pass class AlbumsDeserializer(QueryWebArgs, IdsMixin, MarketMixin, IncludeMixin, LocalizationMixin): pass class StationDeserializer(QueryWebArgs, MarketMixin, IncludeMixin, LocalizationMixin): pass class StationsDeserializer(QueryWebArgs, IdsMixin, MarketMixin, IncludeMixin, LocalizationMixin): pass class StorefrontsDeserializer(QueryWebArgs, ExtendMixin, IncludeMixin, LocalizationMixin): pass class SearchDeserializer(QueryWebArgs, LimitDefaultMixin, OffsetDefaultMixin, LocalizationMixin, MarketMixin): query = fields.Str(validate=validate.Length(min=2)) term = fields.Str() item_type = ListField(fields.String(validate=validate.OneOf(ITEM_TYPES)), missing=["songs"]) types = ListField(fields.String()) @validates_schema def validate_fields(self, data, **kwargs): if not data.get("query") and not data.get("term"): raise ValidationError("Please specify one of term or query fields.")