diff --git a/addons/__init__.py b/addons/__init__.py index a835660..9bcfb4e 100644 --- a/addons/__init__.py +++ b/addons/__init__.py @@ -1,3 +1,3 @@ -from .lyrics import lyricsPlatform +from .lyrics import LYRICS_PLATFORMS from .placeholders import Placeholders from .settings import Settings \ No newline at end of file diff --git a/addons/lyrics.py b/addons/lyrics.py index 06cf0f0..40b8e1d 100644 --- a/addons/lyrics.py +++ b/addons/lyrics.py @@ -28,7 +28,7 @@ from abc import ABC, abstractmethod from urllib.parse import quote from math import floor from importlib import import_module -from typing import Optional +from typing import Optional, Type userAgents = '''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36 @@ -236,8 +236,8 @@ class Lrclib(LyricsPlatform): result = await self.get(LRCLIB_ENDPOINT + "search", params) if result: return {"default": result[0].get("plainLyrics", "")} - -lyricsPlatform: dict[str, LyricsPlatform] = { + +LYRICS_PLATFORMS: dict[str, Type[LyricsPlatform]] = { "a_zlyrics": A_ZLyrics, "genius": Genius, "lyrist": Lyrist, diff --git a/cogs/basic.py b/cogs/basic.py index b025974..9eb6d36 100644 --- a/cogs/basic.py +++ b/cogs/basic.py @@ -41,7 +41,7 @@ from function import ( ) from voicelink import SearchType, LoopType -from addons import lyricsPlatform +from addons import LYRICS_PLATFORMS from views import SearchView, ListView, LinkView, LyricsView, HelpView from validators import url @@ -792,12 +792,14 @@ class Basic(commands.Cog): artist = player.current.author await ctx.defer() - song: dict[str, str] = await lyricsPlatform.get(settings.lyrics_platform)().get_lyrics(title, artist) - if not song: - return await send(ctx, "lyricsNotFound", ephemeral=True) - - view = LyricsView(name=title, source={_: re.findall(r'.*\n(?:.*\n){,22}', v) for _, v in song.items()}, author=ctx.author) - view.response = await send(ctx, view.build_embed(), view=view) + lyrics_platform = LYRICS_PLATFORMS.get(settings.lyrics_platform) + if lyrics_platform: + lyrics = await lyrics_platform().get_lyrics(title, artist) + if not lyrics: + return await send(ctx, "lyricsNotFound", ephemeral=True) + + view = LyricsView(name=title, source={_: re.findall(r'.*\n(?:.*\n){,22}', v or "") for _, v in lyrics.items()}, author=ctx.author) + view.response = await send(ctx, view.build_embed(), view=view) @commands.hybrid_command(name="swapdj", aliases=get_aliases("swapdj")) @app_commands.describe(member="Choose a member to transfer the dj role.") diff --git a/ipc/methods.py b/ipc/methods.py index 1771ead..200b4ec 100644 --- a/ipc/methods.py +++ b/ipc/methods.py @@ -6,7 +6,7 @@ from typing import List, Dict, Union, Optional from discord import User, Member, VoiceChannel from discord.ext import commands from voicelink import Player, Track, Playlist, NodePool, decode, LoopType, Filters -from addons import lyricsPlatform +from addons import LYRICS_PLATFORMS RATELIMIT_COUNTER: Dict[int, Dict[str, float]] = {} SCOPES = { @@ -653,21 +653,21 @@ async def getSettings(bot: commands.Bot, data: Dict) -> Dict: async def getLyrics(bot: commands.Bot, data: Dict) -> Dict: title, artist, platform = data.get("title", ""), data.get("artist", ""), data.get("platform", "") - if not platform or platform not in lyricsPlatform: + if not platform or platform not in LYRICS_PLATFORMS: platform = func.settings.lyrics_platform - song: dict[str, str] = await lyricsPlatform.get(platform)().get_lyrics(title, artist) - payload = { - "op": "getLyrics", - "userId": data.get("userId"), - "title": title, - "artist": artist, - "platform": platform, - "lyrics": {_: re.findall(r'.*\n(?:.*\n){,22}', v) for _, v in song.items()} if song else {}, - "callback": data.get("callback") - } - - return payload + lyrics_platform = LYRICS_PLATFORMS.get(platform) + if lyrics_platform: + lyrics: dict[str, str] = await lyrics_platform().get_lyrics(title, artist) + return { + "op": "getLyrics", + "userId": data.get("userId"), + "title": title, + "artist": artist, + "platform": platform, + "lyrics": {_: re.findall(r'.*\n(?:.*\n){,22}', v or "") for _, v in lyrics.items()} if lyrics else {}, + "callback": data.get("callback") + } async def updateSettings(bot: commands.Bot, data: Dict) -> None: user_id = int(data.get("userId")) diff --git a/settings Example.json b/settings Example.json index 4322aa5..ed29928 100644 --- a/settings Example.json +++ b/settings Example.json @@ -40,7 +40,7 @@ "bot_access_user": [], "embed_color":"0xb3b3b3", "default_max_queue": 1000, - "lyrics_platform": "lyrist", + "lyrics_platform": "lrclib", "ipc_client": { "host": "127.0.0.1", "port": 8000, diff --git a/views/controller.py b/views/controller.py index 07790d8..d403e83 100644 --- a/views/controller.py +++ b/views/controller.py @@ -29,7 +29,7 @@ import views import function as func from discord.ext import commands -from typing import Dict +from typing import Dict, Type def key(interaction: discord.Interaction): return interaction.user @@ -380,12 +380,14 @@ class Lyrics(ControlButton): title = self.player.current.title artist = self.player.current.author - song: dict[str, str] = await addons.lyricsPlatform.get(func.settings.lyrics_platform)().get_lyrics(title, artist) - if not song: - return await self.send(interaction, "lyricsNotFound", ephemeral=True) + lyrics_platform = addons.LYRICS_PLATFORMS.get(func.settings.lyrics_platform) + if lyrics_platform: + lyrics = await lyrics_platform().get_lyrics(title, artist) + if not lyrics: + return await self.send(interaction, "lyricsNotFound", ephemeral=True) - view = views.LyricsView(name=title, source={_: re.findall(r'.*\n(?:.*\n){,22}', v) for _, v in song.items()}, author=interaction.user) - view.response = await self.send(interaction, view.build_embed(), view=view, ephemeral=True) + view = views.LyricsView(name=title, source={_: re.findall(r'.*\n(?:.*\n){,22}', v or "") for _, v in lyrics.items()}, author=interaction.user) + view.response = await self.send(interaction, view.build_embed(), view=view, ephemeral=True) class Tracks(discord.ui.Select): def __init__(self, player, style, row): @@ -446,7 +448,7 @@ class Effects(discord.ui.Select): await self.player.add_filter(selected_filter, requester=interaction.user) await func.send(interaction, "addEffect", selected_filter.tag) -BUTTONTYPE: Dict[str, ControlButton] = { +BUTTON_TYPE: Dict[str, Type[ControlButton]] = { "back": Back, "resume": Resume, "skip": Skip, @@ -465,7 +467,7 @@ BUTTONTYPE: Dict[str, ControlButton] = { "effects": Effects } -BUTTONCOLOR: Dict[str, discord.ButtonStyle] = { +BUTTON_COLORS: Dict[str, discord.ButtonStyle] = { "blue": discord.ButtonStyle.primary, "grey": discord.ButtonStyle.secondary, "red": discord.ButtonStyle.danger, @@ -483,8 +485,8 @@ class InteractiveController(discord.ui.View): if isinstance(btn, Dict): color = list(btn.values())[0] btn = list(btn.keys())[0] - btnClass = BUTTONTYPE.get(btn.lower()) - style = BUTTONCOLOR.get(color.lower(), BUTTONCOLOR["grey"]) + btnClass = BUTTON_TYPE.get(btn.lower()) + style = BUTTON_COLORS.get(color.lower(), BUTTON_COLORS["grey"]) if not btnClass or (self.player.queue.is_empty and btn == "tracks"): continue self.add_item(btnClass(player=player, style=style, row=row))