"""Schemas for Spotify playlists.""" import re from copy import deepcopy from marshmallow import fields, pre_dump from sound_recordings.schemas import fields as custom_fields from sound_recordings.schemas.common import BaseSchema, SourceSchema APPLE_IMAGE_SIZE = 804 class StorefrontSchema(BaseSchema): """Marshmallow schema for storefront property.""" track_count = fields.Integer(data_key="track_count") playlist_uri = fields.String(data_key="uri") country = fields.String() class StorefrontsSchema(BaseSchema): """Marshmallow schema for storefront placements.""" @pre_dump def denormalize(self, data_in, **kwargs): """Denormalize fields of storefronts for JSON payload structure.""" result = deepcopy(data_in) if "artwork_url" in data_in.keys(): result["artwork_url"] = _format_artwork_property(data_in) result["storefront"] = deepcopy(data_in) return result storefront = fields.Nested(nested=StorefrontSchema) position = fields.Integer() previous_position = fields.Integer(data_key="previous_position") streams_7_days = fields.Number(data_key="streams") added = custom_fields.UnifiedDate() class PlaylistTracksSchema(BaseSchema): """Marshmallow schema for tracks on a playlist.""" length = fields.Integer() class PlaylistSchema(BaseSchema): """Marshmallow schema for playlists.""" @pre_dump def denormalize(self, data_in, **kwargs): """Denormalize fields of playlist for JSON payload structure.""" result = deepcopy(data_in) result["sound_recordings"] = _format_sound_recording_property(data_in) if "artwork_url" in data_in.keys(): result["artwork_url"] = _format_artwork_property(data_in) result["source"] = {"id": data_in["store_id"]} return result source = fields.Nested(nested=SourceSchema) playlist_id = fields.String(data_key="id") playlist_uri = fields.String(data_key="uri") user_display_name = fields.String(data_key="user_display_name") owner_category = fields.String() storefront = fields.String() playlist_name = fields.String(data_key="name") artwork_url = fields.String(data_key="image_location") country = fields.String() sound_recordings = fields.Nested(nested=PlaylistTracksSchema) followers = fields.Number() class PlacementSchema(BaseSchema): """Marshmallow schema for placements.""" @pre_dump def denormalize(self, data_in, **kwargs): """Denormalize fields of placement for JSON payload structure.""" result = deepcopy(data_in) result["playlist"] = data_in return result isrc = fields.String() position = fields.Integer() previous_position = fields.Integer(data_key="previous_position") total_streams = fields.Number(data_key="streams") added = custom_fields.UnifiedDate() playlist = fields.Nested(nested=PlaylistSchema) storefronts = fields.Nested( nested=StorefrontsSchema, many=True, data_key="storefront_placements" ) class RecentPlacementsSchema(BaseSchema): """Marshmallow schema for recent placements response object.""" count = fields.Integer() total = fields.Integer() items = fields.Nested(nested=PlacementSchema, many=True) sources = fields.Nested(nested=SourceSchema, many=True) def _format_track_property(data_in): """Format track property.""" return {"length": data_in["trackcount"]} def _format_sound_recording_property(data_in): """Format track property.""" return {"length": data_in["track_count"]} def _format_artwork_property(data_in): """Format artwork property.""" if data_in["artwork_url"] is not None: return re.sub( "(.*)\\{w\\}x\\{h\\}(.*)", "\\g<1>%sx%s\\g<2>" % (APPLE_IMAGE_SIZE, APPLE_IMAGE_SIZE), data_in["artwork_url"], )