From cbdc82a65558eb844c656effb2cbcdf46b01417c Mon Sep 17 00:00:00 2001 From: MatteZ02 <47610069+MatteZ02@users.noreply.github.com> Date: Fri, 24 Apr 2020 21:35:50 +0300 Subject: [PATCH] Validate url Validate url for precise song accuracy when using a link to play a song --- src/commands/play.js | 180 ++++++++++++++++++-------------- src/struct/funcs/handleVideo.js | 2 +- src/struct/funcs/play.js | 9 +- 3 files changed, 103 insertions(+), 88 deletions(-) diff --git a/src/commands/play.js b/src/commands/play.js index df7af62d..e6f795bd 100644 --- a/src/commands/play.js +++ b/src/commands/play.js @@ -1,6 +1,7 @@ const YouTube = require("simple-youtube-api"); -const search = require("yt-search"); const SpotifyApi = require("spotify-web-api-node"); +const search = require("yt-search"); +const ytdl = require("ytdl-core") module.exports = { name: "play", @@ -41,88 +42,30 @@ module.exports = { return msg.channel.send(client.messages.noPermsConnect); if (!voiceChannel.speakable) return msg.channel.send(client.messages.noPermsSpeak); - if (url.match(/^https?:\/\/(open.spotify.com|spotify.com)(.*)$/)) { + if (ytdl.validateURL(url)) { + const song = await ytdl.getInfo(url); + const resource = { + title: song.title, + url: url + } + client.funcs.handleVideo( + resource, + msg, + voiceChannel, + client, + true, + "ytdl" + ); + } else if (url.match(/^https?:\/\/(open.spotify.com|spotify.com)(.*)$/)) { const playlistId = url.split("/playlist/")[1].split("?")[0]; spotify.getPlaylist(playlistId).then( async function (data) { - const lmsg = await msg.channel.send(client.messages.loadingSongs); - let failed = 0; - for (let i = 0; data.body.tracks.items.length > i; i++) { - const track = await data.body.tracks.items[i].track; - await client.funcs.sleep(250); - await search( - `${track.artists[0].name} ${track.name} audio`, - async function (err, res) { - if (err) return console.log(err); - if (res.videos.length === 0) { - await search( - `${track.artists[0].name} ${track.name} lyrics`, - async function (err, res) { - if (err) return console.log(err); - if (res.videos.length === 0) { - await search( - `${track.artists[0].name} ${track.name}`, - async function (err, res) { - if (err) return console.log(err); - if (res.videos.length === 0) { - failed++; - return; - } - await client.funcs.handleVideo( - res.videos[0], - msg, - voiceChannel, - client, - true, - "ytdl" - ); - } - ); - return; - } - await client.funcs.handleVideo( - res.videos[0], - msg, - voiceChannel, - client, - true, - "ytdl" - ); - } - ); - failed++; - return; - } - await client.funcs.handleVideo( - res.videos[0], - msg, - voiceChannel, - client, - true, - "ytdl" - ); - } - ); - } - let message; - if (failed === 0) { - message = client.messages.playlistAdded.replace( - "%TITLE%", - data.body.name - ); - } else { - message = `${client.messages.playlistAdded.replace( - "%TITLE%", - data.body.name - )}\n${client.messages.failedToLoad + failed}`; - } - lmsg.edit(message); - }, - function (err) { - console.log(err); - msg.channel.send(client.messages.noResultsSpotify); - } - ); + searchVideos(data, client, msg, voiceChannel) + }, + function (err) { + console.log(err); + msg.channel.send(client.messages.noResultsSpotify); + }); } else if ( url.match(/^https?:\/\/(www.youtube.com|youtube.com)\/playlist(.*)$/) ) { @@ -147,7 +90,7 @@ module.exports = { ); return lmsg.edit(message); } else { - search(searchString, function (err, res) { + ytSearch(searchString, function (err, res) { if (err) return console.log(err); if (res.videos.length === 0) return msg.channel.send(client.messages.noResults); @@ -163,3 +106,78 @@ module.exports = { } }, }; + +async function searchVideos(data, client, msg, voiceChannel) { + const lmsg = await msg.channel.send(client.messages.loadingSongs); + let failed = 0; + for (let i = 0; data.body.tracks.items.length > i; i++) { + const track = await data.body.tracks.items[i].track; + await client.funcs.sleep(250); + await search( + `${track.artists[0].name} ${track.name} audio`, + async function (err, res) { + if (err) return console.log(err); + if (res.videos.length === 0) { + await search( + `${track.artists[0].name} ${track.name} lyrics`, + async function (err, res) { + if (err) return console.log(err); + if (res.videos.length === 0) { + await search( + `${track.artists[0].name} ${track.name}`, + async function (err, res) { + if (err) return console.log(err); + if (res.videos.length === 0) { + failed++; + return; + } + await client.funcs.handleVideo( + res.videos[0], + msg, + voiceChannel, + client, + true, + "ytdl" + ); + } + ); + return; + } + await client.funcs.handleVideo( + res.videos[0], + msg, + voiceChannel, + client, + true, + "ytdl" + ); + } + ); + failed++; + return; + } + await client.funcs.handleVideo( + res.videos[0], + msg, + voiceChannel, + client, + true, + "ytdl" + ); + } + ); + } + let message; + if (failed === 0) { + message = client.messages.playlistAdded.replace( + "%TITLE%", + data.body.name + ); + } else { + message = `${client.messages.playlistAdded.replace( + "%TITLE%", + data.body.name + )}\n${client.messages.failedToLoad + failed}`; + } + lmsg.edit(message); +} \ No newline at end of file diff --git a/src/struct/funcs/handleVideo.js b/src/struct/funcs/handleVideo.js index 6cdcf802..1ae2c1ae 100644 --- a/src/struct/funcs/handleVideo.js +++ b/src/struct/funcs/handleVideo.js @@ -60,4 +60,4 @@ module.exports = async function ( return msg.channel.send(client.messages.error); } return; -}; +}; \ No newline at end of file diff --git a/src/struct/funcs/play.js b/src/struct/funcs/play.js index 395f0410..11ca55da 100644 --- a/src/struct/funcs/play.js +++ b/src/struct/funcs/play.js @@ -1,7 +1,5 @@ module.exports = async function (guild, song, client, seek, play) { - const { - Readable: ReadableStream - } = require("stream"); + const { Readable: ReadableStream } = require("stream"); const Discord = require("discord.js"); const ytdl = require("ytdl-core"); const streamConfig = require("../config/streamConfig.js"); @@ -16,8 +14,7 @@ module.exports = async function (guild, song, client, seek, play) { streamConfig.options.seek = seek; let input = song.url; - if (song.type === "ytdl") - input = ytdl(song.url, streamConfig.ytdlOptions); + if (song.type === "ytdl") input = ytdl(song.url, streamConfig.ytdlOptions); const ffmpegArgs = [ "-analyzeduration", @@ -78,4 +75,4 @@ module.exports = async function (guild, song, client, seek, play) { queue.textChannel.send(embed); } queue.playing = true; -}; \ No newline at end of file +};