lyricsgenius 歌词有时以 "EmbedShare URLCopyEmbedCopy" 结尾

lyricsgenius lyrics sometimes end with "EmbedShare URLCopyEmbedCopy"

我正在制作一个 Discord 歌词机器人并接收歌词。我正在使用 genius API(lyricsgenius API 包装器)。但是当我收到歌词时,它是这样结束的:

“离开”是这首歌的最后一个词,但伴随着 EmbedShare URLCopyEmbedCopy。有时只是没有 EmbedShare 文本的简单歌词。

与同一首歌:

有什么办法可以防止这种情况发生吗?

lyrics 命令的源代码:

@commands.command(help="Gives the lyrics of the song XD! format //lyrics (author) (song name)")
async def lyrics(self, ctx, arg1, arg2):
    song = genius.search_song(arg1, arg2)
    print(song.lyrics)
    name = ("Lyrics for " + arg2.capitalize() + " by " + arg1.capitalize())
    gembed = discord.Embed(title=name.capitalize(), description=song.lyrics)
    await ctx.send(embed=gembed)

Some Random API 在您创建将向您发送歌曲歌词的命令时很容易处理。

这是使用一些随机 api、

的方法
# these imports are used for this particular lyrics command. the essential import here is aiohttp, which will be used to fetch the lyrics from the API
import textwrap
import urllib
import aiohttp
import datetime

@bot.command(aliases = ['l', 'lyrc', 'lyric']) # adding aliases to the command so they they can be triggered with other names
async def lyrics(ctx, *, search = None):
    """A command to find lyrics easily!"""
    if not search: # if user hasnt given an argument, throw a error and come out of the command
        embed = discord.Embed(
            title = "No search argument!",
            description = "You havent entered anything, so i couldnt find lyrics!"
        )
        return await ctx.reply(embed = embed)
        # ctx.reply is available only on discord.py version 1.6.0, if you have a version lower than that use ctx.send
    
    song = urllib.parse.quote(search) # url-encode the song provided so it can be passed on to the API
    
    async with aiohttp.ClientSession() as lyricsSession:
        async with lyricsSession.get(f'https://some-random-api.ml/lyrics?title={song}') as jsondata: # define jsondata and fetch from API
            if not 300 > jsondata.status >= 200: # if an unexpected HTTP status code is recieved from the website, throw an error and come out of the command
                return await ctx.send(f'Recieved poor status code of {jsondata.status}')

            lyricsData = await jsondata.json() # load the json data into its json form

    error = lyricsData.get('error')
    if error: # checking if there is an error recieved by the API, and if there is then throwing an error message and returning out of the command
        return await ctx.send(f'Recieved unexpected error: {error}')

    songLyrics = lyricsData['lyrics'] # the lyrics
    songArtist = lyricsData['author'] # the author's name
    songTitle = lyricsData['title'] # the song's title
    songThumbnail = lyricsData['thumbnail']['genius'] # the song's picture/thumbnail

    # sometimes the song's lyrics can be above 4096 characters, and if it is then we will not be able to send it in one single message on Discord due to the character limit
    # this is why we split the song into chunks of 4096 characters and send each part individually
    for chunk in textwrap.wrap(songLyrics, 4096, replace_whitespace = False):
        embed = discord.Embed(
            title = songTitle,
            description = chunk,
            color = discord.Color.blurple(),
            timestamp = datetime.datetime.utcnow()
        )
        embed.set_thumbnail(url = songThumbnail)
        await ctx.send(embed = embed)

这是 lyricsgenius 的一个已知错误,有一个公开的 PR 可以解决这个问题:https://github.com/johnwmillr/LyricsGenius/pull/215

这是因为 lyricsgenius web 从 Genius 的网站上抓取了 歌词,这意味着如果他们的网站更新,lyricsgenius 将无法获取歌词.这个库已经 6 个月没有更新了;本身是一个网络 scraping 库意味着这种不活动会使库严重不稳定。由于该库是在 MIT 下获得许可的,因此您可以分叉该库并为您的 project/bot 维护一个最新版本。不过还是用专门的API来抓取歌词来保证稳定性会好很多。

此外,lyricsgenius 使用同步 requests 库,这意味着它会在获取歌词时“阻止”您的异步机器人。这对于 Discord Bot 来说绝对是不可取的,因为你的机器人在获取歌词时会完全没有响应。考虑使用 aiohttp 重写它或在调用阻塞函数时使用 run_in_executor