Add soundcloud support
This commit is contained in:
55
bot/modules/soundcloud/song.py
Normal file
55
bot/modules/soundcloud/song.py
Normal file
@@ -0,0 +1,55 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user