1
0
mirror of https://github.com/musix-org/musix-oss synced 2025-01-09 02:34:49 +00:00
musix-oss/src/commands/play.js

182 lines
5.8 KiB
JavaScript
Raw Normal View History

2020-02-05 20:02:53 +00:00
const YouTube = require("simple-youtube-api");
2020-04-19 17:00:16 +00:00
const SpotifyApi = require("spotify-web-api-node");
2020-06-17 13:38:43 +00:00
const ytdl = require("ytdl-core");
const ytsr = require("ytsr");
const ms = require("ms");
2020-02-05 20:02:53 +00:00
module.exports = {
2020-04-19 17:00:16 +00:00
name: "play",
2020-05-15 16:05:39 +00:00
alias: ["p", "music"],
2020-04-19 17:00:16 +00:00
usage: "<song name>",
description: "Play some music.",
onlyDev: false,
permission: "none",
category: "music",
async execute(msg, args, client, Discord, command) {
const spotify = new SpotifyApi({
id: client.config.spotify_client_id,
secret: client.config.spotify_client_secret,
});
2020-04-21 10:52:36 +00:00
spotify.setAccessToken(client.config.spotify_access_key);
2020-04-19 17:00:16 +00:00
const youtube = new YouTube(client.config.api_key);
const searchString = args.slice(1).join(" ");
const url = args[1] ? args[1].replace(/<(.+)>/g, "$1") : "";
const queue = client.queue.get(msg.guild.id);
const voiceChannel = msg.member.voice.channel;
if (
client.global.db.guilds[msg.guild.id].blacklist.includes(
msg.member.voice.channelID
)
)
return msg.channel.send(client.messages.blackListedVC);
if (!queue) {
if (!msg.member.voice.channel)
return msg.channel.send(client.messages.noVoiceChannel);
} else {
if (voiceChannel !== queue.voiceChannel)
return msg.channel.send(client.messages.wrongVoiceChannel);
}
if (!args[1]) return msg.channel.send(client.messages.noQuery);
if (voiceChannel.full) return msg.channel.send(client.messages.channelFull);
if (!voiceChannel.joinable)
return msg.channel.send(client.messages.noPermsConnect);
if (!voiceChannel.speakable)
return msg.channel.send(client.messages.noPermsSpeak);
if (ytdl.validateURL(url)) {
2020-06-17 13:38:43 +00:00
client.funcs.handleVideo(url, msg, voiceChannel, client, false, "ytdl");
} else if (url.match(/^https?:\/\/(open.spotify.com|spotify.com)(.*)$/)) {
2020-04-19 17:00:16 +00:00
const playlistId = url.split("/playlist/")[1].split("?")[0];
spotify.getPlaylist(playlistId).then(
async function (data) {
2020-06-17 13:38:43 +00:00
searchVideos(data, client, msg, voiceChannel);
},
function (err) {
console.log(err);
msg.channel.send(client.messages.noResultsSpotify);
2020-06-17 13:38:43 +00:00
}
);
2020-04-19 17:00:16 +00:00
} else if (
url.match(/^https?:\/\/(www.youtube.com|youtube.com)\/playlist(.*)$/)
) {
const lmsg = await msg.channel.send(client.messages.loadingSongs);
const playlist = await youtube.getPlaylist(url);
const videos = await playlist.getVideos();
for (const video of Object.values(videos)) {
const video2 = await youtube.getVideoByID(video.id);
await client.funcs.handleVideo(
2020-06-17 13:38:43 +00:00
video2.url,
2020-04-19 17:00:16 +00:00
msg,
voiceChannel,
client,
true,
"ytdl"
);
}
2020-06-09 18:25:55 +00:00
const message = client.messages.playlistAdded.replace(
2020-04-19 17:00:16 +00:00
"%TITLE%",
playlist.title
);
return lmsg.edit(message);
} else {
2020-06-17 13:38:43 +00:00
ytsr(
searchString, {
limit: 5,
},
function (err, res) {
if (err) console.log(err);
if (!res.items[0]) return msg.channel.send(client.messages.noResults);
const videoResults = res.items.filter(item => item.type === "video");
client.funcs.handleVideo(
videoResults[0].link,
msg,
voiceChannel,
client,
false,
"ytdl"
);
}
);
2020-04-19 17:00:16 +00:00
}
},
2020-04-21 19:19:40 +00:00
};
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);
2020-06-17 13:38:43 +00:00
ytsr(
`${track.artists[0].name} ${track.name} audio`, {
limit: 5,
},
async function (err, res) {
if (err) return console.log(err);
2020-06-17 13:38:43 +00:00
if (!res.items[0]) {
ytsr(
`${track.artists[0].name} ${track.name} lyrics`, {
limit: 5,
},
async function (err, res) {
if (err) return console.log(err);
2020-06-17 13:38:43 +00:00
if (!res.items[0]) {
ytsr(
`${track.artists[0].name} ${track.name}`, {
limit: 5,
},
async function (err, res) {
2020-06-17 13:38:43 +00:00
if (err) console.log(err);
if (!res.items[0]) {
failed++;
}
2020-06-17 13:38:43 +00:00
const videoResults = res.items.filter(item => item.type === "video");
client.funcs.handleVideo(
videoResults[0].link,
msg,
voiceChannel,
client,
2020-06-17 13:38:43 +00:00
false,
"ytdl"
);
}
);
return;
}
2020-06-17 13:38:43 +00:00
const videoResults = res.items.filter(item => item.type === "video");
await client.funcs.handleVideo(
2020-06-17 13:38:43 +00:00
videoResults[0].link,
msg,
voiceChannel,
client,
true,
"ytdl"
);
}
);
failed++;
return;
}
2020-06-17 13:38:43 +00:00
const videoResults = res.items.filter(item => item.type === "video");
await client.funcs.handleVideo(
2020-06-17 13:38:43 +00:00
videoResults[0].link,
msg,
voiceChannel,
client,
true,
"ytdl"
);
}
);
}
let message;
if (failed === 0) {
2020-06-17 13:38:43 +00:00
message = client.messages.playlistAdded.replace("%TITLE%", data.body.name);
} else {
message = `${client.messages.playlistAdded.replace(
2020-06-17 13:38:43 +00:00
"%TITLE%",
data.body.name
)}\n${client.messages.failedToLoad + failed}`;
}
lmsg.edit(message);
}