Files
AnyMusicBot/lib/ShazamIO/shazamio/schemas/artists.py
2024-11-02 00:10:44 +02:00

97 lines
2.6 KiB
Python

from dataclasses import dataclass, field
from typing import List, Optional, Union
from pydantic import BaseModel, 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, 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] = []