from apollo_utils.service.schemas.fields.datetime import DateStringField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.fields.unix_epoch import UnixEpochCheckAndReplaceDateStringField from apollo_utils.service.schemas.mixins.isrc import IsrcRequiredMixin from apollo_utils.service.schemas.mixins.market import MarketListAllAndGlobalReplaceMixin, convert_any_global_mixin from functools import partial from marshmallow import fields, validate from server.constants.playlists.delphi.by_api.track_positions_playlists import TrackPositionsPlaylists, \ TrackPositionsPlaylistsApolloToDelphiProcessedFieldsSortByMapping from server.schemas.base.pagination import PaginationMixin from server.schemas.base.schemas import RequestSchema, Schema from server.schemas.images.core_image_service import CoreImageServiceImageUrlField from server.schemas.playlists.common.blue_dot import IsEntryBlueDotMixin from server.schemas.playlists.v0.base import StreamsTypeTrackMixin from server.utils.mappers.core.getters import getter from server.utils.mappers.misc import format_id class V3PlaylistCommonByTrack: class Request( RequestSchema, IsrcRequiredMixin, MarketListAllAndGlobalReplaceMixin, StreamsTypeTrackMixin, PaginationMixin, convert_any_global_mixin("streams_market", TrackPositionsPlaylists.STREAMS_COUNTRY_CODE.WORLDWIDE.value), ): """(v3) Common Request schema to get spotify or apple playlists by track.""" recent_adds_only = fields.Bool(data_key="recent_adds_only", load_default=False) category_id = fields.Integer(missing=None, load_default=None) keep_zero_streams = fields.Bool(data_key="keep_zero_streams", load_default=True) search = fields.String(validate=validate.Length(min=1, max=50), required=False, load_default=None) streams_market = fields.String( validate=validate.Length(max=10, min=2), load_default=TrackPositionsPlaylists.STREAMS_COUNTRY_CODE.LOCAL.value, ) order_by = SplitUniqueListField( fields.String( validate=validate.OneOf(TrackPositionsPlaylistsApolloToDelphiProcessedFieldsSortByMapping.keys()) ), default=[TrackPositionsPlaylists.SORT_BY.ADDED_DATE.value], missing=[TrackPositionsPlaylists.SORT_BY.ADDED_DATE.value], ) class PlaylistCategoriesItemResponse(Schema): """Response playlists categories schema.""" owner_category_id = fields.Integer(data_key="category_id") name = fields.String(data_key="category_name") class NestedItemResponse(Schema, IsEntryBlueDotMixin): playlist_id = fields.String(data_key="id") earliest_position_date_time = UnixEpochCheckAndReplaceDateStringField(data_key="added_date") name = fields.String(attribute="playlist.name") country_code = fields.String(attribute="playlist.country_code") image_url = CoreImageServiceImageUrlField(attribute="playlist.image_url") current = fields.Integer(data_key="current_position") track_id = fields.String() updated_date = DateStringField(truncate_str=True, attribute="latest_position_date_time", dump_default=None) is_entry = fields.Boolean(data_key="is_new") trend = fields.Integer() change_position_date_time = DateStringField(data_key="position_change_date") followers = fields.Integer(attribute="playlist.followers", dump_default=None) username = fields.Function( lambda i: getter(item=i, key=f"playlist.owner.username", f=partial(format_id, remove_prefix=True)), dump_default=None, ) category_id = fields.Integer(attribute="playlist.owner.owner_category.owner_category_id", dump_default=None) category_name = fields.String(attribute="playlist.owner.owner_category.name", dump_default=None) prev_streams = fields.Integer(allow_none=True, dump_default=None) current_streams = fields.Integer(allow_none=True, dump_default=None)