tabeats/main.py
2024-03-31 10:53:37 -06:00

85 lines
3.2 KiB
Python

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"))