繁体   English   中英

歌词天才歌词有时以“EmbedShare URLCopyEmbedCopy”结尾

[英]lyricsgenius lyrics sometimes end with "EmbedShare URLCopyEmbedCopy"

我正在制作一个 Discord 歌词机器人并接收歌词。 我正在使用天才 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)

当您创建一个向您发送歌词的命令时,一些 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了歌词,这意味着如果他们的网站更新, lyricsgenius将无法获取歌词。 这个库已经 6 个月没有更新了; 本身是一个网络抓取库意味着那种不活动会使库严重不稳定。 由于该库是根据 MIT 许可的,您可以分叉该库并为您的项目/机器人维护最新版本。 但是,最好使用专用的 API 来获取歌曲歌词以保证稳定性。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM