简体   繁体   English

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

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

I am making a Discord lyrics bot and to receive the lyrics.我正在制作一个 Discord 歌词机器人并接收歌词。 I am using genius API ( lyricsgenius API wrapper).我正在使用天才 API( lyricsgenius API 包装器)。 But when I receive the lyrics, it ends with this:但是当我收到歌词时,它以这样的结尾:

"away" is the last word in the song but it is accompanied with EmbedShare URLCopyEmbedCopy . “离开”是这首歌的最后一个词,但它伴随着EmbedShare URLCopyEmbedCopy Sometimes it is just the plain lyrics without the EmbedShare text.有时它只是没有EmbedShare文本的简单歌词。

With the same song:用同一首歌:

Is there anyway to prevent that?反正有什么可以防止的吗?

Source code for the lyrics command: 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 is something easy to deal with when you are creating a command that will send you the song lyrics.当您创建一个向您发送歌词的命令时,一些 Random API很容易处理。

This is how to do it with 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)

This is a known bug with lyricsgenius and there's an open PR to address this issue: https://github.com/johnwmillr/LyricsGenius/pull/215 .这是lyricsgenius一个已知错误,并且有一个公开的PR 来解决这个问题: https : //github.com/johnwmillr/LyricsGenius/pull/215

This is because lyricsgenius web scraps the lyrics from Genius' website, which means if their website updates, lyricsgenius would fail to fetch the lyrics.这是因为lyricsgenius web 从Genius 的网站上lyricsgenius了歌词,这意味着如果他们的网站更新, lyricsgenius将无法获取歌词。 This library hasn't been updated in 6 months;这个库已经 6 个月没有更新了; itself being a web scrapping library means that kind of inactivity would render the library severely unstable.本身是一个网络抓取库意味着那种不活动会使库严重不稳定。 Since the library is licensed under MIT, you can fork the library and maintain an up-to-date version for your project/bot.由于该库是根据 MIT 许可的,您可以分叉该库并为您的项目/机器人维护最新版本。 However, it would be much better to use a dedicated API to fetch songs lyrics to guarantee stability.但是,最好使用专用的 API 来获取歌曲歌词以保证稳定性。

Also, lyricsgenius uses the synchronous requests library, which means it'll "block" your asynchronous bot while it fetches the lyrics.此外, lyricsgenius使用同步requests库,这意味着它会在获取歌词时“阻止”您的异步机器人。 This is definitely undesirable for a Discord Bot since your bot would be completely unresponsive while it fetches the lyrics.这对于 Discord Bot 来说绝对是不可取的,因为您的机器人在获取歌词时会完全没有响应。 Consider rewriting it using aiohttp or use run_in_executor when calling blocking functions.考虑使用aiohttp重写它或在调用阻塞函数时使用run_in_executor

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

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