ffmpeg doesn't work in heroku using discord.py, how can i solve it?

Viewed 43

I'm making a discord bot with python and it has a music cog. I've just hosted the bot, and everything works perfectly except this cog. Bassically, the problem is that even if the bot is ready with no errors, when I try to play something in one channel with the command !pl <search> the bot joins the channel, but it doesn't play anything.

I have already add the BuildPacks to heroku (opus, ffmpeg, python) and all the requirements are ready (The music cog worked on my pc when i was building it).

The output in terminal shows "discord.player: ffmpeg process 26 successfully terminated with return code of -11"

I'll upload a few part of my code, which explains it at all.

import discord
from discord.ext import commands
from youtube_dl import YoutubeDL

class music_cog(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        self.is_playing = False
        self.is_paused = False
        self.music_queue = []
        self.YDL_OPTIONS = {'format': 'bestaudio', 'noplaylist':'True'}
        self.FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
        self.vc = None

    def search_yt(self, item):
        with YoutubeDL(self.YDL_OPTIONS) as ydl:
            try: 
                info = ydl.extract_info("ytsearch:%s" % item, download=False)['entries'][0]
            except Exception: 
                return False
        return {'source': info['formats'][0]['url'], 'title': info['title']}

    def play_next(self):
        if len(self.music_queue) > 0:
            self.is_playing = True
            m_url = self.music_queue[0][0]['source']
            self.music_queue.pop(0)
            self.vc.play(discord.FFmpegPCMAudio(m_url, **self.FFMPEG_OPTIONS), after=lambda e: self.play_next())
        else:
            self.is_playing = False

    async def play_music(self, ctx):
        member = ctx.author
        if len(self.music_queue) > 0:
            self.is_playing = True
            m_url = self.music_queue[0][0]['source']
            if self.vc == None or not self.vc.is_connected():
                self.vc = await self.music_queue[0][1].connect()
                if self.vc == None:
                    await ctx.send(f"you need to join a vc {member.mention} !!")
                    return
            else:
                await self.vc.move_to(self.music_queue[0][1])
            self.music_queue.pop(0)
            self.vc.play(discord.FFmpegPCMAudio(m_url, **self.FFMPEG_OPTIONS), after=lambda e: self.play_next())
        else:
            self.is_playing = False

    @commands.command(name = "play", aliases = ["pl"])
    async def play(self, ctx, *args):
        query = " ".join(args)
        await ctx.send(f"Buscando en youtube segĂșn {query}...")
        member = ctx.author
        voice_channel = ctx.author.voice.channel
        if voice_channel is None:
            await ctx.send(f"you need to join a vc {member.mention} !!")
        elif self.is_paused
            self.vc.resume()
        else:
            song = self.search_yt(query)
            song_name = song.get("title")
            if type(song) == type(True):
                await ctx.send(f"There was an error {member.mention} !!")
            else:
                await ctx.send('song in the queue "{song_name}" !!')
                self.music_queue.append([song, voice_channel])
                await self.play_music(ctx)

If anyone can help me I would appreciate it so much :(

1 Answers

I had the same problem for the past days. It occured after upgrading the Heroku stack of my app to version 22. After downgrading to Heroku-20 the issue resolved.

You can change the version of your app with this Heroku CLI command:

heroku stack:set heroku-20

optionally you can add -a [appname] at the end, if you have multiple heroku apps.

Here are some information regarding the Heroku Stacks and the the Heroku CLI, if this is your first time using them.

Related