Reputation: 1
I get my bot to play a single song so far but only when it connects to the voice channel for the first time. When I try to put another song in after doing a stop command I get this
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: ClientException: Already connected to a voice channel.
I mean yes I know its in a voice channel but why won't it play more then one song?
import discord
from discord.ext import commands
import youtube_dl
import os
import asyncio
client = commands.Bot(command_prefix="^")
songs = asyncio.Queue()
play_next_song = asyncio.Event()
@client.command()
async def play(ctx, url: str):
song_there = os.path.isfile("song.mp3")
try:
if song_there:
os.remove("song.mp3")
except PermissionError:
await ctx.send("Wait for the current playing music to end or use the 'stop' command")
return
voiceChannel = ctx.message.author.voice.channel
await voiceChannel.connect()
voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
for file in os.listdir("./"):
if file.endswith(".mp3"):
os.rename(file, "song.mp3")
voice.play(discord.FFmpegPCMAudio("song.mp3"))
for file in os.listdir("./"):
if file.endswith(".mp3"):
os.rename(file, "song.mp3")
voice.play(discord.FFmpegPCMAudio("song.mp3"))
while voice.is_playing(): # Makes other commands no longer work
print("playing...")
time.sleep(5)
else:
song_queue.remove(song)
song_there = os.path.isfile("song.mp3")
if song_there:
os.remove("song.mp3")
@client.command()
async def leave(ctx):
voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
if voice.is_connected():
await voice.disconnect()
else:
await ctx.send("The bot is not connected to a voice channel.")
@client.command()
async def pause(ctx):
voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
if voice.is_playing():
voice.pause()
else:
await ctx.send("Currently no audio is playing.")
@client.command()
async def resume(ctx):
voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
if voice.is_paused():
voice.resume()
else:
await ctx.send("The audio is not paused.")
@client.command()
async def stop(ctx):
voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
voice.stop()
client.run('')
Upvotes: 0
Views: 396
Reputation: 1416
After getting the voice client, check if its connected.
voiceChannel = ctx.message.author.voice.channel
voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
# If bot is currently connected to voice channel
if voice is not None:
# If bot is connected to different voice channel than author
if voice.channel != voiceChannel:
await voice.move_to(voiceChannel)
# If move_to doesn't work try below:
#await voice.disconnect()
#await voiceChannel.connect()
else:
await voiceChannel.connect()
You might want to check ctx.author.voice is not None. Current code gives an exception when author is not connected to any voice channel.
Upvotes: 0