Search code examples
pythondiscord.pyyoutube-dl

Getting error code 1, when using youtube_dl to play music on discord.py bot


Context: I am trying to create a ;play <youtubeURL> command for my disord.py bot

Problem: I can't get the music to play

Code:

ytdl_format_options = {
    'format': 'bestaudio/best',
    'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s',
    'restrictfilenames': True,
    'noplaylist': True,
    'nocheckcertificate': True,
    'ignoreerrors': False,
    'logtostderr': False,
    'quiet': True,
    'no_warnings': True,
    'default_search': 'auto',
    'source_address': '0.0.0.0'
}

ytdl = youtube_dl.YoutubeDL(ytdl_format_options)

@client.command()
async def play(ctx, url):

    #I have code here that makes sure the bot is in the correct VC

    guild = ctx.message.guild
    voice_client = guild.voice_client

    song_info = ytdl.extract_info(url, download=False)
    filename = ytdl.prepare_filename(song_info)
    song = discord.FFmpegPCMAudio(filename)
    player = voice_client.play(song)

Errors: Using the standard python IDE, I am getting no errors. However, using the logging module. I am getting error code 1:

INFO:discord.player:Preparing to terminate ffmpeg process 21972.
INFO:discord.player:ffmpeg process 21972 successfully terminated with return code of 1.

Any help/solutions that you can give would be appreciated.


Solution

  • I found the issue with my code. This is the correct way to play music via ffmpeg:

    import os
    import youtube_dl
    
    async def joinMusicChannel(ctx):
        try:
            channel = ctx.author.voice.channel
        except:
            await ctx.send(ctx.author.mention + " Please join the music voice channel.")
            return False
    
        vc = ctx.voice_client
        if vc == None:
            await channel.connect()
        return True
    
    ydl_opts = {
        'format': 'bestaudio/best',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '192',
        }],
    }
    
    def endSong(guild, path):
        os.remove(path)
    
    
    @client.command()
    async def play(ctx, url):
        data = await joinMusicChannel(ctx)
        if data == True:
            with youtube_dl.YoutubeDL(ydl_opts) as ydl:
                file = ydl.extract_info(url, download=True)
            guild = ctx.message.guild
            voice_client = guild.voice_client
            path = str(file['title']) + "-" + str(file['id'] + ".mp3")
    
            voice_client.play(discord.FFmpegPCMAudio(path), after=lambda x: endSong(guild, path))
            voice_client.source = discord.PCMVolumeTransformer(voice_client.source, 1)