from apollo_utils.service.schemas.fields.datetime import DateStringField, DateTimeStringField from apollo_utils.service.schemas.fields.enum import EnumListField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.mixins.isrc import IsrcListRequiredMixin from marshmallow import fields, validate from server.constants.playlists.delphi.core.include import StreamsForPeriod from server.constants.playlists.markets import APPLE_PLAYLISTS_TOP_28_MARKETS from server.schemas.base.pagination import PaginationResultMixin, get_pagination_mixin from server.schemas.base.schemas import RequestSchema, Schema from server.schemas.playlists.common.v3_playlists_by_track_history import V3PlaylistCommonByTrackHistory class V1PlaylistAppleByTrackHistory: class Request(RequestSchema, IsrcListRequiredMixin, get_pagination_mixin(page_limit=None)): """Request schema to get history for spotify playlists by tracks.""" country = SplitUniqueListField( fields.String(validate=validate.Length(max=10, min=2)), required=False, missing=APPLE_PLAYLISTS_TOP_28_MARKETS, ) meta_country_code = fields.String(validate=validate.Length(max=10, min=2), load_default="us") include_list = EnumListField(StreamsForPeriod, data_key="include", as_enum=True, allow_all=True, missing=[]) class Response(Schema, PaginationResultMixin): """Response playlists schema.""" class NestedItem(Schema): class ItemNestedOwner(Schema): accountId = fields.String(attribute="display_name", dump_default=None) categoryId = fields.Integer(attribute="owner_category.owner_category_id", dump_default=None) categoryName = fields.String(attribute="owner_category.name", dump_default=None) class ItemNestedCountries(Schema): countryCode = fields.String(attribute="playlist.country_code") num_days_on = fields.Integer(data_key="daysInPlaylist") earliest_position_date_time = DateStringField(data_key="earliestAdded") removed_date_time = DateTimeStringField(data_key="latestDate") isrc = fields.String() streams_7_days = fields.Integer(attribute=f"streaming_info.local.7.playlist") id = fields.String(attribute="playlist_id") name = fields.String(attribute="playlist.name") owner = fields.Nested(ItemNestedOwner, attribute="playlist.owner") countries = fields.Nested(ItemNestedCountries(many=True)) artwork = fields.Url(attribute="playlist.image_url") playlistType = fields.String(attribute="playlist.playlist_type") streams_global_7_days = fields.Integer(attribute=f"streaming_info.worldwide.7.playlist") items = fields.Nested(NestedItem(many=True)) class V3PlaylistAppleByTrackHistory: class Request(V3PlaylistCommonByTrackHistory.Request): pass class Response(Schema, PaginationResultMixin): class PlaylistCategoriesItemResponse(V3PlaylistCommonByTrackHistory.PlaylistCategoriesItemResponse): owner_category_id = fields.Integer(data_key="category_id") name = fields.String(data_key="category_name") class NestedItem(V3PlaylistCommonByTrackHistory.NestedItemResponse): """Response for apollo playlists with track historical item V3.""" pass items = fields.List(fields.Nested(NestedItem)) categories = fields.Nested(PlaylistCategoriesItemResponse(many=True))