2018-12-30 01:20:24 +01:00
const { Command } = require ( 'discord-akairo' ) ;
2018-11-18 17:58:08 +01:00
const fs = require ( 'fs' ) ;
const youtubedl = require ( 'youtube-dl' ) ;
2019-01-19 17:23:45 +01:00
const hbjs = require ( 'handbrake-js' ) ;
2018-12-25 19:17:07 +01:00
2018-12-30 01:20:24 +01:00
class DownloadCommand extends Command {
2019-01-02 08:09:45 +01:00
constructor ( ) {
super ( 'download' , {
aliases : [ 'download' , 'dl' ] ,
category : 'utility' ,
args : [
{
id : 'link' ,
type : 'string' ,
2019-06-23 03:41:59 +02:00
prompt : {
start : 'Send the link of wich video you want to download' ,
}
2019-03-26 01:19:43 +01:00
} ,
{
id : 'alt' ,
2019-06-23 03:41:59 +02:00
match : 'flag' ,
flag : '--alt'
2019-07-11 00:31:15 +02:00
} ,
{
id : 'spoiler' ,
match : 'flag' ,
flag : [ '--spoil' , '--spoiler' , '-s' ]
2019-01-02 08:09:45 +01:00
}
] ,
clientPermissions : [ 'ATTACH_FILES' ] ,
description : {
2019-07-15 23:42:57 +02:00
content : 'Download videos from different website from the link you provided, use "-s" to make the vid a spoiler, use "--alt" to download from website that dosen\'t work otherwise (e.g: twitter)' ,
2019-01-02 08:09:45 +01:00
usage : '[link]' ,
examples : [ 'https://www.youtube.com/watch?v=6n3pFFPSlW4' ]
}
} ) ;
}
2018-11-18 17:58:08 +01:00
2019-01-02 08:09:45 +01:00
async exec ( message , args ) {
let link = args . link ;
2019-01-23 02:18:21 +01:00
let needCompress = false ;
2019-07-11 00:31:15 +02:00
let fileName ;
if ( args . spoiler ) {
fileName = 'SPOILER_video' ;
} else {
fileName = 'video' ;
}
2018-12-30 01:20:24 +01:00
2019-01-02 08:09:45 +01:00
if ( link . includes ( 'http' ) || link . includes ( 'www' ) ) {
2019-03-26 01:19:43 +01:00
if ( args . alt ) {
2019-04-08 00:34:33 +02:00
console . log ( 'alt download!' ) ;
2019-07-11 00:31:15 +02:00
if ( fs . existsSync ( ` ./ ${ fileName } .mp4 ` ) ) {
fs . unlink ( ` ./ ${ fileName } .mp4 ` , ( err ) => {
if ( err ) ;
} ) ;
}
return youtubedl . exec ( args . link , [ '-o' , ` ./ ${ fileName } .mp4 ` ] , { } , function ( err , output ) {
2019-04-08 00:34:33 +02:00
if ( err ) throw err ;
console . log ( output . join ( '\n' ) ) ;
message . delete ( ) ;
2019-07-11 00:31:15 +02:00
message . channel . send ( ` Downloaded by ${ message . author . username } ` , { files : [ ` ./ ${ fileName } .mp4 ` ] } )
. catch ( err => {
console . error ( err ) ;
return message . channel . send ( 'File too big' ) ;
} ) ;
2019-03-26 01:19:43 +01:00
} ) ;
}
2019-09-11 17:32:55 +02:00
let video = youtubedl ( link ) ;
2019-07-11 00:31:15 +02:00
video . pipe ( fs . createWriteStream ( ` ./ ${ fileName } .mp4 ` ) ) ;
2019-01-02 08:09:45 +01:00
video . on ( 'error' , function error ( err ) {
console . log ( 'error 2:' , err ) ;
message . channel . send ( 'An error has occured, I can\'t download from the link you provided.' ) ;
} ) ;
2019-03-24 18:07:18 +01:00
message . channel . send ( 'Downloading <a:loadingmin:527579785212329984>' ) . then ( msg => {
video . on ( 'end' , function ( ) {
msg . delete ( ) ;
} ) ;
} ) ;
2019-01-19 17:23:45 +01:00
video . on ( 'info' , function ( info ) {
2019-01-23 10:12:12 +01:00
let duration = info . duration ;
if ( duration ) {
duration = duration . replace ( /:/g , '' ) ;
if ( duration > 500 ) {
video . pause ( ) ;
video . unpipe ( ) ;
return message . channel . send ( 'Can\'t download video longer than 5 minutes' ) ;
}
2019-01-23 02:18:21 +01:00
}
2019-01-23 10:12:12 +01:00
2019-01-19 17:23:45 +01:00
console . log ( 'Download started' ) ;
2019-01-23 02:05:38 +01:00
console . log ( 'filename: ' + info . _filename ) ;
2019-01-19 17:23:45 +01:00
console . log ( 'size: ' + info . size ) ;
2019-01-23 02:18:21 +01:00
2019-01-19 17:23:45 +01:00
if ( info . size >= 8000000 ) {
2019-01-23 02:18:21 +01:00
needCompress = true ;
2019-01-19 17:23:45 +01:00
}
} ) ;
2019-01-02 08:09:45 +01:00
video . on ( 'end' , function ( ) {
2019-01-23 02:18:21 +01:00
if ( ! needCompress ) {
2019-01-19 17:23:45 +01:00
message . delete ( ) ;
2019-07-11 00:31:15 +02:00
return message . channel . send ( ` Downloaded by ${ message . author . username } ` , { files : [ ` ./ ${ fileName } .mp4 ` ] } )
. catch ( err => {
console . error ( err ) ;
return message . channel . send ( 'File too big' ) ;
} ) ;
2019-01-19 17:23:45 +01:00
}
2019-07-11 00:31:15 +02:00
2019-01-19 17:23:45 +01:00
const options = {
2019-07-11 00:31:15 +02:00
input : ` ${ fileName } .mp4 ` ,
output : ` ${ fileName } Ready.mp4 ` ,
2019-01-19 17:23:45 +01:00
preset : 'General/Gmail Small 10 Minutes 288p30'
} ;
2019-07-11 00:31:15 +02:00
2019-01-19 17:41:55 +01:00
//Compress vid if bigger than 8MB
2019-03-24 18:07:18 +01:00
let handbrake = hbjs . spawn ( options ) ;
handbrake . on ( 'start' , function ( ) {
message . channel . send ( 'Video bigger than 8MB compressing now <a:loadingmin:527579785212329984> (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!' ) . then ( msg => {
2019-07-11 00:31:15 +02:00
handbrake . on ( 'end' , async function ( ) {
await msg . delete ( ) ;
2019-03-24 18:07:18 +01:00
} ) ;
2019-01-19 17:23:45 +01:00
} ) ;
} ) ;
2019-03-24 18:07:18 +01:00
handbrake . on ( 'error' , err => {
console . error ( err ) ;
2019-07-11 00:31:15 +02:00
return message . channel . send ( 'An error has occured while compressing the video' ) ;
2019-03-24 18:07:18 +01:00
} ) ;
handbrake . on ( 'progress' , progress => {
console . log (
'Percent complete: %s, ETA: %s' ,
progress . percentComplete ,
progress . eta
) ;
} ) ;
handbrake . on ( 'end' , function ( ) {
message . delete ( ) ;
2019-07-11 00:31:15 +02:00
return message . channel . send ( ` Downloaded by ${ message . author . username } ` , { files : [ ` ./ ${ fileName } Ready.mp4 ` ] } )
. catch ( err => {
console . error ( err ) ;
return message . channel . send ( 'File too big' ) ;
} ) ;
2019-03-24 18:07:18 +01:00
} ) ;
2019-01-02 08:09:45 +01:00
} ) ;
} else {
2019-07-11 00:31:15 +02:00
return message . channel . send ( 'You need to input a valid link' ) ;
2019-01-02 08:09:45 +01:00
}
}
2018-12-30 01:20:24 +01:00
}
2018-11-18 17:58:08 +01:00
2018-12-30 01:20:24 +01:00
module . exports = DownloadCommand ;