import os
import youtube_dl
import discord
from discord.ext import commands
bot = commands.Bot(command_prefix='!')
@bot.command()
async def play(ctx, url: str):
song_there = os.path.isfile('song.mp3')
try:
if song_there:
os.remove('song.mp3')
print('[log] Старая песня съедена Камилем!')
except PermissionError:
print('[log] Старую песню съесть не удалось :(')
await ctx.send('Ща все будет')
voice = get(bot.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:
print('[log] Загружаю музыку...')
info = ydl.extract_info(url, download=False)
url2 = info['formats'][0]['url']
if not voice.is_playing():
voice.play(discord.FFmpegPCMAudio(url2), after=lambda e: print('done', e))
voice.is_playing()
else:
await ctx.send('Уже воспроизводится музыка')
song_name = info['title']
await ctx.send(f'Врубил песню {song_name}')
bot.run('YOUR_BOT_TOKEN')
Помимо исправления асинхронных операций, внесены следующие изменения:
Используется библиотека youtube_dl для получения URL музыки, таким образом, вы избегаете синхронной загрузки музыки.
При проверке, воспроизводится ли уже музыка, используется
voice.is _playing().
Добавлено ожидание завершения воспроизведения для печати "done" после завершения воспроизведения.
Убедитесь, что вы подставили свой токен бота (
bot.run ('YOUR_BOT_TOKEN')) и что у вас правильно настроена ваша среда выполнения Python с асинхронной библиотекой Discord.
Вот ошибка:
File "C:\Users\User\AppData\Local\Programs\Python\Python311\Lib\asyncio\tasks.py", line 490, in wait_for
return fut.result()
^^^^^^^^^^^^
File "C:\Users\User\AppData\Local\Programs\Python\Python311\Lib\site-packages\aiohttp\client_ws.py", line 229, in receive
msg = await self._ reader.read ()
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\User\AppData\Local\Programs\Python\Python311\Lib\site-packages\aiohttp\streams.py", line 657, in read
return await super().read()
^^^^^^^^^^^^^^^^^^^^
"C:\Users\User\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\gateway.py", line 1003, in poll_event
msg = await asyncio.wait_for(self.ws.receive(), timeout=30.0)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Вот мой код:
@bot.command()
async def play(ctx, url : str):
song_there = os.path.isfile('song.mp3')
try:
if song_there:
os.remove('song.mp3')
print('[log] Старая песня съедена Камилем!')
except PermissionError:
print('[log] Старую песня съесть не удалось :(')
await ctx.send('Ща все будет')
voice = get(bot.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:
print('[log] Загружаю музыку...')
ydl.download ([url])
for file in os.listdir('./'):
if file.endswith('.mp3'):
name = file
print(f'[log] Переименовываю файл: {file}')
os.rename(file, 'song.mp3')
voice.play(discord.FFmpegPCMAudio('song.mp3'))
voice.source = discord.PCMVolumeTransformer(voice.source)
voice.source.volume = 0.07
song_name = name.rsplit('-', 2)
await ctx.send(f'Врубил песню {song_name[0]}')
Буду очень благодарен если вы подскажете?