mirror of
				https://github.com/musix-org/musix-oss
				synced 2025-11-04 03:39:32 +00:00 
			
		
		
		
	Validate url
Validate url for precise song accuracy when using a link to play a song
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
				
			|||||||
const YouTube = require("simple-youtube-api");
 | 
					const YouTube = require("simple-youtube-api");
 | 
				
			||||||
const search = require("yt-search");
 | 
					 | 
				
			||||||
const SpotifyApi = require("spotify-web-api-node");
 | 
					const SpotifyApi = require("spotify-web-api-node");
 | 
				
			||||||
 | 
					const search = require("yt-search");
 | 
				
			||||||
 | 
					const ytdl = require("ytdl-core")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
  name: "play",
 | 
					  name: "play",
 | 
				
			||||||
@@ -41,88 +42,30 @@ module.exports = {
 | 
				
			|||||||
      return msg.channel.send(client.messages.noPermsConnect);
 | 
					      return msg.channel.send(client.messages.noPermsConnect);
 | 
				
			||||||
    if (!voiceChannel.speakable)
 | 
					    if (!voiceChannel.speakable)
 | 
				
			||||||
      return msg.channel.send(client.messages.noPermsSpeak);
 | 
					      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];
 | 
					      const playlistId = url.split("/playlist/")[1].split("?")[0];
 | 
				
			||||||
      spotify.getPlaylist(playlistId).then(
 | 
					      spotify.getPlaylist(playlistId).then(
 | 
				
			||||||
        async function (data) {
 | 
					        async function (data) {
 | 
				
			||||||
          const lmsg = await msg.channel.send(client.messages.loadingSongs);
 | 
					            searchVideos(data, client, msg, voiceChannel)
 | 
				
			||||||
          let failed = 0;
 | 
					          },
 | 
				
			||||||
          for (let i = 0; data.body.tracks.items.length > i; i++) {
 | 
					          function (err) {
 | 
				
			||||||
            const track = await data.body.tracks.items[i].track;
 | 
					            console.log(err);
 | 
				
			||||||
            await client.funcs.sleep(250);
 | 
					            msg.channel.send(client.messages.noResultsSpotify);
 | 
				
			||||||
            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);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      );
 | 
					 | 
				
			||||||
    } else if (
 | 
					    } else if (
 | 
				
			||||||
      url.match(/^https?:\/\/(www.youtube.com|youtube.com)\/playlist(.*)$/)
 | 
					      url.match(/^https?:\/\/(www.youtube.com|youtube.com)\/playlist(.*)$/)
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
@@ -147,7 +90,7 @@ module.exports = {
 | 
				
			|||||||
      );
 | 
					      );
 | 
				
			||||||
      return lmsg.edit(message);
 | 
					      return lmsg.edit(message);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      search(searchString, function (err, res) {
 | 
					      ytSearch(searchString, function (err, res) {
 | 
				
			||||||
        if (err) return console.log(err);
 | 
					        if (err) return console.log(err);
 | 
				
			||||||
        if (res.videos.length === 0)
 | 
					        if (res.videos.length === 0)
 | 
				
			||||||
          return msg.channel.send(client.messages.noResults);
 | 
					          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);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,7 +1,5 @@
 | 
				
			|||||||
module.exports = async function (guild, song, client, seek, play) {
 | 
					module.exports = async function (guild, song, client, seek, play) {
 | 
				
			||||||
  const {
 | 
					  const { Readable: ReadableStream } = require("stream");
 | 
				
			||||||
    Readable: ReadableStream
 | 
					 | 
				
			||||||
  } = require("stream");
 | 
					 | 
				
			||||||
  const Discord = require("discord.js");
 | 
					  const Discord = require("discord.js");
 | 
				
			||||||
  const ytdl = require("ytdl-core");
 | 
					  const ytdl = require("ytdl-core");
 | 
				
			||||||
  const streamConfig = require("../config/streamConfig.js");
 | 
					  const streamConfig = require("../config/streamConfig.js");
 | 
				
			||||||
@@ -16,8 +14,7 @@ module.exports = async function (guild, song, client, seek, play) {
 | 
				
			|||||||
  streamConfig.options.seek = seek;
 | 
					  streamConfig.options.seek = seek;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let input = song.url;
 | 
					  let input = song.url;
 | 
				
			||||||
  if (song.type === "ytdl")
 | 
					  if (song.type === "ytdl") input = ytdl(song.url, streamConfig.ytdlOptions);
 | 
				
			||||||
    input = ytdl(song.url, streamConfig.ytdlOptions);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const ffmpegArgs = [
 | 
					  const ffmpegArgs = [
 | 
				
			||||||
    "-analyzeduration",
 | 
					    "-analyzeduration",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user