diff --git a/function.py b/function.py index f002694..73e7e5c 100644 --- a/function.py +++ b/function.py @@ -8,10 +8,6 @@ from random import choice from time import strptime from pymongo import MongoClient -if not os.path.exists("./.env"): - print("Error .env file not set!") - exit() - if not os.path.exists("./settings.json"): print("Error: Settings file not set!") exit() @@ -19,15 +15,20 @@ if not os.path.exists("./settings.json"): #-------------- API Clients -------------- load_dotenv() #Load .env settings MONGODB_NAME = os.getenv('MONGODB_NAME') +MONGODB_URL = os.getenv('MONGODB_URL') +if not (MONGODB_NAME and MONGODB_URL): + print("MONGODB_NAME and MONGODB_URL can't not be empty in .env") + exit() + youtube_api_key = os.getenv('YOUTUBE_API_KEY') -mongodb = MongoClient(os.getenv('MONGODB_URL')) +mongodb = MongoClient(MONGODB_URL) collection = mongodb[MONGODB_NAME]['Settings'] Playlist = mongodb[MONGODB_NAME]['Playlist'] #--------------- Cache Var --------------- invite_link = "https://discord.gg/wRCgB7vBQv" #Template of invite link embed_color = None -report_channel_id = int(os.getenv("BUG_REPORT_CHANNEL_ID")) +report_channel_id = int(channel_id) if (channel_id := os.getenv("BUG_REPORT_CHANNEL_ID")) else 0 emoji_source_raw = {} #Stores all source emoji for track error_log = {} #Stores error that not a Voicelink Exception bot_access_user = [] #Stores bot access user id @@ -161,6 +162,9 @@ async def similar_track(player): if randomTrack.source != 'youtube': return False + if not 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, diff --git a/settings Example.json b/settings Example.json index 110bd8e..94acc31 100644 --- a/settings Example.json +++ b/settings Example.json @@ -8,7 +8,7 @@ } }, "bot_access_user": [], - "color_code":"", + "color_code":"0xb3b3b3", "emoji_source_raw": { "youtube": "<:youtube:826661982760992778>", "youtube music": "<:youtube:826661982760992778>", diff --git a/view/inbox.py b/view/inbox.py index 9697027..5f8cec9 100644 --- a/view/inbox.py +++ b/view/inbox.py @@ -22,8 +22,7 @@ SOFTWARE. """ import discord - -from function import embed_color +import function class Select_message(discord.ui.Select): def __init__(self, inbox): @@ -52,7 +51,7 @@ class InboxView(discord.ui.View): def build_embed(self): embed=discord.Embed(title=f"📭 All {self.author}'s Inbox", description=f'Max Messages: {len(self.inbox)}/10' + '```%0s %2s %20s\n' % (" ", "ID:", "Title:") + '\n'.join('%0s %2s. %35s'% ('✉️' if mail['type'] == 'invite' else '📢', index, mail['title'][:35] + "...") for index, mail in enumerate(self.inbox, start=1)) + '```', - color=embed_color) + color=function.embed_color) if self.current: embed.add_field(name="Message Info:", value=f"```{self.current['description']}\nSender ID: {self.current['sender']}\nPlaylist ID: {self.current['referId']}\nInvite Time: {self.current['time'].strftime('%d-%m %H:%M:%S')}```") return embed diff --git a/view/list.py b/view/list.py index 4210f7a..e18cb64 100644 --- a/view/list.py +++ b/view/list.py @@ -24,10 +24,7 @@ SOFTWARE. import discord from math import ceil -from function import ( - embed_color, - time as ctime -) +import function class ListView(discord.ui.View): def __init__(self, player, author, isQueue = True): @@ -43,7 +40,7 @@ class ListView(discord.ui.View): self.page = ceil(len(self.tracks) / 7) self.current_page = 1 try: - self.time = ctime(sum([track.length for track in self.tracks])) + self.time = function.time(sum([track.length for track in self.tracks])) except: self.time = "∞" @@ -67,11 +64,11 @@ class ListView(discord.ui.View): offset = self.current_page * 7 tracks = self.tracks[(offset-7):offset] - embed = discord.Embed(title=self.player.get_msg('viewTitle'), color=embed_color) + embed = discord.Embed(title=self.player.get_msg('viewTitle'), color=function.embed_color) embed.description=self.player.get_msg('viewDesc').format(self.player.current.uri, f"```{self.player.current.title}```") if self.player.current else self.player.get_msg('nowplayingDesc').format("None") queueText = "" for index, track in enumerate(tracks, start=offset - 6): - queueText += f"{track.emoji} `{index}.` `[" + (self.player.get_msg("live") if track.is_stream else ctime(track.length)) + f'`] **{track.title[:30]}** ' + (track.requester.mention if track.requester else "<@605618911471468554>") + "\n" + queueText += f"{track.emoji} `{index}.` `[" + (self.player.get_msg("live") if track.is_stream else function.time(track.length)) + f'`] **{track.title[:30]}** ' + (track.requester.mention if track.requester else self.player.client.id) + "\n" embed.add_field(name=self.name, value=queueText) embed.set_footer(text=self.player.get_msg('viewFooter').format(self.current_page, self.page, self.time)) diff --git a/view/lyrics.py b/view/lyrics.py index 2ba9338..c515e36 100644 --- a/view/lyrics.py +++ b/view/lyrics.py @@ -22,8 +22,7 @@ SOFTWARE. """ import discord - -from function import embed_color +import function class LyricsDropdown(discord.ui.Select): def __init__(self, langs: list): @@ -73,7 +72,7 @@ class LyricsView(discord.ui.View): def build_embed(self): chunk = self.source.get(self.lang)[self.current_page - 1] - embed=discord.Embed(description=chunk, color=embed_color) + embed=discord.Embed(description=chunk, color=function.embed_color) embed.set_author(name=f"Searching Query: {self.name}", icon_url=self.author.display_avatar.url) embed.set_footer(text=f"Page: {self.current_page}/{self.pages}") return embed diff --git a/view/playlist.py b/view/playlist.py index 71b1a9f..b4bd284 100644 --- a/view/playlist.py +++ b/view/playlist.py @@ -22,18 +22,11 @@ SOFTWARE. """ import discord +import function from math import ceil from tldextract import extract -from function import ( - embed_color, - invite_link, - emoji_source, - time as ctime, - get_lang -) - class Select_playlist(discord.ui.Select): def __init__(self, results): options = [discord.SelectOption(emoji='🌎', label='All Playlist')] @@ -95,27 +88,27 @@ class PlaylistView(discord.ui.View): offset = self.current_page * 7 tracks = self.current['tracks'][(offset-7):offset] - embed = discord.Embed(title=get_lang(self.guildID, 'playlistView'), color=embed_color) + embed = discord.Embed(title=function.get_lang(self.guildID, 'playlistView'), color=function.embed_color) - embed.description= get_lang(self.guildID, 'playlistViewDesc').format(self.current['name'], self.current['id'], len(self.current['tracks']), self.current.get('owner', "None"), self.current['type']) + embed.description= function.get_lang(self.guildID, 'playlistViewDesc').format(self.current['name'], self.current['id'], len(self.current['tracks']), self.current.get('owner', "None"), self.current['type']) perms = self.current['perms'] - permsStr = get_lang(self.guildID, 'settingsPermTitle') + permsStr = function.get_lang(self.guildID, 'settingsPermTitle') if self.current['type'] == 'share': - embed.add_field(name=permsStr, value=get_lang(self.guildID, 'playlistViewPermsValue').format('✓' if 'write' in perms and self.author.id in perms['write'] else '✘', '✓' if 'remove' in perms and self.author.id in perms['remove'] else '✘')) + embed.add_field(name=permsStr, value=function.get_lang(self.guildID, 'playlistViewPermsValue').format('✓' if 'write' in perms and self.author.id in perms['write'] else '✘', '✓' if 'remove' in perms and self.author.id in perms['remove'] else '✘')) else: - embed.add_field(name=permsStr, value=get_lang(self.guildID, 'playlistViewPermsValue2').format(', '.join(f'<@{user}>' for user in perms['read']))) + embed.add_field(name=permsStr, value=function.get_lang(self.guildID, 'playlistViewPermsValue2').format(', '.join(f'<@{user}>' for user in perms['read']))) - trackStr = get_lang(self.guildID, 'playlistViewTrack') + trackStr = function.get_lang(self.guildID, 'playlistViewTrack') if tracks: try: - embed.add_field(name=trackStr, value='\n'.join(f"{emoji_source(extract(track['info']['uri']).domain)} `{index}.` `[{ctime(track['info']['length'] * 1000)}]` **{track['info']['title'][:30]}** " for index, track in enumerate(tracks, start=offset - 6)), inline=False) + embed.add_field(name=trackStr, value='\n'.join(f"{function.emoji_source(extract(track['info']['uri']).domain)} `{index}.` `[{function.time(track['info']['length'] * 1000)}]` **{track['info']['title'][:30]}** " for index, track in enumerate(tracks, start=offset - 6)), inline=False) except: - embed.add_field(name=trackStr, value='\n'.join(f"{emoji_source(extract(track.info['uri']).domain)} `{index}.` `[{ctime(track.length)}]` **{track.title[:30]}** " for index, track in enumerate(tracks, start=offset - 6)), inline=False) + embed.add_field(name=trackStr, value='\n'.join(f"{function.emoji_source(extract(track.info['uri']).domain)} `{index}.` `[{function.time(track.length)}]` **{track.title[:30]}** " for index, track in enumerate(tracks, start=offset - 6)), inline=False) else: - embed.add_field(name=trackStr, value=get_lang(self.guildID, 'playlistNoTrack').format(self.current['name']), inline=False) + embed.add_field(name=trackStr, value=function.get_lang(self.guildID, 'playlistNoTrack').format(self.current['name']), inline=False) - embed.set_footer(text=get_lang(self.guildID, 'playlistViewPage').format(self.current_page, self.page, self.current['time'])) + embed.set_footer(text=function.get_lang(self.guildID, 'playlistViewPage').format(self.current_page, self.page, self.current['time'])) return embed @@ -170,7 +163,7 @@ class CreateView(discord.ui.View): self.value = None self.response = None self.add_item(agree()) - self.add_item(discord.ui.Button(label='Support', emoji=':support:915152950471581696', url=invite_link)) + self.add_item(discord.ui.Button(label='Support', emoji=':support:915152950471581696', url=function.invite_link)) async def on_timeout(self): for child in self.children: diff --git a/voicelink/spotify/client.py b/voicelink/spotify/client.py index 9acf771..70815b6 100644 --- a/voicelink/spotify/client.py +++ b/voicelink/spotify/client.py @@ -36,7 +36,7 @@ from .artist import Artist GRANT_URL = "https://accounts.spotify.com/api/token" REQUEST_URL = "https://api.spotify.com/v1/{type}s/{id}" SEARCH_URL = "https://api.spotify.com/v1/search?q={query}&type={type}&limit={limit}" -SUGGESTION_URL = "https://api.spotify.com/v1/recommendations?limit={limit}&seed_tracks={seed_tracks}" +SUGGESTION_URL = "https://api.spotify.com/v1/recommendations?limit={limit}&seed_artists={seed_artists}&seed_tracks={seed_tracks}" SPOTIFY_URL_REGEX = re.compile( r"https?://open.spotify.com/(?Palbum|playlist|track|artist)/(?P[a-zA-Z0-9]+)" ) @@ -95,7 +95,7 @@ class Client: if not self._bearer_token or time.time() >= self._expiry: await self._fetch_bearer_token() - request_url = SUGGESTION_URL.format(limit=limit, seed_tracks=seed_tracks) + request_url = SUGGESTION_URL.format(limit=limit, seed_artists=seed_artists, seed_tracks=seed_tracks) async with self.session.get(request_url, headers=self._bearer_headers) as resp: if resp.status != 200: