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

197 lines
3.9 KiB
Python

from dataclasses import dataclass, field
from typing import List, Optional, Union
from urllib.parse import urlencode, urlparse, urlunparse
from uuid import UUID
@dataclass
class ShareModel:
subject: str
text: str
href: str
image: str
twitter: str
html: str
snapchat: str
@dataclass
class ActionModel:
name: str
type: str
share: ShareModel
uri: str
@dataclass
class SongMetaPages:
image: str
caption: str
@dataclass
class SongMetadata:
title: str
text: str
@dataclass
class SongSection:
type: str
meta_pages: List[SongMetaPages]
tab_name: str
metadata: List[SongMetadata]
@dataclass
class BaseIdTypeModel:
type: str
id: str
@dataclass
class TopTracksModel:
url: str
@dataclass
class ArtistSection:
type: str
id: str
name: str
verified: bool
actions: List[BaseIdTypeModel]
tab_name: str
top_tracks: TopTracksModel
class BeaconDataLyricsSection:
lyrics_id: str
provider_name: str
common_track_id: str
@dataclass
class LyricsSection:
type: str
text: List[str]
footer: str
tab_name: str
beacon_data: Optional[BeaconDataLyricsSection]
@dataclass
class VideoSection:
tab_name: str
youtube_url: str
type: str = "VIDEO"
@dataclass
class RelatedSection:
type: str
url: str
tab_name: str
@dataclass
class DimensionsModel:
width: int
height: int
@dataclass
class YoutubeImageModel:
dimensions: DimensionsModel
url: str
@dataclass
class MatchModel:
id: str
offset: float
time_skew: float
frequency_skew: float
channel: Optional[str] = field(default=None)
@dataclass
class LocationModel:
accuracy: float
@dataclass
class YoutubeData:
caption: str
image: YoutubeImageModel
actions: List[ActionModel]
uri: Optional[str] = None
def __post_init__(self):
self.uri = self.__get_youtube_uri()
def __get_youtube_uri(self):
if self.actions:
for action in self.actions:
if action.uri:
return action.uri
@dataclass
class TrackInfo:
key: int
title: str
subtitle: str
artist_id: Optional[str] = field(default=None)
shazam_url: str = None
photo_url: Optional[str] = field(init=False, default=None)
spotify_uri_query: Optional[str] = None
apple_music_url: Optional[str] = None
ringtone: Optional[str] = None
spotify_url: Optional[str] = field(default=None)
spotify_uri: Optional[str] = field(default=None)
youtube_link: Optional[str] = None
sections: Optional[
List[
Union[
SongSection,
VideoSection,
RelatedSection,
ArtistSection,
LyricsSection,
]
]
] = field(default_factory=list)
def __post_init__(self):
self.shazam_url = f"https://www.shazam.com/track/{self.artist_id}"
self.apple_music_url = self.__apple_music_url()
self.spotify_uri_query = self.__short_uri()
self.youtube_link = self.__youtube_link()
def __apple_music_url(self):
url_parse_list = list(urlparse(self.apple_music_url))
url_parse_list[4] = urlencode({}, doseq=True)
url_deleted_query = urlunparse(url_parse_list)
return url_deleted_query
def __short_uri(self):
if self.spotify_uri:
return self.spotify_uri.split("spotify:search:")[1]
def __youtube_link(self):
for i in self.sections:
if type(i) is VideoSection:
return i.youtube_url
@dataclass
class ResponseTrack:
tag_id: Optional[UUID]
retry_ms: Optional[int] = field(default=None)
location: Optional[LocationModel] = field(default=None)
matches: List[MatchModel] = field(default_factory=list)
timestamp: Optional[int] = field(default=None)
timezone: Optional[str] = field(default=None)
track: Optional[TrackInfo] = field(default=None)