es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Discord.py envía el argumento “raro”.

Entonces, estoy creando un bot de música para Discord y cuando la persona busca algo, reproduce la música y utiliza la valiosa arg para eso. Por ejemplo: ?play christmas song. Sin embargo, aunque reproduce la música correctamente, envía este mensaje: Now playing: (‘christmas’, ‘song’). Es como si cortara las 2 palabras y las colocara en una especie de lista.

Este es mi código:

“`
@commands.command()
async def play(self, ctx, *arg):

<pre><code>if ctx.author.voice is None:
await ctx.send("Join a voice channel")
voice_channel = ctx.author.voice.channel
if ctx.voice_client is None:
await voice_channel.connect()
else:
await ctx.voice_client.move_to(voice_channel)
ctx.voice_client.stop()
try:
requests.get("" + str(arg))
except: arg = " " + str(arg)
else: arg = "" + str(arg)
YDL_OPTIONS = {'format':"bestaudio"}
vc = ctx.voice_client
FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl:
info = ydl.extract_info(f"ytsearch:{arg}", download=False)
if 'entries' in info:
video = info['entries'][0]
else:
video = info
url2 = video['formats'][0]['url']
print(video)
video_url = video['url']
print(video_url)
source = await discord.FFmpegOpusAudio.from_probe(url2, **FFMPEG_OPTIONS)
await ctx.send("Now playing: **" + str(arg) + "**")
vc.play(source)
</code></pre>

“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema en tu código está en la variable arg. Cuando un usuario escribe ?play christmas song, el parámetro *arg en tu función lo recopila como una tupla que contiene dos cadenas: ('christmas', 'song'). Cuando lo conviertes a una cadena usando str(arg), incluye los paréntesis y las comillas, lo que resulta en la salida ('christmas', 'song').

    Para solucionar este problema, puedes concatenar las cadenas individuales en arg usando el método join de la siguiente manera: arg = " ".join(arg). Esto fusionará las dos cadenas con un espacio en medio, resultando en la cadena 'christmas song', que es lo que quieres mostrar en tu mensaje de Now playing.

    Entonces, tu código actualizado se vería así:

    @commands.command()
    async def play(self, ctx, *arg):
    
        if ctx.author.voice is None:
            await ctx.send("Únete a un canal de voz")
        voice_channel = ctx.author.voice.channel
        if ctx.voice_client is None:
            await voice_channel.connect()
        else:
            await ctx.voice_client.move_to(voice_channel)
    
        ctx.voice_client.stop()
    
        try:
            requests.get("" + str(arg))
        except: 
            arg = " " + " ".join(arg)
        else: 
            arg = "" + " ".join(arg)
    
        YDL_OPTIONS = {'format':'bestaudio'}
        vc = ctx.voice_client
        FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
    
        with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl:
            info = ydl.extract_info(f"ytsearch:{arg}", download=False)
    
            if 'entries' in info:
                video = info['entries'][0]
            else:
                video = info
    
            url2 = video['formats'][0]['url']
            print(video)
            video_url = video['url']
            print(video_url)
            source = await discord.FFmpegOpusAudio.from_probe(url2, **FFMPEG_OPTIONS)
            await ctx.send("Reproduciendo ahora: **" + str(arg) + "**")
            vc.play(source)
    

    ¡Espero que esto te ayude! Déjame saber si tienes alguna otra pregunta.

Comments are closed.