diff --git a/function.py b/function.py index 05e1e12..1dde457 100644 --- a/function.py +++ b/function.py @@ -4,7 +4,6 @@ import aiohttp import os from discord.ext import commands -from random import choice from datetime import datetime from time import strptime from io import BytesIO @@ -170,48 +169,6 @@ async def checkroles(userid:int): return rank, max_p, max_t -async def similar_track(player) -> bool: - trackids = [ track.identifier for track in player.queue.history(incTrack=True) if track.source == 'youtube' ] - randomTrack = choice(player.queue.history(incTrack=True)[-10:]) - tracks = [] - - if randomTrack.spotify: - tracks = await player.spotifyRelatedTrack(randomTrack.identifier) - else: - if randomTrack.source != 'youtube': - return False - - if not tokens.youtube_api_key: - return False - - request_url = "https://youtube.googleapis.com/youtube/v3/search?part={part}&relatedToVideoId={videoId}&type={type}&videoCategoryId={videoCategoryId}&key={key}".format( - part="snippet", - videoId=randomTrack.identifier, - type="video", - videoCategoryId="10", - key=tokens.youtube_api_key - ) - - try: - data = await requests_api(request_url) - if not data: - return False - - for item in data['items']: - if 'snippet' not in item: - continue - if item['id']['videoId'] not in trackids: - tracks = await player.get_tracks(f"https://www.youtube.com/watch?v={item['id']['videoId']}", requester=player._bot.user) - break - except: - return False - - if tracks: - await player.add_track(tracks) - return True - - return False - def time(millis:int) -> str: seconds=(millis/1000)%60 minutes=(millis/(1000*60))%60 diff --git a/voicelink/player.py b/voicelink/player.py index 7cf68db..4d94a95 100644 --- a/voicelink/player.py +++ b/voicelink/player.py @@ -52,11 +52,11 @@ from .enums import SearchType, LoopType from .events import VoicelinkEvent, TrackEndEvent, TrackStartEvent from .exceptions import VoicelinkException, FilterInvalidArgument, TrackInvalidPosition, TrackLoadError, FilterTagAlreadyInUse, DuplicateTrack from .filters import Filter, Filters -from .objects import Track +from .objects import Track, Playlist from .pool import Node, NodePool from .queue import Queue, FairQueue from .placeholders import Placeholders, build_embed -from random import shuffle +from random import shuffle, choice async def connect_channel(ctx: Union[commands.Context, Interaction], channel: VoiceChannel = None): try: @@ -459,28 +459,7 @@ class Player(VoiceProtocol): } ) for track in tracks ] - - async def spotifyRelatedTrack(self, seed_tracks: str): - - tracks = await self._node._spotify_client.similar_track(seed_tracks=seed_tracks) - - return [ Track( - track_id=None, - search_type=SearchType.ytsearch, - spotify_track=track, - info={ - "title": track.name, - "author": track.artists, - "length": track.length, - "identifier": track.id, - "artistId": track.artistId, - "uri": track.uri, - "isStream": False, - "isSeekable": True, - "position": 0, - "thumbnail": track.image - }, - requester=self.client.user + info=track.to_dict() ) for track in tracks ] @@ -677,8 +656,7 @@ class Player(VoiceProtocol): await self.seek(self.position) async def change_node(self, identifier: str = None) -> None: - """Change node. - """ + """Change node.""" try: node = NodePool.get_node(identifier=identifier) except: @@ -700,6 +678,41 @@ class Player(VoiceProtocol): if self.volume != 100: await self.set_volume(self.volume) + async def get_recommendations(self, *, track: Track = None) -> bool: + """Get recommendations from Youtube or Spotify.""" + if not track: + track = choice(self.queue.history(incTrack=True)[-5:]) + + if track.spotify: + spotify_tracks = await self._node._spotify_client.similar_track(seed_tracks=track.identifier) + + tracks = [ Track( + track_id=None, + search_type=SearchType.ytsearch, + spotify_track=track, + info=track.to_dict(), + requester=self.client.user + ) + for track in spotify_tracks ] + + else: + if track.source != 'youtube': + return False + + tracks = await self.get_tracks( + f"https://www.youtube.com/watch?v={track.identifier}&list=RD{track.identifier}", + requester=self.client.user + ) + + if tracks: + if isinstance(tracks, Playlist): + await self.add_track(tracks.tracks, duplicate=False) + else: + await self.add_track(tracks, duplicate=False) + return True + + return False + async def send_ws(self, payload, requester: Member = None): payload['guild_id'] = self.guild.id if requester: