from apollo_utils.service.schemas.fields.datetime import DateStringField, ExtremeDateStringField from apollo_utils.service.schemas.fields.playlists import PlaylistIdField 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 MarketDefaultGlobalMixin, MarketUsMixin from datetime import date from marshmallow import fields, pre_dump, validate from server.constants import DSP from server.constants.tracks import CURRENT_PLACEMENT_TYPE, PLACEMENT_TYPES from server.schemas.base.schemas import RequestSchema, Schema from server.schemas.images.core_image_service import CoreImageServiceImageSizeMixin, CoreImageServiceImageUrlField from server.schemas.playlists.common.blue_dot import IsEntryBlueDotMixin class V2PlaylistsDspTrackBaseRequest(RequestSchema, IsrcRequiredMixin, CoreImageServiceImageSizeMixin): """Request schema to get history for spotify and apple playlists by tracks.""" playlist_type = fields.String( required=False, validate=validate.OneOf(PLACEMENT_TYPES), missing=CURRENT_PLACEMENT_TYPE, default=CURRENT_PLACEMENT_TYPE, ) class V2PlaylistsDspTrackBaseResponse(Schema, IsEntryBlueDotMixin): isrc = fields.String() playlist_id = fields.String(attribute="playlist.id", default=None) playlist_name = fields.String(attribute="playlist.name", default=None) country_code = fields.String(attribute="playlist.country_code", default=None) playlist_image = CoreImageServiceImageUrlField(attribute="playlist.image_url", default=None) current_position = fields.Integer(attribute="current") added_date = UnixEpochCheckAndReplaceDateStringField(attribute="earliest_position_date_time", truncate_str=True) removed_date = DateStringField(attribute="removed_date_time", truncate_str=True, default=None) personalized = fields.Boolean(attribute="playlist.is_personalised", default=None) previous_position = fields.Integer(attribute="previous") trend = fields.Integer() is_new = fields.Boolean(attribute="is_entry") class V2PlaylistsSpotifyTrack: """Request & Response schema for Spotify Track In Playlists (v2)""" class Request(V2PlaylistsDspTrackBaseRequest, MarketDefaultGlobalMixin): playlist_id = PlaylistIdField(required=True, dsp=DSP.SPOTIFY, validate=validate.Length(max=50)) class Response(V2PlaylistsDspTrackBaseResponse): changed_date = ExtremeDateStringField( attribute="playlist.dsp_sync_date_time", default=date.today().isoformat(), truncate_str=True ) class V2PlaylistsAppleTrack: """Request & Response schema for Apple Track In Playlists (v2)""" class Request(V2PlaylistsDspTrackBaseRequest, MarketUsMixin): playlist_id = PlaylistIdField(required=True, dsp=DSP.APPLE, validate=validate.Length(max=50)) class Response(V2PlaylistsDspTrackBaseResponse): changed_date = ExtremeDateStringField(attribute="latest_position_date_time", default=None, truncate_str=True) @pre_dump def _changed_date_field_attribute(self, data, *args, **kwargs): self.declared_fields["changed_date"].attribute = self.context["changed_date"] return data