├── .editorconfig ├── .gitignore ├── .travis.yml ├── Procfile ├── README.md ├── config.json ├── index.js ├── package-lock.json └── package.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | [*] 3 | charset = utf-8 4 | indent_style = tab 5 | indent_size = 4 6 | trim_trailing_whitespace = true 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | node_modules 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 10.15.0 4 | os: 5 | - windows 6 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | worker: node index.js -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://img.shields.io/travis/Yizack/yeezac/master.svg?style=flat-square)](https://travis-ci.org/Yizack/yeezac) 2 | [![Dependencies Status](https://david-dm.org/yizack/yeezac/status.svg?style=flat-square)](https://david-dm.org/yizack/yeezac) 3 | # Yeezac 4 | Bot de música para Discord con Node.js 5 | 6 | ## Requerimientos Generales 7 | - Crear [Discord Bot](https://discordapp.com/developers/applications/) 8 | - Habilitar [Youtube API](https://console.developers.google.com/) 9 | - Crear [SoundCloud APP](https://soundcloud.com/you/apps) (No disponible, ver: [SoundCloud Developers](https://developers.soundcloud.com/)) 10 | 11 | ### Configuración General 12 | - Invita el bot a tu servidor de Discord accediendo en\ 13 | `https://discordapp.com/oauth2/authorize?client_id=XXXXXXXXXXXXXXXXXX&scope=bot&permissions=301296759`. \ 14 | Reemplaza `XXXXXXXXXXXXXXXXXX` por el **Client ID** del Discord Bot. 15 | - Editar `config.json` 16 | - `discord_token` Reemplazar `bot token` con el token del Discord Bot. 17 | - `botid` Reemplazar `id del bot` con el id del Discord Bot. 18 | - `prefix` Reemplazar `y!` con el prefijo que desees utilizar para tu Discord Bot. 19 | - `yt_api_key` Reemplazar `api key de youtube` con la api key de Youtube. 20 | - `ownerid` Reemplazar `tu discord id` con tu Discord ID. 21 | - `sc_clientid` Reemplazar `tu soundcloud client id` con tu Client ID de la app de tu SoundCloud. 22 | ## 23 | 24 | ## Opción 1. Instalar en una PC local (Windows) 25 | ### Requerimientos 26 | - Descargar e Instalar [Node.js](https://nodejs.org/) 27 | 28 | ### Configurar 29 | - Abrir `cmd.exe` en Windows. 30 | - Ejecutar `cd\` para ir a la raíz del disco local. 31 | - Ejecutar para ir al directorio donde están los archivos del Discord Bot. Ejemplo `cd %USERPROFILE%\Documents\DiscordBot` 32 | - Ejecutar `npm install` para instalar dependencies. 33 | - ~~Ejecutar `npm install ffmpeg-binaries` para instalar la librería ffmpeg.~~ * ffmpeg-binaries se ha quedado obsoleto y está fuera de mantenimiento por lo cual el bot no puede reproducir música, estaré investigando formas para lograr esto otra vez o esperar que la librería de discord.js actualize su librería de prism-media y soporte otras liberías ffmpeg como ffmpeg-static. 34 | - Debido a que discord.js aún no ha actualizado su librería de prism-media, puedes solucionar el error editando el archivo `Ffmpeg.js` ubicado en `node_modules/discord.js/node_modules/prism-media/src/transcoders/ffmpeg/` de la carpeta de tu bot, allí bajas hasta casi las últimas líneas del código y encontrarás una parte como `return require('ffmpeg-binaries');`, debes cambiar `ffmpeg-binaries` por `ffmpeg-static` y listo. 35 | - Ejecutar `node index.js` para activar el Discord Bot. 36 | ## 37 | 38 | ## Opción 2. Instalar en Heroku (Windows) 39 | ### Requerimientos 40 | - Registro en [Heroku](https://heroku.com/) 41 | - Crear [Heroku App](https://dashboard.heroku.com/new-app) 42 | - Descargar e Instalar [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli) 43 | - Descargar e Instalar [Git](https://git-scm.com/downloads) 44 | 45 | ### Configurar 46 | - Asignar nombre a la app en Heroku. 47 | - Ir a la pestaña **Settings** de tu Heroku App, en el botón **Add Buildpack**: 48 | - Agrega un buildpack, selecciona la opcion `nodejs` y presiona **Save Changes** para instalar Node.js en Heroku. 49 | - Agrega otro buildpack, ingresa el siguiente URL `https://github.com/issueapp/heroku-buildpack-ffmpeg` y presiona **Save Changes** para instalar la librería ffmpeg compatible con Heroku. 50 | - Abrir `cmd.exe` en Windows. 51 | - Ejecutar `heroku login` y presiona cualquier tecla que no sea `q` para iniciar sesión. 52 | - Ejecutar `cd\` para ir a la raíz del disco local. 53 | - Ejecutar para ir al directorio donde están los archivos del Discord Bot. Ejemplo `cd %USERPROFILE%\Documents\DiscordBot` 54 | - Ejecutar `git init` para inicializar los archivos **.git** 55 | - Ejecutar `heroku git:remote -a nombredelaapp` para controlar tu Heroku App. Reemplaza `nombredelaapp` por el nombre que le asignaste a tu Heroku App. 56 | - Ejecutar `git add .` para añadir los archivos del Discord Bot a Heroku. 57 | - Ejecutar `git commit -am "make it better"` para guardar los cambios 58 | - Ejecutar `git push heroku master` subir los archivos a Heroku. 59 | - Ejecutar `heroku ps:scale worker=1` para activar el Discord Bot 24/7. 60 | ## 61 | 62 | ## Uso 63 | | Comando | Descripción 64 | |---------|-------------| 65 | | `y!play` | Reproduce o añade a cola una canción de Youtube o SoundCloud. | 66 | | `y!pausa` | Pausar la canción actual. | 67 | | `y!resume` | Resumir la canción pausada. | 68 | | `y!cola` | Ver lista de canciones que están en cola de reproducción. | 69 | | `y!skip` | Saltar canción que se está reproduciendo. | 70 | | `y!salir` | Sacar el bot del canal de voz. | 71 | | `y!servidores` | Cantidad de servidores que ha sido invitado el bot. | 72 | | `y!comandos` | Lista de comandos. | 73 | ## 74 | 75 | ## Sugerencias, preguntas o problemas 76 | Si tienes sugerencias, preguntas o algún problema, no dudes en escribeme en [@Yizack](https://github.com/Yizack/yeezac/issues/new). 77 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "discord_token": "bot token", 3 | "botid": "id del bot", 4 | "prefix": "y!", 5 | "yt_api_key": "api key de youtube", 6 | "ownerid": "tu discord id", 7 | "sc_clientid": "tu soundcloud client id" 8 | } 9 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const client = new Discord.Client(); 3 | const ytdl = require("ytdl-core"); 4 | const request = require("request"); 5 | const getYouTubeID = require("get-youtube-id"); 6 | const fetchVideoInfo = require("youtube-info"); 7 | const config = require("./config.json"); 8 | 9 | const yt_api_key = config.yt_api_key; 10 | const prefix = config.prefix; 11 | const discord_token = config.discord_token; 12 | const botid = config.botid; 13 | const ownerid = config.ownerid; 14 | const sc_clientid = config.sc_clientid; 15 | 16 | let guilds = {}; 17 | 18 | client.login(discord_token); 19 | 20 | client.on('message', function(message) { 21 | let guild = message.guild.id; 22 | if(message.channel.type !== "dm") { 23 | const mess = message.content.toLowerCase(); 24 | const comando = mess.split(" ")[0]; // Extrae el comando 25 | if (!guilds[guild]) { 26 | guilds[guild] = { 27 | queue: [], 28 | queueNames: [], 29 | url: [], 30 | titulo: [], 31 | duracion: [], 32 | thumbnail: [], 33 | autor: [], 34 | dispatcher: null, 35 | voiceChannel: null, 36 | isPlaying: false, 37 | }; 38 | } 39 | switch(comando) { 40 | case prefix + "play": 41 | if (message.member.voiceChannel) { 42 | if (mess === (prefix + "play")) 43 | message.reply("No escribiste el nombre de ninguna canción."); 44 | else { 45 | const args = message.content.split(/(?:<|(?:>| ))+/).slice(1).join(" "); // Remover comando, espacios y <> del mensaje 46 | if(isURL(args.toLowerCase())){ // Si la búsqueda contiene un link 47 | if(isSoundcloud(args)) // Si lee un link de soundcloud 48 | Soundcloud(args, message); // Soundcloud 49 | else if (isYoutube(args)) // Si lee un link de youtube 50 | Youtube(args, message); // Youtube 51 | else 52 | message.reply("No se encontro ningúna canción con ese link."); 53 | } 54 | else // Si no 55 | buscar_video(args, message); // Buscar video en el buscador de youtube 56 | } 57 | } 58 | else 59 | message.reply(" Necesitas unirte a un canal de voz!"); 60 | break; 61 | 62 | case prefix + "skip": 63 | if(guilds[guild].queue[0] !== undefined) { 64 | message.reply("La canción ha sido saltada!"); 65 | guilds[guild].dispatcher.end(); 66 | } 67 | break; 68 | 69 | case prefix + "cola": 70 | let message2 = "```css\n"; 71 | for (let i = 0; i < guilds[guild].queueNames.length; i++) { 72 | let temp = (i + 1) + ": " + (i === 0 ? "🔊 " : "") + guilds[guild].queueNames[i] + "\n"; 73 | if ((message2 + temp).length <= 2000 - 3) 74 | message2 += temp; 75 | else { 76 | message2 += "```"; 77 | message.channel.send(message2); 78 | message2 = "```"; 79 | } 80 | } 81 | message2 += "```"; 82 | message.channel.send(message2); 83 | break; 84 | 85 | case prefix + "salir": 86 | if(guilds[guild].voiceChannel !== null) 87 | Salir(message); 88 | break; 89 | 90 | case prefix + "servidores": 91 | let contar_servidores; 92 | switch(client.guilds.size) { 93 | case 1: 94 | contar_servidores = "He sido invitado a " + client.guilds.size + " servidor."; 95 | message.channel.send(contar_servidores); 96 | break; 97 | default: 98 | contar_servidores = "Me han invitado a " + client.guilds.size + " servidores."; 99 | message.channel.send(contar_servidores); 100 | break; 101 | } 102 | console.log(contar_servidores); 103 | break; 104 | 105 | case prefix + "comandos": 106 | message.channel.send( 107 | "📜 Lista de comandos:\n"+ 108 | "```xl\n"+ 109 | "'y!play' Reproducir una canción o añadirla a la cola.\n"+ 110 | "'y!pausa' Pausar la canción actual.\n"+ 111 | "'y!resume' Resumir la canción pausada.\n"+ 112 | "'y!cola' Ver lista de canciones que están en cola de reproducción.\n"+ 113 | "'y!skip' Saltar canción que se está reproduciendo.\n"+ 114 | "'y!salir' Sacar el bot del canal de voz.\n"+ 115 | "'y!servidores' Mostrar la cantidad de servidores que ha sido invitado el bot.\n"+ 116 | "'y!comandos' Lista de comandos."+ 117 | "```" 118 | ); 119 | break; 120 | 121 | case prefix + "pausa": 122 | if(guilds[guild].isPlaying === true) { 123 | message.reply("Has pausado la canción."); 124 | guilds[guild].dispatcher.pause(); 125 | guilds[guild].isPlaying = false; 126 | } 127 | break; 128 | 129 | case prefix +"resume": 130 | if(guilds[guild].queue[0] !== undefined && guilds[guild].isPlaying === false) { 131 | setTimeout(function() { 132 | message.reply("La canción ha sido resumida."); 133 | guilds[guild].dispatcher.resume(); 134 | guilds[guild].isPlaying = true; 135 | }, 500); 136 | } 137 | break; 138 | } 139 | } 140 | else { // Si el bot recibe un mensaje directo 141 | const mess = message.content; 142 | if(message.author.id !== botid){ 143 | console.log("El bot ha recibido un mensaje privado ("+ message.channel.type +"): "); 144 | console.log(message.author.tag + ": " + mess); 145 | client.fetchUser(ownerid).then((user) => { 146 | user.send(message.author.tag + ": " + mess); // Enviar mensaje privado al dueño del bot 147 | }); 148 | } 149 | } 150 | }); 151 | 152 | client.on('ready', function() { 153 | console.log("Estoy listo!"); 154 | client.user.setPresence({ 155 | game: { 156 | name: "yeezac.yizack.com", // Estado del bot 157 | type: 0 158 | } 159 | }); 160 | }); 161 | 162 | client.on('error', function() { 163 | console.error("Ha ocurrido un error"); 164 | }); 165 | 166 | client.on('resume', function() { 167 | console.log("Estoy listo otra vez!"); 168 | }); 169 | 170 | // Youtube 171 | function Youtube(args, message) { 172 | let id = getYouTubeID(args); 173 | if(!id) { 174 | if(args.indexOf("playlist") > -1) 175 | message.reply("Se encontró más de una canción. No están permitidas las playlist."); 176 | else 177 | message.reply("No se encontro ningúna canción con ese link."); 178 | } 179 | else 180 | reproducirYoutube(id, message); 181 | } 182 | 183 | // Soundcloud 184 | async function Soundcloud(args, message) { 185 | let guild = message.guild.id; 186 | let respuesta = await doRequest("http://api.soundcloud.com/resolve.json?url=" + args + "&client_id=" + sc_clientid); 187 | if(respuesta != null){ 188 | let json = JSON.parse(respuesta); 189 | if(json.tracks) 190 | message.reply("Se encontró más de una canción. No están permitidas las playlist."); 191 | else if (json.id) { 192 | let titulo = json.user.username + " - " + json.title; 193 | let duracion = tiempo(json.duration / 1000); 194 | let id = json.id; 195 | let url = json.permalink_url; 196 | let thumbnail = json.artwork_url; 197 | let posicion = guilds[guild].queue.length + 1; 198 | if(guilds[guild].queue.length > 0) { // Si la cola es mayor a 0 199 | if(guilds[guild].queue.indexOf(id) > -1) // Si ya existe el id de la canción 200 | message.reply("Esa canción ya está en cola, espera a que acabe para escucharla otra vez."); 201 | else 202 | agregar_a_cola(message, id, url, titulo, duracion, thumbnail, posicion); // Agrgar canción a la cola 203 | } 204 | else { // Si no hay canciones 205 | Push(message, id, url, titulo, duracion, thumbnail, message.author); // Push canción 206 | playMusic(message, id, url, titulo, duracion); // Reproducir canción 207 | } 208 | } 209 | else 210 | message.reply("No se encontro ningúna canción con ese link."); 211 | } 212 | else 213 | message.reply("No se encontro ningúna canción con ese link."); 214 | } 215 | 216 | // Buscar video en youtube sin link y obtener el ID para reproducir 217 | async function buscar_video(args, message) { 218 | let respuesta = await doRequest("https://www.googleapis.com/youtube/v3/search?part=id&type=video&q=" + encodeURIComponent(args) + "&key=" + yt_api_key); 219 | let json = JSON.parse(respuesta); 220 | if (!json.items[0]) 221 | message.reply("No se encontro ningúna canción."); 222 | else { 223 | let id = json.items[0].id.videoId; 224 | reproducirYoutube(id, message); 225 | } 226 | } 227 | 228 | function reproducirYoutube(id, message){ 229 | let guild = message.guild.id; 230 | fetchVideoInfo(id, function(err, videoInfo) { 231 | if (err) 232 | message.reply("No se encontro ningúna canción con ese link."); 233 | else { 234 | let titulo = videoInfo.title; 235 | let duracion = tiempo(videoInfo.duration); 236 | let url = videoInfo.url; 237 | let thumbnail = videoInfo.thumbnailUrl; 238 | let posicion = guilds[guild].queue.length + 1; 239 | if(guilds[guild].queue.length > 0) { // Si la cola es mayor a 0 240 | if(guilds[guild].queue.indexOf(id) > -1) // Si ya existe el id de la canción 241 | message.reply("Esa canción ya está en cola, espera a que acabe para escucharla otra vez."); 242 | else 243 | agregar_a_cola(message, id, url, titulo, duracion, thumbnail, posicion); // Agrgar canción a la cola 244 | } 245 | else { // Si no hay canciones 246 | Push(message, id, url, titulo, duracion, thumbnail, message.author); // Push canción 247 | playMusic(message, id, url, titulo, duracion); // Reproducir canción 248 | } 249 | } 250 | }); 251 | } 252 | 253 | // Reproducir música de Soundcloud o Youtube 254 | function playMusic(message, id, url) { 255 | let stream; 256 | if(isYoutube(url)) 257 | stream = ytdl("https://www.youtube.com/watch?v=" + id, {filter: 'audioandvideo', quality: "highestaudio", highWaterMark: 1<<25}); // Pasar stream de youtube 258 | else 259 | stream = "http://api.soundcloud.com/tracks/" + id + "/stream?consumer_key=" + sc_clientid; // Pasar stream de soundcloud 260 | play(stream, message); // Reproducir 261 | } 262 | 263 | function play(stream, message){ 264 | // Variables de la canción actual 265 | let guild = message.guild.id; 266 | let id = guilds[guild].queue[0]; 267 | let url = guilds[guild].url[0]; 268 | let titulo = guilds[guild].titulo[0]; 269 | let duracion = guilds[guild].duracion[0]; 270 | let thumbnail = guilds[guild].thumbnail[0]; 271 | let autor = guilds[guild].autor[0]; 272 | reproduciendo(id, url, titulo, duracion, message, thumbnail, autor); // Mostrar canción que se está reproduciendo 273 | // Verificar canal de voz del usuario 274 | guilds[guild].voiceChannel = message.member.voiceChannel; 275 | guilds[guild].voiceChannel.join().then(connection => { 276 | connection.setMaxListeners(0); 277 | guilds[guild].isPlaying = true; 278 | guilds[guild].dispatcher = connection.playStream(stream); // Stream canción 279 | guilds[guild].dispatcher.on('end', function() { // Cuando se acaba la canción 280 | Shift(message); // Liberar datos de la canción y pasar la siguiente a la posición 0 281 | if (guilds[guild].queue.length === 0) // Si no hay más canciones en la cola 282 | Salir(message); // Salir del canal 283 | else { // Si hay más canciones 284 | setTimeout(function() { 285 | id = guilds[guild].queue[0]; // Obtener id 286 | url = guilds[guild].url[0]; // Obtener url 287 | playMusic(message, id, url); // Reproducir música de Soundcloud o Youtube 288 | }, 500); 289 | } 290 | }); 291 | connection.on('error', function() { 292 | console.error("Se ha perdido la conexión"); 293 | process.exit(1); 294 | }); 295 | }).catch(err => console.log(err)); 296 | } 297 | 298 | // Envía la canción que se está reproduciendo 299 | function reproduciendo(id, url, titulo, duracion, message, thumbnail, autor) { 300 | message.channel.send("🔊 Se está reproduciendo:"); 301 | message.channel.send(message_embed(autor.username + " está reproduciendo", autor.avatarURL, titulo, thumbnail, url, duracion, id, "1 (actual)")); 302 | console.log("ID: "+ id); 303 | console.log(message.author.tag + " está reproduciendo: " + titulo); 304 | } 305 | 306 | // Agregar canciones a la cola 307 | function agregar_a_cola(message, id, url, titulo, duracion, thumbnail, posicion) { 308 | message.reply("📢 has añadido una canción a la cola"); 309 | message.channel.send(message_embed("Añadido a cola por: " + message.author.username, message.author.avatarURL, titulo, thumbnail, url, duracion, id, posicion)); 310 | Push(message, id, url, titulo, duracion, thumbnail, message.author); // Push a y!cola 311 | } 312 | 313 | // Recibe argumentos del mensaje y retorna true si el mensaje recibido tiene un link de Youtube 314 | function isYoutube(args) { 315 | return args.indexOf("youtube.com") > -1 || args.indexOf("youtu.be") > -1; 316 | } 317 | 318 | // Recibe argumentos del mensaje y retorna true si el mensaje recibido tiene un link de Soundcloud 319 | function isSoundcloud (args) { 320 | return args.indexOf("soundcloud.com") > -1; 321 | } 322 | 323 | // Obtener respuesta del request de un url 324 | async function doRequest(url) { 325 | return new Promise(function (resolve, reject) { 326 | request(url, function (error, res, body) { 327 | if (!error && res.statusCode == 200) 328 | resolve(body); 329 | else 330 | reject(error); 331 | }); 332 | }) 333 | .catch(function(err) { 334 | console.log(err); 335 | }); 336 | } 337 | 338 | // Recibe tiempo en segundos y retorna tiempo convertido a minutos:segundos o horas:minutos:segundos 339 | function tiempo(time) { 340 | let hrs = ~~(time / 3600); 341 | let mins = ~~((time % 3600) / 60); 342 | let secs = ~~time % 60; 343 | let ret = ""; 344 | if (hrs > 0) 345 | ret += "" + hrs + ":" + (mins < 10 ? "0" : ""); 346 | ret += "" + mins + ":" + (secs < 10 ? "0" : ""); 347 | ret += "" + secs; 348 | return ret; 349 | } 350 | 351 | // Liberar datos de la canción y pasar la siguiente a la posición 0 352 | function Shift(message) { 353 | let guild = message.guild.id; 354 | guilds[guild].queue.shift(); 355 | guilds[guild].queueNames.shift(); 356 | guilds[guild].url.shift(); 357 | guilds[guild].titulo.shift(); 358 | guilds[guild].duracion.shift(); 359 | guilds[guild].thumbnail.shift(); 360 | guilds[guild].autor.shift(); 361 | } 362 | 363 | // Salir del canal de voz y reinicializar las variables de los datos de las canciones 364 | function Salir(message) { 365 | let guild = message.guild.id; 366 | guilds[guild].queue = []; 367 | guilds[guild].queueNames = []; 368 | guilds[guild].url = []; 369 | guilds[guild].titulo = []; 370 | guilds[guild].duracion = []; 371 | guilds[guild].thumbnail = []; 372 | guilds[guild].autor = []; 373 | guilds[guild].voiceChannel.leave(); 374 | guilds[guild].isPlaying = false; 375 | } 376 | 377 | // Push canción (Agregar infromación de la canción) 378 | function Push(message, id, url, titulo, duracion, thumbnail, autor) { 379 | let guild = message.guild.id; 380 | guilds[guild].queue.push(id); 381 | guilds[guild].queueNames.push(titulo + ", ⏲️: [" + duracion + "]"); 382 | guilds[guild].url.push(url); 383 | guilds[guild].titulo.push(titulo); 384 | guilds[guild].duracion.push(duracion); 385 | guilds[guild].thumbnail.push(thumbnail); 386 | guilds[guild].autor.push(autor); 387 | } 388 | 389 | // Verificar si es un link 390 | function isURL(args) { 391 | let url = args.match(/^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/g); 392 | if (url == null) 393 | return false; 394 | else 395 | return true; 396 | } 397 | 398 | function message_embed(str, avatar, titulo, thumbnail, url, duracion, id, posicion){ 399 | const embed = new Discord.RichEmbed() 400 | .setTitle(titulo) 401 | .setAuthor(str, avatar) 402 | .setColor(0x292929) 403 | .setThumbnail(thumbnail) 404 | .setURL(url) 405 | .addField("Duración", duracion, true) 406 | .addField("ID", id, true) 407 | .addField('Posición en cola', posicion); 408 | return embed; 409 | } 410 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "yeezac", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ajv": { 8 | "version": "6.11.0", 9 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", 10 | "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", 11 | "requires": { 12 | "fast-deep-equal": "^3.1.1", 13 | "fast-json-stable-stringify": "^2.0.0", 14 | "json-schema-traverse": "^0.4.1", 15 | "uri-js": "^4.2.2" 16 | } 17 | }, 18 | "asn1": { 19 | "version": "0.2.4", 20 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 21 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 22 | "requires": { 23 | "safer-buffer": "~2.1.0" 24 | } 25 | }, 26 | "assert-plus": { 27 | "version": "1.0.0", 28 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 29 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 30 | }, 31 | "async-limiter": { 32 | "version": "1.0.1", 33 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 34 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" 35 | }, 36 | "asynckit": { 37 | "version": "0.4.0", 38 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 39 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 40 | }, 41 | "aws-sign2": { 42 | "version": "0.7.0", 43 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 44 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 45 | }, 46 | "aws4": { 47 | "version": "1.8.0", 48 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 49 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 50 | }, 51 | "bcrypt-pbkdf": { 52 | "version": "1.0.2", 53 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 54 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 55 | "requires": { 56 | "tweetnacl": "^0.14.3" 57 | }, 58 | "dependencies": { 59 | "tweetnacl": { 60 | "version": "0.14.5", 61 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 62 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 63 | } 64 | } 65 | }, 66 | "bluebird": { 67 | "version": "3.5.5", 68 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", 69 | "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" 70 | }, 71 | "boolbase": { 72 | "version": "1.0.0", 73 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 74 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 75 | }, 76 | "boom": { 77 | "version": "2.10.1", 78 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", 79 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", 80 | "requires": { 81 | "hoek": "2.x.x" 82 | } 83 | }, 84 | "caseless": { 85 | "version": "0.12.0", 86 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 87 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 88 | }, 89 | "cheerio": { 90 | "version": "0.19.0", 91 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", 92 | "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", 93 | "requires": { 94 | "css-select": "~1.0.0", 95 | "dom-serializer": "~0.1.0", 96 | "entities": "~1.1.1", 97 | "htmlparser2": "~3.8.1", 98 | "lodash": "^3.2.0" 99 | } 100 | }, 101 | "co": { 102 | "version": "4.6.0", 103 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 104 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 105 | }, 106 | "combined-stream": { 107 | "version": "1.0.8", 108 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 109 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 110 | "requires": { 111 | "delayed-stream": "~1.0.0" 112 | } 113 | }, 114 | "core-util-is": { 115 | "version": "1.0.2", 116 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 117 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 118 | }, 119 | "cryptiles": { 120 | "version": "2.0.5", 121 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", 122 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", 123 | "requires": { 124 | "boom": "2.x.x" 125 | } 126 | }, 127 | "css-select": { 128 | "version": "1.0.0", 129 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", 130 | "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", 131 | "requires": { 132 | "boolbase": "~1.0.0", 133 | "css-what": "1.0", 134 | "domutils": "1.4", 135 | "nth-check": "~1.0.0" 136 | } 137 | }, 138 | "css-what": { 139 | "version": "1.0.0", 140 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", 141 | "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=" 142 | }, 143 | "dashdash": { 144 | "version": "1.14.1", 145 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 146 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 147 | "requires": { 148 | "assert-plus": "^1.0.0" 149 | } 150 | }, 151 | "debug": { 152 | "version": "2.6.9", 153 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 154 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 155 | "requires": { 156 | "ms": "2.0.0" 157 | } 158 | }, 159 | "decompress-response": { 160 | "version": "4.2.1", 161 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 162 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 163 | "requires": { 164 | "mimic-response": "^2.0.0" 165 | } 166 | }, 167 | "delayed-stream": { 168 | "version": "1.0.0", 169 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 170 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 171 | }, 172 | "discord.js": { 173 | "version": "11.5.1", 174 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-11.5.1.tgz", 175 | "integrity": "sha512-tGhV5xaZXE3Z+4uXJb3hYM6gQ1NmnSxp9PClcsSAYFVRzH6AJH74040mO3afPDMWEAlj8XsoPXXTJHTxesqcGw==", 176 | "requires": { 177 | "long": "^4.0.0", 178 | "prism-media": "^0.0.3", 179 | "snekfetch": "^3.6.4", 180 | "tweetnacl": "^1.0.0", 181 | "ws": "^6.0.0" 182 | }, 183 | "dependencies": { 184 | "prism-media": { 185 | "version": "0.0.3", 186 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-0.0.3.tgz", 187 | "integrity": "sha512-c9KkNifSMU/iXT8FFTaBwBMr+rdVcN+H/uNv1o+CuFeTThNZNTOrQ+RgXA1yL/DeLk098duAeRPP3QNPNbhxYQ==" 188 | } 189 | } 190 | }, 191 | "dom-serializer": { 192 | "version": "0.1.1", 193 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", 194 | "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", 195 | "requires": { 196 | "domelementtype": "^1.3.0", 197 | "entities": "^1.1.1" 198 | } 199 | }, 200 | "domelementtype": { 201 | "version": "1.3.1", 202 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", 203 | "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" 204 | }, 205 | "domhandler": { 206 | "version": "2.3.0", 207 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", 208 | "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", 209 | "requires": { 210 | "domelementtype": "1" 211 | } 212 | }, 213 | "domutils": { 214 | "version": "1.4.3", 215 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", 216 | "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", 217 | "requires": { 218 | "domelementtype": "1" 219 | } 220 | }, 221 | "ecc-jsbn": { 222 | "version": "0.1.2", 223 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 224 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 225 | "requires": { 226 | "jsbn": "~0.1.0", 227 | "safer-buffer": "^2.1.0" 228 | } 229 | }, 230 | "entities": { 231 | "version": "1.1.2", 232 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", 233 | "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" 234 | }, 235 | "extend": { 236 | "version": "3.0.2", 237 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 238 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 239 | }, 240 | "extsprintf": { 241 | "version": "1.3.0", 242 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 243 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 244 | }, 245 | "fast-deep-equal": { 246 | "version": "3.1.1", 247 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 248 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" 249 | }, 250 | "fast-json-stable-stringify": { 251 | "version": "2.1.0", 252 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 253 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 254 | }, 255 | "ffmpeg-static": { 256 | "version": "4.0.1", 257 | "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.0.1.tgz", 258 | "integrity": "sha512-tUGBiessDvslK6jfVpfrhm6NvXPrIOclSVsqI8FGx4uDPN6xvdH8mGghcZDOjXky65FjaRPcTu3y/8Ne6VXRtQ==", 259 | "requires": { 260 | "progress": "^2.0.3", 261 | "simple-get": "^3.1.0" 262 | } 263 | }, 264 | "forever-agent": { 265 | "version": "0.6.1", 266 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 267 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 268 | }, 269 | "form-data": { 270 | "version": "2.3.3", 271 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 272 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 273 | "requires": { 274 | "asynckit": "^0.4.0", 275 | "combined-stream": "^1.0.6", 276 | "mime-types": "^2.1.12" 277 | } 278 | }, 279 | "get-youtube-id": { 280 | "version": "1.0.1", 281 | "resolved": "https://registry.npmjs.org/get-youtube-id/-/get-youtube-id-1.0.1.tgz", 282 | "integrity": "sha512-5yidLzoLXbtw82a/Wb7LrajkGn29BM6JuLWeHyNfzOGp1weGyW4+7eMz6cP23+etqj27VlOFtq8fFFDMLq/FXQ==" 283 | }, 284 | "getpass": { 285 | "version": "0.1.7", 286 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 287 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 288 | "requires": { 289 | "assert-plus": "^1.0.0" 290 | } 291 | }, 292 | "har-schema": { 293 | "version": "2.0.0", 294 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 295 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 296 | }, 297 | "har-validator": { 298 | "version": "5.1.3", 299 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 300 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 301 | "requires": { 302 | "ajv": "^6.5.5", 303 | "har-schema": "^2.0.0" 304 | } 305 | }, 306 | "hawk": { 307 | "version": "3.1.3", 308 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 309 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", 310 | "requires": { 311 | "boom": "2.x.x", 312 | "cryptiles": "2.x.x", 313 | "hoek": "2.x.x", 314 | "sntp": "1.x.x" 315 | } 316 | }, 317 | "hoek": { 318 | "version": "2.16.3", 319 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 320 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" 321 | }, 322 | "html-entities": { 323 | "version": "1.2.1", 324 | "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", 325 | "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" 326 | }, 327 | "htmlparser2": { 328 | "version": "3.8.3", 329 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", 330 | "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", 331 | "requires": { 332 | "domelementtype": "1", 333 | "domhandler": "2.3", 334 | "domutils": "1.5", 335 | "entities": "1.0", 336 | "readable-stream": "1.1" 337 | }, 338 | "dependencies": { 339 | "domutils": { 340 | "version": "1.5.1", 341 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 342 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 343 | "requires": { 344 | "dom-serializer": "0", 345 | "domelementtype": "1" 346 | } 347 | }, 348 | "entities": { 349 | "version": "1.0.0", 350 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", 351 | "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" 352 | } 353 | } 354 | }, 355 | "http-signature": { 356 | "version": "1.2.0", 357 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 358 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 359 | "requires": { 360 | "assert-plus": "^1.0.0", 361 | "jsprim": "^1.2.2", 362 | "sshpk": "^1.7.0" 363 | } 364 | }, 365 | "inherits": { 366 | "version": "2.0.4", 367 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 368 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 369 | }, 370 | "is-typedarray": { 371 | "version": "1.0.0", 372 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 373 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 374 | }, 375 | "isarray": { 376 | "version": "0.0.1", 377 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 378 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 379 | }, 380 | "isstream": { 381 | "version": "0.1.2", 382 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 383 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 384 | }, 385 | "jsbn": { 386 | "version": "0.1.1", 387 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 388 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 389 | }, 390 | "json-schema": { 391 | "version": "0.2.3", 392 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 393 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 394 | }, 395 | "json-schema-traverse": { 396 | "version": "0.4.1", 397 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 398 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 399 | }, 400 | "json-stable-stringify": { 401 | "version": "1.0.1", 402 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 403 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 404 | "requires": { 405 | "jsonify": "~0.0.0" 406 | } 407 | }, 408 | "json-stringify-safe": { 409 | "version": "5.0.1", 410 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 411 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 412 | }, 413 | "jsonify": { 414 | "version": "0.0.0", 415 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 416 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 417 | }, 418 | "jsprim": { 419 | "version": "1.4.1", 420 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 421 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 422 | "requires": { 423 | "assert-plus": "1.0.0", 424 | "extsprintf": "1.3.0", 425 | "json-schema": "0.2.3", 426 | "verror": "1.10.0" 427 | } 428 | }, 429 | "lodash": { 430 | "version": "3.10.1", 431 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 432 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" 433 | }, 434 | "lodash.isfunction": { 435 | "version": "3.0.9", 436 | "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", 437 | "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" 438 | }, 439 | "long": { 440 | "version": "4.0.0", 441 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 442 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 443 | }, 444 | "m3u8stream": { 445 | "version": "0.6.4", 446 | "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.6.4.tgz", 447 | "integrity": "sha512-9WLF1VAtbVij03HWJKbVZ8L0orsoZiP53UljR5EwaDrozQFMsTGRDPe3PbzWV73He8a+j5H/hWZNoI2VkUSsiw==", 448 | "requires": { 449 | "miniget": "^1.6.1", 450 | "sax": "^1.2.4" 451 | } 452 | }, 453 | "mime-db": { 454 | "version": "1.40.0", 455 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 456 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 457 | }, 458 | "mime-types": { 459 | "version": "2.1.24", 460 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 461 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 462 | "requires": { 463 | "mime-db": "1.40.0" 464 | } 465 | }, 466 | "mimic-response": { 467 | "version": "2.0.0", 468 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.0.0.tgz", 469 | "integrity": "sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==" 470 | }, 471 | "miniget": { 472 | "version": "1.6.1", 473 | "resolved": "https://registry.npmjs.org/miniget/-/miniget-1.6.1.tgz", 474 | "integrity": "sha512-I5oBwZmcaOuJrjQn7lpS29HM+aAZDbzKbX5ouxVyhFYdg6fA6YKOTwOCgzZQwlHuMek3FlCxz6eNrd4pOXbwOA==" 475 | }, 476 | "ms": { 477 | "version": "2.0.0", 478 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 479 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 480 | }, 481 | "nth-check": { 482 | "version": "1.0.2", 483 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", 484 | "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", 485 | "requires": { 486 | "boolbase": "~1.0.0" 487 | } 488 | }, 489 | "oauth-sign": { 490 | "version": "0.9.0", 491 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 492 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 493 | }, 494 | "once": { 495 | "version": "1.4.0", 496 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 497 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 498 | "requires": { 499 | "wrappy": "1" 500 | } 501 | }, 502 | "opusscript": { 503 | "version": "0.0.7", 504 | "resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.7.tgz", 505 | "integrity": "sha512-DcBadTdYTUuH9zQtepsLjQn4Ll6rs3dmeFvN+SD0ThPnxRBRm/WC1zXWPg+wgAJimB784gdZvUMA57gDP7FdVg==" 506 | }, 507 | "performance-now": { 508 | "version": "2.1.0", 509 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 510 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 511 | }, 512 | "progress": { 513 | "version": "2.0.3", 514 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 515 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 516 | }, 517 | "psl": { 518 | "version": "1.4.0", 519 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", 520 | "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" 521 | }, 522 | "punycode": { 523 | "version": "2.1.1", 524 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 525 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 526 | }, 527 | "qs": { 528 | "version": "6.5.2", 529 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 530 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 531 | }, 532 | "readable-stream": { 533 | "version": "1.1.14", 534 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 535 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 536 | "requires": { 537 | "core-util-is": "~1.0.0", 538 | "inherits": "~2.0.1", 539 | "isarray": "0.0.1", 540 | "string_decoder": "~0.10.x" 541 | } 542 | }, 543 | "request": { 544 | "version": "2.88.0", 545 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 546 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 547 | "requires": { 548 | "aws-sign2": "~0.7.0", 549 | "aws4": "^1.8.0", 550 | "caseless": "~0.12.0", 551 | "combined-stream": "~1.0.6", 552 | "extend": "~3.0.2", 553 | "forever-agent": "~0.6.1", 554 | "form-data": "~2.3.2", 555 | "har-validator": "~5.1.0", 556 | "http-signature": "~1.2.0", 557 | "is-typedarray": "~1.0.0", 558 | "isstream": "~0.1.2", 559 | "json-stringify-safe": "~5.0.1", 560 | "mime-types": "~2.1.19", 561 | "oauth-sign": "~0.9.0", 562 | "performance-now": "^2.1.0", 563 | "qs": "~6.5.2", 564 | "safe-buffer": "^5.1.2", 565 | "tough-cookie": "~2.4.3", 566 | "tunnel-agent": "^0.6.0", 567 | "uuid": "^3.3.2" 568 | } 569 | }, 570 | "request-promise": { 571 | "version": "4.2.4", 572 | "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.4.tgz", 573 | "integrity": "sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg==", 574 | "requires": { 575 | "bluebird": "^3.5.0", 576 | "request-promise-core": "1.1.2", 577 | "stealthy-require": "^1.1.1", 578 | "tough-cookie": "^2.3.3" 579 | } 580 | }, 581 | "request-promise-core": { 582 | "version": "1.1.2", 583 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", 584 | "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", 585 | "requires": { 586 | "lodash": "^4.17.11" 587 | }, 588 | "dependencies": { 589 | "lodash": { 590 | "version": "4.17.15", 591 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 592 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 593 | } 594 | } 595 | }, 596 | "safe-buffer": { 597 | "version": "5.2.0", 598 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 599 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 600 | }, 601 | "safer-buffer": { 602 | "version": "2.1.2", 603 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 604 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 605 | }, 606 | "sax": { 607 | "version": "1.2.4", 608 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 609 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 610 | }, 611 | "simple-concat": { 612 | "version": "1.0.0", 613 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 614 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 615 | }, 616 | "simple-get": { 617 | "version": "3.1.0", 618 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 619 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 620 | "requires": { 621 | "decompress-response": "^4.2.0", 622 | "once": "^1.3.1", 623 | "simple-concat": "^1.0.0" 624 | } 625 | }, 626 | "snekfetch": { 627 | "version": "3.6.4", 628 | "resolved": "https://registry.npmjs.org/snekfetch/-/snekfetch-3.6.4.tgz", 629 | "integrity": "sha512-NjxjITIj04Ffqid5lqr7XdgwM7X61c/Dns073Ly170bPQHLm6jkmelye/eglS++1nfTWktpP6Y2bFXjdPlQqdw==" 630 | }, 631 | "sntp": { 632 | "version": "1.0.9", 633 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", 634 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", 635 | "requires": { 636 | "hoek": "2.x.x" 637 | } 638 | }, 639 | "sshpk": { 640 | "version": "1.16.1", 641 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 642 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 643 | "requires": { 644 | "asn1": "~0.2.3", 645 | "assert-plus": "^1.0.0", 646 | "bcrypt-pbkdf": "^1.0.0", 647 | "dashdash": "^1.12.0", 648 | "ecc-jsbn": "~0.1.1", 649 | "getpass": "^0.1.1", 650 | "jsbn": "~0.1.0", 651 | "safer-buffer": "^2.0.2", 652 | "tweetnacl": "~0.14.0" 653 | }, 654 | "dependencies": { 655 | "tweetnacl": { 656 | "version": "0.14.5", 657 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 658 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 659 | } 660 | } 661 | }, 662 | "stealthy-require": { 663 | "version": "1.1.1", 664 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 665 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 666 | }, 667 | "string_decoder": { 668 | "version": "0.10.31", 669 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 670 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 671 | }, 672 | "stringstream": { 673 | "version": "0.0.6", 674 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", 675 | "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" 676 | }, 677 | "tough-cookie": { 678 | "version": "2.4.3", 679 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 680 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 681 | "requires": { 682 | "psl": "^1.1.24", 683 | "punycode": "^1.4.1" 684 | }, 685 | "dependencies": { 686 | "punycode": { 687 | "version": "1.4.1", 688 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 689 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 690 | } 691 | } 692 | }, 693 | "tunnel-agent": { 694 | "version": "0.6.0", 695 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 696 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 697 | "requires": { 698 | "safe-buffer": "^5.0.1" 699 | } 700 | }, 701 | "tweetnacl": { 702 | "version": "1.0.2", 703 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.2.tgz", 704 | "integrity": "sha512-+8aPRjmXgf1VqvyxSlBUzKzeYqVS9Ai8vZ28g+mL7dNQl1jlUTCMDZnvNQdAS1xTywMkIXwJsfipsR/6s2+syw==" 705 | }, 706 | "uri-js": { 707 | "version": "4.2.2", 708 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 709 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 710 | "requires": { 711 | "punycode": "^2.1.0" 712 | } 713 | }, 714 | "uuid": { 715 | "version": "3.3.3", 716 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 717 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" 718 | }, 719 | "verror": { 720 | "version": "1.10.0", 721 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 722 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 723 | "requires": { 724 | "assert-plus": "^1.0.0", 725 | "core-util-is": "1.0.2", 726 | "extsprintf": "^1.2.0" 727 | } 728 | }, 729 | "wrappy": { 730 | "version": "1.0.2", 731 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 732 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 733 | }, 734 | "ws": { 735 | "version": "6.2.1", 736 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", 737 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", 738 | "requires": { 739 | "async-limiter": "~1.0.0" 740 | } 741 | }, 742 | "youtube-info": { 743 | "version": "1.3.2", 744 | "resolved": "https://registry.npmjs.org/youtube-info/-/youtube-info-1.3.2.tgz", 745 | "integrity": "sha512-LnBZxCuCof0bwFNtLSxklLYgaU1XR8OK+cGieWyPS10rn3P0TMHdIikRpO/W/duE9SR9JfzOk8ThgwDgx0B3Vw==", 746 | "requires": { 747 | "cheerio": "^0.19.0", 748 | "debug": "^2.2.0", 749 | "lodash.isfunction": "^3.0.6", 750 | "request": "2.81.0", 751 | "request-promise": "^4.2.2" 752 | }, 753 | "dependencies": { 754 | "ajv": { 755 | "version": "4.11.8", 756 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 757 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 758 | "requires": { 759 | "co": "^4.6.0", 760 | "json-stable-stringify": "^1.0.1" 761 | } 762 | }, 763 | "assert-plus": { 764 | "version": "0.2.0", 765 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", 766 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" 767 | }, 768 | "aws-sign2": { 769 | "version": "0.6.0", 770 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 771 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" 772 | }, 773 | "form-data": { 774 | "version": "2.1.4", 775 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", 776 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", 777 | "requires": { 778 | "asynckit": "^0.4.0", 779 | "combined-stream": "^1.0.5", 780 | "mime-types": "^2.1.12" 781 | } 782 | }, 783 | "har-schema": { 784 | "version": "1.0.5", 785 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", 786 | "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" 787 | }, 788 | "har-validator": { 789 | "version": "4.2.1", 790 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", 791 | "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", 792 | "requires": { 793 | "ajv": "^4.9.1", 794 | "har-schema": "^1.0.5" 795 | } 796 | }, 797 | "http-signature": { 798 | "version": "1.1.1", 799 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", 800 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", 801 | "requires": { 802 | "assert-plus": "^0.2.0", 803 | "jsprim": "^1.2.2", 804 | "sshpk": "^1.7.0" 805 | } 806 | }, 807 | "oauth-sign": { 808 | "version": "0.8.2", 809 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 810 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 811 | }, 812 | "performance-now": { 813 | "version": "0.2.0", 814 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", 815 | "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" 816 | }, 817 | "punycode": { 818 | "version": "1.4.1", 819 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 820 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 821 | }, 822 | "qs": { 823 | "version": "6.4.0", 824 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", 825 | "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" 826 | }, 827 | "request": { 828 | "version": "2.81.0", 829 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", 830 | "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", 831 | "requires": { 832 | "aws-sign2": "~0.6.0", 833 | "aws4": "^1.2.1", 834 | "caseless": "~0.12.0", 835 | "combined-stream": "~1.0.5", 836 | "extend": "~3.0.0", 837 | "forever-agent": "~0.6.1", 838 | "form-data": "~2.1.1", 839 | "har-validator": "~4.2.1", 840 | "hawk": "~3.1.3", 841 | "http-signature": "~1.1.0", 842 | "is-typedarray": "~1.0.0", 843 | "isstream": "~0.1.2", 844 | "json-stringify-safe": "~5.0.1", 845 | "mime-types": "~2.1.7", 846 | "oauth-sign": "~0.8.1", 847 | "performance-now": "^0.2.0", 848 | "qs": "~6.4.0", 849 | "safe-buffer": "^5.0.1", 850 | "stringstream": "~0.0.4", 851 | "tough-cookie": "~2.3.0", 852 | "tunnel-agent": "^0.6.0", 853 | "uuid": "^3.0.0" 854 | } 855 | }, 856 | "tough-cookie": { 857 | "version": "2.3.4", 858 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", 859 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", 860 | "requires": { 861 | "punycode": "^1.4.1" 862 | } 863 | } 864 | } 865 | }, 866 | "ytdl-core": { 867 | "version": "1.0.7", 868 | "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-1.0.7.tgz", 869 | "integrity": "sha512-gECPN5g5JnSy8hIq11xHIGe1T/Xzy0mWxQin3zhlJ3nG/YjPcEVEejrdd2XmA4Vv2Zw3+b1ZyDjmt37XfZri6A==", 870 | "requires": { 871 | "html-entities": "^1.1.3", 872 | "m3u8stream": "^0.6.3", 873 | "miniget": "^1.6.0", 874 | "sax": "^1.1.3" 875 | } 876 | } 877 | } 878 | } 879 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "yeezac", 3 | "version": "1.0.0", 4 | "description": "Bot de música para discord", 5 | "main": "index.js", 6 | "author": "Yizack Rangel", 7 | "dependencies": { 8 | "discord.js": "^11.5.1", 9 | "ffmpeg-static": "^4.0.1", 10 | "get-youtube-id": "^1.0.1", 11 | "opusscript": "0.0.7", 12 | "request": "^2.88.0", 13 | "youtube-info": "^1.3.2", 14 | "ytdl-core": "^1.0.7" 15 | } 16 | } 17 | --------------------------------------------------------------------------------