103 lines
2.7 KiB
Python
103 lines
2.7 KiB
Python
from dataclasses import dataclass
|
|
from dataclasses import field
|
|
from typing import List
|
|
from typing import Optional
|
|
from typing import Union
|
|
|
|
from pydantic import BaseModel
|
|
from pydantic import Field
|
|
|
|
from shazamio.schemas.artist.views.full_albums import FullAlbumsModel
|
|
from shazamio.schemas.artist.views.last_release import LastReleaseModel
|
|
from shazamio.schemas.artist.views.simular_artists import SimularArtist
|
|
from shazamio.schemas.artist.views.top_music import TopMusicVideosView
|
|
from shazamio.schemas.artist.views.top_song import TopSong
|
|
from shazamio.schemas.attributes import ArtistAttribute
|
|
from shazamio.schemas.enums import ArtistExtend
|
|
from shazamio.schemas.enums import ArtistView
|
|
from shazamio.schemas.errors import ErrorModel
|
|
|
|
|
|
@dataclass
|
|
class ArtistInfo:
|
|
name: str
|
|
verified: Optional[bool]
|
|
genres: Optional[List[str]] = field(default_factory=list)
|
|
alias: Optional[str] = None
|
|
genres_primary: Optional[str] = None
|
|
avatar: Optional[Union[dict, str]] = None
|
|
adam_id: Optional[int] = None
|
|
url: Optional[str] = ""
|
|
|
|
def __post_init__(self):
|
|
self.avatar = self.__optional_avatar()
|
|
|
|
def __optional_avatar(self) -> Optional[str]:
|
|
if self.avatar is None:
|
|
return None
|
|
elif "default" in self.avatar:
|
|
return self.avatar.get("default")
|
|
else:
|
|
return "".join(self.avatar)
|
|
|
|
|
|
@dataclass
|
|
class ArtistV2:
|
|
artist: ArtistInfo
|
|
|
|
|
|
@dataclass
|
|
class ArtistQuery:
|
|
views: List[ArtistView] = field(default_factory=list)
|
|
extend: List[ArtistExtend] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class ArtistAvatar:
|
|
width: int
|
|
height: int
|
|
url: str
|
|
|
|
@classmethod
|
|
def url_with_size(cls, height: int, width: int) -> str:
|
|
return cls.url.format(w=width, h=height)
|
|
|
|
|
|
class AlbumRelationshipElement(BaseModel):
|
|
id: str
|
|
type: str
|
|
href: str
|
|
|
|
|
|
class AlbumRelationship(BaseModel):
|
|
href: str
|
|
next: Optional[str] = None
|
|
data: List[AlbumRelationshipElement]
|
|
|
|
|
|
class ArtistRelationships(BaseModel):
|
|
albums: AlbumRelationship
|
|
|
|
|
|
class ArtistViews(BaseModel):
|
|
top_music_videos: Optional[TopMusicVideosView] = Field(
|
|
None, alias="top-music-videos"
|
|
)
|
|
simular_artists: Optional[SimularArtist] = Field(None, alias="similar-artists")
|
|
latest_release: Optional[LastReleaseModel] = Field(None, alias="latest-release")
|
|
full_albums: Optional[FullAlbumsModel] = Field(None, alias="full-albums")
|
|
top_songs: Optional[TopSong] = Field(None, alias="top-songs")
|
|
|
|
|
|
class ArtistV3(BaseModel):
|
|
id: str
|
|
type: str
|
|
attributes: ArtistAttribute
|
|
relationships: ArtistRelationships
|
|
views: ArtistViews
|
|
|
|
|
|
class ArtistResponse(BaseModel):
|
|
errors: List[ErrorModel] = []
|
|
data: List[ArtistV3] = []
|