Я уверен, что есть лучшие способы сделать это с помощью переписывания, но я в той же лодке, что и вы. Я не мог понять это дольше всего.
После просмотра документов youtube-dl и переписывания документов это лучшее, что я мог придумать. Имейте в виду, я не знаю, будет ли это работать с системой очередей (вероятно, нет). Также я не знаю, если это ошибка или что-то другое, что я делаю неправильно, когда бот присоединяется, и затем вы используете команду воспроизведения, она не выводит музыку, но если бот уходит, то присоединяется снова, музыка будет воспроизводиться. Чтобы исправить это, я заставил свою команду соединения присоединиться, выйти и присоединиться.
Присоединиться к команде:
@bot.command(pass_context=True, brief="Makes the bot join your channel", aliases=['j', 'jo'])
async def join(ctx):
channel = ctx.message.author.voice.channel
if not channel:
await ctx.send("You are not connected to a voice channel")
return
voice = get(bot.voice_clients, guild=ctx.guild)
if voice and voice.is_connected():
await voice.move_to(channel)
else:
voice = await channel.connect()
await voice.disconnect()
if voice and voice.is_connected():
await voice.move_to(channel)
else:
voice = await channel.connect()
await ctx.send(f"Joined {channel}")
команда воспроизведения:
@bot.command(pass_context=True, brief="This will play a song 'play [url]'", aliases=['pl'])
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 end or use the 'stop' command")
return
await ctx.send("Getting everything ready, playing audio soon")
print("Someone wants to play music let me get that ready for them...")
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:
ydl.download([url])
for file in os.listdir("./"):
if file.endswith(".mp3"):
os.rename(file, 'song.mp3')
voice.play(discord.FFmpegPCMAudio("song.mp3"))
voice.volume = 100
voice.is_playing()
Оставить команду:
@bot.command(pass_context=True, brief="Makes the bot leave your channel", aliases=['l', 'le', 'lea'])
async def leave(ctx):
channel = ctx.message.author.voice.channel
voice = get(bot.voice_clients, guild=ctx.guild)
if voice and voice.is_connected():
await voice.disconnect()
await ctx.send(f"Left {channel}")
else:
await ctx.send("Don't think I am in a voice channel")
Все, что нужно импортировать (я думаю):
import discord
import youtube_dl
import os
from discord.ext import commands
from discord.utils import get
from discord import FFmpegPCMAudio
from os import system
вам также может понадобиться загрузить ffmpeg со своего веб-сайта (для этого есть инструкции по установке и установке на YouTube)
С помощью командного поста Play с URL-адресом YouTube ('/ play www.youtube.com') он сначала ищет «song.mp3» и удаляет его, если он есть, загружает новую песню, переименовывает в « song.mp3 'затем воспроизводит mp3 файл. Файл mp3 будет помещен в ту же директорию, что и ваш bot.py
Как я уже говорил ранее, возможно, есть способ сделать это с помощью команды очереди, но я пока не знаю, как это сделать.
надеюсь, это поможет!