import discord from discord.ext import commands import asyncio import os from fuzzywuzzy import process from dotenv import load_dotenv load_dotenv() # Load environment variables from .env file intents = discord.Intents.default() intents.message_content = True intents.voice_states = True bot = commands.Bot(command_prefix='!', intents=intents) def find_song(query, songs_dir): # Initialize variables to store the best match and confidence best_match = None best_confidence = 0 # Recursively search through directories for song files for root, dirs, files in os.walk(songs_dir): for file in files: if file.endswith(".mp3"): song_path = os.path.join(root, file) song_name = os.path.relpath(song_path, start=songs_dir) # Get the song name relative to songs_dir confidence = process.extractOne(query, [song_name])[1] # Update best match if confidence is higher if confidence > best_confidence: best_match = song_path best_confidence = confidence return best_match, best_confidence # Define a global list to store the queued songs queued_songs = [] @bot.command() async def play(ctx, *, query): voice_client = discord.utils.get(bot.voice_clients, guild=ctx.guild) if voice_client and voice_client.is_connected(): await add_to_queue(ctx, query) else: await connect_and_play(ctx, query) async def add_to_queue(ctx, query): songs_dir = os.getenv("SONGS_DIR") # Find the closest match to the query song_path, confidence = find_song(query, songs_dir) if confidence >= 70 and song_path: # Adjust confidence threshold as needed song_name = os.path.relpath(song_path, start=songs_dir) # Get the song name relative to songs_dir queued_songs.append((song_path, song_name)) await ctx.send(f"Added to queue: {song_name}") else: await ctx.send("Sorry, couldn't find a match for that song.") async def connect_and_play(ctx, query): voice_channel = ctx.author.voice.channel if voice_channel: songs_dir = os.getenv("SONGS_DIR") # Find the closest match to the query song_path, confidence = find_song(query, songs_dir) if confidence >= 70 and song_path: # Adjust confidence threshold as needed song_name = os.path.relpath(song_path, start=songs_dir) # Get the song name relative to songs_dir queued_songs.append((song_path, song_name)) await play_queued_songs(ctx, voice_channel) else: await ctx.send("Sorry, couldn't find a match for that song.") else: await ctx.send("You need to be in a voice channel to use this command!") async def play_queued_songs(ctx, voice_channel): voice_client = await voice_channel.connect() while queued_songs: song_path, song_name = queued_songs.pop(0) # Get the first song in the queue await ctx.send(f"Now playing: {song_name}") voice_client.play(discord.FFmpegPCMAudio(song_path)) while voice_client.is_playing(): await asyncio.sleep(1) await voice_client.disconnect() bot.run(os.getenv("DISCORD_TOKEN"))