"""Data models for Spotify.""" from typing import Dict from typing import List from pydantic import BaseModel from src.common.types import ApiRequestType from src.common.types import BaseAPIRequest class SpotifySearchAlbumByUPCRequestPayload(BaseModel): """Request payload model for Spotify Search by UPC.""" product_id: int upc: int vendor_id: int subaccount_id: int class SpotifySearchTrackByISRCRequestPayload(BaseModel): """Request payload model for Spotify Search by ISRC.""" isrc: str vendor_id: int subaccount_id: int class SpotifySearchAlbumByUPCRequest(BaseModel, BaseAPIRequest): """Request model for Spotify Search by UPC.""" request_type: ApiRequestType payload: SpotifySearchAlbumByUPCRequestPayload @property def endpoint(self) -> str: """Store API endpoint.""" return '/search' @property def endpoint_params(self) -> Dict: """Get API endpoint parameters.""" return {'q': f'upc:{self.payload.upc}', 'type': 'album'} class SpotifySearchTrackByISRCRequest(BaseModel, BaseAPIRequest): """Request model for Spotify Search by ISRC.""" request_type: ApiRequestType payload: SpotifySearchTrackByISRCRequestPayload @property def endpoint(self) -> str: """Store API endpoint.""" return '/search' @property def endpoint_params(self) -> Dict: """Get API endpoint parameters.""" return {'q': f'isrc:{self.payload.isrc}', 'type': 'track'} class SpotifyArtist(BaseModel): """Spotify API artist model.""" id: str name: str class SpotifyImage(BaseModel): """Spotify API image model.""" url: str height: int width: int class SpotifyAlbum(BaseModel): """Spotify API album model.""" images: List[SpotifyImage] class SpotifyTrack(BaseModel): """Spotify API track model.""" id: str name: str artists: List[SpotifyArtist] album: SpotifyAlbum class SpotifySearchAlbums(BaseModel): """Spotify API albums model.""" items: List[SpotifyAlbum] class SpotifySearchTracks(BaseModel): """Spotify API tracks model.""" items: List[SpotifyTrack] class SpotifySearchAlbumsResponse(BaseModel): """Spotify API search albums model.""" albums: SpotifySearchAlbums class SpotifySearchTracksResponse(BaseModel): """Spotify API search tracks model.""" tracks: SpotifySearchTracks class SpotifySearchAlbumArtistMessage(BaseModel): """Spotify API search album artists model.""" api_request: SpotifySearchAlbumByUPCRequest artist: SpotifyArtist class SpotifySearchTrackArtistMessage(BaseModel): """Spotify API search track artists model.""" api_request: SpotifySearchTrackByISRCRequest artist: SpotifyArtist class SpotifySearchTrackMessage(BaseModel): """Spotify API search track model.""" api_request: SpotifySearchTrackByISRCRequest track: SpotifyTrack class SpotifySearchAlbumMessage(BaseModel): """Spotify API search album model.""" api_request: SpotifySearchAlbumByUPCRequest album: SpotifyAlbum class SpotifyGetAudioFeaturesRequestPayload(BaseModel): """Request payload model for audio features request.""" spotify_track_ids: List[str] class SpotifyGetAudioFeaturesRequest(BaseModel, BaseAPIRequest): """Request model for audio features request.""" request_type: ApiRequestType payload: SpotifyGetAudioFeaturesRequestPayload @property def endpoint(self) -> str: """Store API endpoint.""" return '/audio-features' @property def endpoint_params(self) -> Dict: """Get API endpoint parameters.""" return {'ids': ','.join(self.payload.spotify_track_ids)} class SpotifyAudioFeature(BaseModel): """Spotify API audio features model.""" acousticness: float analysis_url: str danceability: float duration_ms: int energy: float id: str instrumentalness: float key: int liveness: float loudness: float mode: int speechiness: float tempo: float time_signature: int track_href: str type: str uri: str valence: float