From 496d6d5fe5fbafd7c12d0acd373be1591364bca7 Mon Sep 17 00:00:00 2001 From: Wizzard Date: Sat, 17 Aug 2024 19:48:51 -0400 Subject: [PATCH] Allow most meida files --- commands/play.js | 80 ++++++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/commands/play.js b/commands/play.js index 84a9d91..fbe4166 100644 --- a/commands/play.js +++ b/commands/play.js @@ -4,10 +4,11 @@ const path = require('path'); const { EmbedBuilder } = require('discord.js'); const fs = require('fs'); const { exec } = require('child_process'); +const { execSync } = require('child_process'); module.exports = { name: 'play', - description: 'Play a song from YouTube, a URL, or an uploaded MP3 file', + description: 'Play a song from YouTube, a URL, or an uploaded media file', async execute(message, args) { const fetch = await import('node-fetch').then(module => module.default); const searchQuery = args.join(' '); @@ -23,24 +24,33 @@ module.exports = { let title, tempFilePath, videoUrl = null; let loadingMessage; - let thumbnailUrl = null; try { if (message.attachments.size > 0) { const attachment = message.attachments.first(); + const extension = path.extname(attachment.name).toLowerCase(); - if (attachment.name.endsWith('.mp3')) { + if (['.mp3', '.mp4', '.webm', '.mov'].includes(extension)) { title = attachment.name; - tempFilePath = path.join(__dirname, '../utils/tmp', attachment.name); + const originalFilePath = path.join(__dirname, '../utils/tmp', `${uuidv4()}_${title}`); + tempFilePath = path.join(__dirname, '../utils/tmp', `${uuidv4()}.mp3`); console.log(`Attachment received: ${title}`); - console.log(`Downloading attachment to: ${tempFilePath}`); + console.log(`Downloading attachment to: ${originalFilePath}`); const response = await fetch(attachment.url); const buffer = await response.buffer(); - fs.writeFileSync(tempFilePath, buffer); + fs.writeFileSync(originalFilePath, buffer); - console.log(`Downloaded and saved: ${tempFilePath}`); + console.log(`Downloaded and saved: ${originalFilePath}`); + + if (extension !== '.mp3') { + console.log(`Converting ${extension} to MP3...`); + execSync(`ffmpeg -i "${originalFilePath}" -q:a 0 -map a "${tempFilePath}"`); + fs.unlinkSync(originalFilePath); + } else { + tempFilePath = originalFilePath; + } const embed = new EmbedBuilder() .setColor('#0099ff') @@ -52,12 +62,12 @@ module.exports = { message.channel.send({ embeds: [embed] }); console.log('Adding to queue and attempting to play.'); - addToQueue(message.guild.id, tempFilePath, title, voiceChannel, null, message.author.username, message.author.displayAvatarURL(), thumbnailUrl); + addToQueue(message.guild.id, tempFilePath, title, voiceChannel, null, message.author.username, message.author.displayAvatarURL()); playNextInQueue(message.guild.id); return; } else { - console.error('Attachment is not an MP3 file.'); - return message.reply('Only MP3 files are supported for uploads.'); + console.error('Attachment is not a supported file type.'); + return message.reply('Only MP3, MP4, and WEBM files are supported for uploads.'); } } @@ -86,22 +96,31 @@ module.exports = { message.channel.send({ embeds: [embed] }); console.log('Adding to queue and attempting to play.'); - addToQueue(message.guild.id, tempFilePath, title, voiceChannel, null, message.author.username, message.author.displayAvatarURL(), thumbnailUrl); + addToQueue(message.guild.id, tempFilePath, title, voiceChannel, null, message.author.username, message.author.displayAvatarURL()); playNextInQueue(message.guild.id); return; } else if (searchQuery.includes("cdn.discordapp.com")) { title = path.basename(searchQuery.split('?')[0]); - tempFilePath = path.join(__dirname, '../utils/tmp', `${uuidv4()}_${title}`); + const originalFilePath = path.join(__dirname, '../utils/tmp', `${uuidv4()}_${title}`); + tempFilePath = path.join(__dirname, '../utils/tmp', `${uuidv4()}.mp3`); - console.log(`Discord MP3 link received: ${searchQuery}`); - console.log(`Downloading MP3 from Discord to: ${tempFilePath}`); + console.log(`Discord CDN link received: ${searchQuery}`); + console.log(`Downloading file from Discord to: ${originalFilePath}`); const response = await fetch(searchQuery); - if (!response.ok) throw new Error('Failed to download MP3 file from Discord.'); + if (!response.ok) throw new Error('Failed to download file from Discord.'); const buffer = await response.buffer(); - fs.writeFileSync(tempFilePath, buffer); + fs.writeFileSync(originalFilePath, buffer); - console.log(`Downloaded and saved: ${tempFilePath}`); + console.log(`Downloaded and saved: ${originalFilePath}`); + + if (!originalFilePath.endsWith('.mp3')) { + console.log(`Converting to MP3...`); + execSync(`ffmpeg -i "${originalFilePath}" -q:a 0 -map a "${tempFilePath}"`); + fs.unlinkSync(originalFilePath); + } else { + tempFilePath = originalFilePath; + } const embed = new EmbedBuilder() .setColor('#0099ff') @@ -113,26 +132,22 @@ module.exports = { message.channel.send({ embeds: [embed] }); console.log('Adding to queue and attempting to play.'); - addToQueue(message.guild.id, tempFilePath, title, voiceChannel, null, message.author.username, message.author.displayAvatarURL(), thumbnailUrl); + addToQueue(message.guild.id, tempFilePath, title, voiceChannel, null, message.author.username, message.author.displayAvatarURL()); playNextInQueue(message.guild.id); return; } else { console.log(`YouTube link received: ${searchQuery}`); videoUrl = searchQuery; - exec(`yt-dlp --cookies ${path.join(__dirname, '../cookies.txt')} --print title --get-thumbnail ${searchQuery}`, async (error, stdout, stderr) => { + exec(`yt-dlp --cookies ${path.join(__dirname, '../cookies.txt')} --print title ${searchQuery}`, async (error, stdout, stderr) => { if (error) { - console.error(`Error getting title or thumbnail: ${error}`); - message.reply('Failed to retrieve video title or thumbnail.'); + console.error(`Error getting title: ${error}`); + message.reply('Failed to retrieve video title.'); return; } - const output = stdout.split('\n'); - title = output[0].trim() || "Unknown Title"; - thumbnailUrl = output[1].trim(); - + title = stdout.trim() || "Unknown Title"; console.log(`Retrieved title: ${title}`); - console.log(`Retrieved thumbnail: ${thumbnailUrl}`); loadingMessage = await message.channel.send(`**Loading...** ${title}`); @@ -155,14 +170,13 @@ module.exports = { .setColor('#0099ff') .setTitle('Added To Queue') .setDescription(`**${title}**`) - .setThumbnail(thumbnailUrl) .setFooter({ text: `Requested by ${message.author.username}`, iconURL: message.author.displayAvatarURL() }) .setTimestamp(); message.channel.send({ embeds: [embed] }); console.log('Adding to queue and attempting to play.'); - addToQueue(message.guild.id, tempFilePath, title, voiceChannel, videoUrl, message.author.username, message.author.displayAvatarURL(), thumbnailUrl); + addToQueue(message.guild.id, tempFilePath, title, voiceChannel, videoUrl, message.author.username, message.author.displayAvatarURL()); playNextInQueue(message.guild.id); }); }); @@ -179,15 +193,8 @@ module.exports = { } const info = JSON.parse(stdout); - - if (!info.entries || info.entries.length === 0) { - message.reply('No results found for your search.'); - return; - } - const url = info.entries[0].webpage_url; title = info.entries[0].title; - thumbnailUrl = info.entries[0].thumbnail; tempFilePath = path.join(__dirname, '../utils/tmp', `${uuidv4()}.mp3`); console.log(`Downloading file to: ${tempFilePath}`); @@ -209,14 +216,13 @@ module.exports = { .setColor('#0099ff') .setTitle('Added To Queue') .setDescription(`**${title}**`) - .setThumbnail(thumbnailUrl) .setFooter({ text: `Requested by ${message.author.username}`, iconURL: message.author.displayAvatarURL() }) .setTimestamp(); message.channel.send({ embeds: [embed] }); console.log('Adding to queue and attempting to play.'); - addToQueue(message.guild.id, tempFilePath, title, voiceChannel, url, message.author.username, message.author.displayAvatarURL(), thumbnailUrl); + addToQueue(message.guild.id, tempFilePath, title, voiceChannel, url, message.author.username, message.author.displayAvatarURL()); playNextInQueue(message.guild.id); }); });