@Artin24
Начинающий

Почему музыкальный бот не включает в голосовом канале дискорда аудио скачанное с ютуба?

При использовании команды play *ссылка на видео с ютуба* постоянно выдаёт эту ошибку:
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: UnboundLocalError: local variable 'voice' referenced before assignment
Искал информацию на форумах, пишут что дело в ffmpeg, я его скачал, установил на диск C и у казал путь к нему в команде, но тут я понял что не знаю какие аргументы принимает функция .play().
Вот код
#-*- coding: utf-8 -*-
import discord 
from discord import FFmpegPCMAudio
from discord.ext import commands 
from configMusic import token
import youtube_dl
import os

bot = commands.Bot(command_prefix='')

@bot.event
async def on_ready():
	print("Бот готов!")

#@bot.event
#async def on_message():
#	print("Пришло новое сообщение!")
server, server_id, name_channel = None, None, None
domains = ['https://www.youtube.com/', 'http://www.youtube.com/', 'https://youtube.be/', 'http://youtube.be/']
async def check_domains(link):
	for x in domains:
		if link.startswith(x):
			return True
	return False


@bot.command()
async def play(ctx, *, command = None):
	"""Воспроизводит музыку"""
	global server, server_id, name_channel
	author = ctx.author
	FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
	if command == None:
		server = ctx.guild
		name_channel = ctx.author.voice.channel.name_channel
		voice_channel = discord.utils.get(server.voice_channels, name = name_channel)
		params = command.split(' ')
		if len(params) == 1:
			sourse = params[0]
			server = ctx.guild
			name_channel = ctx.author.voice.channel.name_channel
			voice_channel = discord.utils.get(server.voice_channels, name = name_channel)
			print("param 1")
		elif len(params) == 3:
			server_id = params[0]
			voice_id = params[1]
			sourse = params[2]
			try:
				server_id = int(server_id)
				voice_id = int(voice_id)
			except:
				await ctx.channel.send("{0}, id сервера или войса должно быть целочисленным".format(author.mention))
				return
			print('param 3')
			server = bot.get_guild(server_id)
			voice_channel = discord.utils.get(server.voice_channel, id=voice_id)
		else:
			await ctx.channel.send("{0}, команда не корректна!".format(author.mention))
			return
		voice = discord.utils.get(bot.voice_clients, guild = server)
		if voice is None:
			await voice_channel.connect()
			voice = discord.utils.get(bot.voice_clients, guild = server)

		if sourse == None:
			pass
		elif sourse.startswith('http'):
			if not check_domains(sourse):
				await ctx.channel.send("{0}, ссылка не является разрешенной!".format(author.mention))
				return
			song_there = os.path.isfile('C:/Users/Людмила/Desktop/Программирование/ДС Бот для музыки/music/song.mp3')
			try:
				if song_there:
					os.remove('song.mp3')
			except PermissionError:
				await ctx.channel.send('Недостаточно прав для удаления файла!')
				return
			ydl_opts = {
				'format': 'bestaudio/best',
				'postprocessers': [
					{
						'key': 'FFmpegExtractAudio',
						'preferredcodec': 'mp3',
						'preferredquallity': '192',
					}
				],
			}
			with youtube_dl.YoutubeDL(ydl_opts) as ydl:
				ydl.download([sourse])
			for file in os.listdir('C:/Users/Людмила/Desktop/Программирование/ДС Бот для музыки/music'):
				if file.endswith('.mp3'):
					os.rename(file, 'song.mp3')
			voice.play(discord.FFmpegPCMAudio(executable='C:/ffmpeg/bin/ffmpeg.exe',sourse = 'C:/Users/Людмила/Desktop/Программирование/ДС Бот для музыки/music/song.mp3', **FFMPEG_OPTIONS))
	else:
		voice.play(discord.FFmpegPCMAudio(executable='C:/ffmpeg/bin/ffmpeg.exe',sourse = 'C:/Users/Людмила/Desktop/Программирование/ДС Бот для музыки/music/{0}', **FFMPEG_OPTIONS).format(sourse))




bot.run(token)
  • Вопрос задан
  • 587 просмотров
Решения вопроса 1
SoreMix
@SoreMix
yellow
пишут что дело в ffmpeg

Дело в попытке использовать переменную, которая не была объявлена, об этом и написано в ошибке. А именно, вы создаете переменную voice только при выполнении условия if command == None:, если условие не срабатывает, блок падает в else, в котором только одна строка:
voice.play(discord.FFmpegPCMAudio(executable='C:/ffmpeg/bin/ffmpeg.exe',sourse = 'C:/Users/Людмила/Desktop/Программирование/ДС Бот для музыки/music/{0}', **FFMPEG_OPTIONS).format(sourse))

В которой используется voice, который нигде не объявлен. IDE должна была подсветить эту строку. Так что стоит добавить то же самое создание переменной, что и в блоке if выше
voice = discord.utils.get(bot.voice_clients, guild = server)
if voice is None:
    await voice_channel.connect()
    voice = discord.utils.get(bot.voice_clients, guild = server)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы