I was making an music bot but I had it having this problem, im running python 3.6.8 and its hosted on heroku

I've heard I need to use discord.opus.LoadOpus or something like that but I dont know how to add it to my code and where, please help

Heres my code

import discord
import asyncio
from discord.ext import commands

client = commands.Bot(command_prefix='!')
songs = asyncio.Queue()
play_next_song = asyncio.Event()


@client.event
async def on_ready():
    print('client ready')


async def audio_player_task():
    while True:
        play_next_song.clear()
        current = await songs.get()
        current.start()
        await play_next_song.wait()


def toggle_next():
    client.loop.call_soon_threadsafe(play_next_song.set)


@client.command(pass_context=True)
async def play(ctx, url):
    if not client.is_voice_connected(ctx.message.server):
        voice = await client.join_voice_channel(ctx.message.author.voice_channel)
    else:
        voice = client.voice_client_in(ctx.message.server)

    player = await voice.create_ytdl_player(url, after=toggle_next)
    await songs.put(player)

client.loop.create_task(audio_player_task())

client.run('TOKEN')

And im having this error:

Ignoring exception in command play
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py", line 50, in wrapped
ret = yield from coro(*args, **kwargs)
File "Draco.py", line 30, in play
voice = await client.join_voice_channel(ctx.message.author.voice_channel)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/client.py", line 3209, in join_voice_channel
voice = VoiceClient(**kwargs)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/voice_client.py", line 230, in __init__
self.encoder = opus.Encoder(48000, 2)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/opus.py", line 197, in __init__
raise OpusNotLoaded()
discord.opus.OpusNotLoaded

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/bot.py", line 846, in process_commands
yield from command.invoke(ctx)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py", line 374, in invoke
yield from injected(*ctx.args, **ctx.kwargs)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py", line 54, in wrapped
raise CommandInvokeError(e) from e
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: OpusNotLoaded:

1 Answers

0
MaximGi On

Try to load the opus module using :

discord.opus.load_opus()

Anywhere before you try do to anything related to voice channels with your bot.

According to the discord.py docs you should not need it on a windows environnement, which is maybe why it worked on your local machine and not on heroku (which is unix based).

Also, I would do the following :

discord.opus.load_opus()
if not discord.opus.is_loaded():
    raise RunTimeError('Opus failed to load')

So you are sure that an exception will be raised if it's not loaded properly and know where to look immediatly. If an exception occurs while loading, it will still propagate.