From d7bdc851fe14f0af0527516345973f3e2d70da99 Mon Sep 17 00:00:00 2001 From: Wizzard Date: Sat, 17 Aug 2024 12:26:42 -0400 Subject: [PATCH] Allow playback of local files --- commands/play.js | 85 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 67 insertions(+), 18 deletions(-) diff --git a/commands/play.js b/commands/play.js index c412a77..d52a224 100644 --- a/commands/play.js +++ b/commands/play.js @@ -3,10 +3,12 @@ const ytDlpExec = require('yt-dlp-exec'); const { v4: uuidv4 } = require('uuid'); const path = require('path'); const { EmbedBuilder } = require('discord.js'); +const fetch = require('node-fetch'); +const fs = require('fs'); module.exports = { name: 'play', - description: 'Play a song from YouTube', + description: 'Play a song from YouTube, a URL, or an uploaded MP3 file', async execute(message, args) { const searchQuery = args.join(' '); const voiceChannel = message.member.voice.channel; @@ -15,16 +17,63 @@ module.exports = { return message.reply('You need to be in a voice channel to play music!'); } - if (!searchQuery) { - return message.reply('Please provide a YouTube link or a song name.'); - } + let url, title, tempFilePath; - let url, title; try { + if (message.attachments.size > 0) { + const attachment = message.attachments.first(); + + if (attachment.name.endsWith('.mp3')) { + title = attachment.name; + tempFilePath = path.join(__dirname, '../utils/tmp', `${uuidv4()}.mp3`); + + const response = await fetch(attachment.url); + const buffer = await response.buffer(); + fs.writeFileSync(tempFilePath, buffer); + + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setTitle('Now Playing') + .setDescription(`**${title}**`) + .setFooter({ text: `Requested by ${message.author.username}`, iconURL: message.author.displayAvatarURL() }) + .setTimestamp(); + + message.channel.send({ embeds: [embed] }); + + addToQueue(message.guild.id, tempFilePath, title); + playNextInQueue(message.guild.id, voiceChannel); + return; + } else { + return message.reply('Only MP3 files are supported for uploads.'); + } + } + + if (!searchQuery) { + return message.reply('Please provide a YouTube link, MP3 link, or a song name.'); + } + if (isValidURL(searchQuery)) { url = searchQuery; - const info = await ytDlpExec(url, { dumpSingleJson: true }); - title = info.title; + + if (url.endsWith('.mp3')) { + title = path.basename(url); + tempFilePath = path.join(__dirname, '../utils/tmp', `${uuidv4()}.mp3`); + + const response = await fetch(url); + const buffer = await response.buffer(); + fs.writeFileSync(tempFilePath, buffer); + } else { + const info = await ytDlpExec(url, { dumpSingleJson: true }); + title = info.title; + + tempFilePath = path.join(__dirname, '../utils/tmp', `${uuidv4()}.mp3`); + await ytDlpExec(url, { + cookies: path.join(__dirname, '../cookies.txt'), + format: 'bestaudio', + output: tempFilePath, + quiet: true, + }); + } } else { const searchResult = await ytDlpExec(`ytsearch:${searchQuery}`, { dumpSingleJson: true, @@ -34,6 +83,14 @@ module.exports = { }); url = searchResult.entries[0].webpage_url; title = searchResult.entries[0].title; + + tempFilePath = path.join(__dirname, '../utils/tmp', `${uuidv4()}.mp3`); + await ytDlpExec(url, { + cookies: path.join(__dirname, '../cookies.txt'), + format: 'bestaudio', + output: tempFilePath, + quiet: true, + }); } const embed = new EmbedBuilder() @@ -41,19 +98,11 @@ module.exports = { .setTitle('Now Playing') .setDescription(`**${title}**`) .setFooter({ text: `Requested by ${message.author.username}`, iconURL: message.author.displayAvatarURL() }) - .setTimestamp() + .setTimestamp(); message.channel.send({ embeds: [embed] }); - const tempFilePath = path.join(__dirname, '../utils/tmp', `${uuidv4()}.mp3`); - await ytDlpExec(url, { - cookies: path.join(__dirname, '../cookies.txt'), - format: 'bestaudio', - output: tempFilePath, - quiet: true, - }); - - addToQueue(message.guild.id, tempFilePath); + addToQueue(message.guild.id, tempFilePath, title); playNextInQueue(message.guild.id, voiceChannel); } catch (error) { @@ -70,4 +119,4 @@ function isValidURL(string) { } catch (_) { return false; } -} +} \ No newline at end of file