При использовании команды 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)