const { Command } = require('discord-akairo'); const fs = require('fs'); const youtubedl = require('youtube-dl'); const hbjs = require('handbrake-js'); const os = require('os'); const { MessageEmbed } = require('discord.js'); class DownloadCommand extends Command { constructor() { super('download', { aliases: ['download', 'dl'], category: 'utility', args: [ { id: 'link', type: 'string', prompt: { start: 'Send the link of wich video you want to download', } }, { id: 'caption', type: 'string', match: 'rest' }, { id: 'spoiler', match: 'flag', flag: ['--spoil', '--spoiler', '-s'] } ], clientPermissions: ['ATTACH_FILES'], description: { content: 'Download videos from different website from the link you provided, use "-s" to make the vid a spoiler', usage: '[link] [caption]', examples: ['https://www.youtube.com/watch?v=6n3pFFPSlW4 Look at this funny gnome'] } }); } async exec(message, args) { if (args.caption == null) args.caption = ''; let link = args.link; let fileName; if (args.spoiler) { fileName = `SPOILER_${message.author.id}_video`; } else { fileName = `${message.author.id}_video`; } if (link.includes('http') || link.includes('www')) { let loadingmsg = await message.channel.send('Downloading '); if (fs.existsSync(`${os.tmpdir()}/${fileName}.mp4`)) { fs.unlink(`${os.tmpdir()}/${fileName}.mp4`, (err) => { if (err); }); } return youtubedl.exec(link, ['--format=mp4', '-o', `${os.tmpdir()}/${fileName}.mp4`], {}, async function(err) { if (err) { console.error(err); loadingmsg.delete(); return message.channel.send('An error has occured, I can\'t download from the link you provided.'); } let file = fs.statSync(`${os.tmpdir()}/${fileName}.mp4`); let fileSize = file.size / 1000000.0; console.log(fileSize); //Compress vid if bigger than 8MB if (fileSize > 8) { console.log('file bigger than 8MB'); let compressmsg = await message.channel.send('Video bigger than 8MB compressing now (This can take a long time!)\nWant it to go faster? Donate to the dev with the donate command, so i can get a better server and do it faster!'); loadingmsg.delete(); const options = { input: `${os.tmpdir()}/${fileName}.mp4`, output: `${os.tmpdir()}/${fileName}compressed.mp4`, preset: 'General/Gmail Small 10 Minutes 288p30' }; let handbrake = hbjs.spawn(options); handbrake.on('error', err => { console.error(err); compressmsg.delete(); return message.channel.send('An error has occured while compressing the video'); }); handbrake.on('progress', progress => { console.log( 'Percent complete: %s, ETA: %s', progress.percentComplete, progress.eta ); }); handbrake.on('end', async function () { message.delete(); compressmsg.delete(); const Embed = new MessageEmbed() .setColor(message.member.displayHexColor) .setTitle(`Downloaded by ${message.author.username}`) .setDescription(args.caption) .setURL(link); return message.channel.send({embed: Embed, files: [`${os.tmpdir()}/${fileName}compressed.mp4`]}) .catch(err => { console.error(err); compressmsg.delete(); return message.channel.send('File too big'); }); }); } else { message.delete(); loadingmsg.delete(); const Embed = new MessageEmbed() .setColor(message.member.displayHexColor) .setTitle(`Downloaded by ${message.author.username}`) .setDescription(args.caption) .setURL(link); return message.channel.send({embed: Embed, files: [`${os.tmpdir()}/${fileName}.mp4`]}) .catch(err => { console.error(err); loadingmsg.delete(); return message.channel.send('File too big'); }); } }); } return message.channel.send('You need to input a valid link'); } } module.exports = DownloadCommand;