from attrs import define from ..common.song import BaseSongItem from .driver import SoundCloudDriver @define class SongItem(BaseSongItem): @classmethod def from_soundcloud(cls, song_item: dict): return cls( name=song_item["title"], id=str(song_item["id"]), artists=[], thumbnail=( song_item["artwork_url"] or song_item["user"]["avatar_url"] or "https://soundcloud.com/images/default_avatar_large.png" ).replace("large.jpg", "t300x300.jpg"), preview_url=None, ) @property def all_artists(self): return None @define class Songs(object): driver: SoundCloudDriver async def search(self, query: str, limit: int = 30) -> list[SongItem] | None: r = await self.driver.search(query, limit=limit) if r is None: return None return [SongItem.from_soundcloud(item) for item in r][:limit] async def search_one(self, query: str) -> SongItem | None: return (await self.search(query, limit=1) or [None])[0] async def from_id(self, song_id: str) -> SongItem | None: r = await self.driver.get_track(song_id) if r is None: return None return SongItem.from_soundcloud(r) async def from_url(self, url: str) -> SongItem | None: r = await self.driver.resolve_url(url) if r is None: return None return SongItem.from_soundcloud(r)