const { Command } = require ( 'discord-akairo' ) ;
const YTPGenerator = require ( 'ytpplus-node' ) ;
const os = require ( 'os' ) ;
const fs = require ( 'fs' ) ;
const youtubedl = require ( 'youtube-dl' ) ;
class ytpCommand extends Command {
constructor ( ) {
super ( 'ytp' , {
aliases : [ 'ytp' , 'ytpplus' , 'ytp+' ] ,
category : 'fun' ,
args : [
{
id : 'add' ,
match : 'flag' ,
flag : [ '--add' ]
} ,
{
id : 'link' ,
type : 'string'
}
] ,
description : {
content : 'Generate random ytp (--add with a link or attachment to add a video to the pool, only .mp4 work)' ,
usage : '' ,
examples : [ '' ]
}
} ) ;
}
async exec ( message , args ) {
if ( ! message . channel . nsfw ) return message . channel . send ( 'Please execute this command in an NSFW channel ( Content might not be NSFW but since the video are user submitted better safe than sorry )' ) ;
if ( args . add ) {
let loadingmsg = await message . channel . send ( 'Downloading <a:loadingmin:527579785212329984>' ) ;
let Attachment = ( message . attachments ) . array ( ) ;
let url = args . link ;
// Get attachment link
if ( Attachment [ 0 ] && ! args . link ) {
url = Attachment [ 0 ] . url ;
}
if ( url ) {
return youtubedl . exec ( url , [ '-o' , ` ./asset/ytp/userVid/ ${ message . id } .mp4 ` ] , { } , 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.' ) ;
} else {
return message . channel . send ( 'Video sucessfully added to the pool!' ) ;
}
} ) ;
} else {
return message . channel . send ( 'You need a valid video link!' ) ;
}
}
let loadingmsg = await message . channel . send ( 'Processing, this can take a **long** time <a:loadingmin:527579785212329984>' ) ;
// Read userVid folder and only take .mp4
let asset = [ ] ;
fs . readdir ( './asset/ytp/userVid/' , ( err , files ) => {
files . forEach ( file => {
if ( file . endsWith ( '.mp4' ) ) {
asset . push ( ` ./asset/ytp/userVid/ ${ file } ` ) ;
}
} ) ;
let options = {
debug : false , // Better set this to false to avoid flood in console
MIN _STREAM _DURATION : Math . floor ( ( Math . random ( ) * 2 ) + 1 ) , // Random duration of video clip
sources : './asset/ytp/sources/' ,
sounds : './asset/ytp/sounds/' ,
music : './asset/ytp/music/' ,
resources : './asset/ytp/resources/' ,
temp : os . tmpdir ( ) ,
sourceList : asset ,
outro : './asset/ytp/outro.mp4' , // Need an outro or it won't work
OUTPUT _FILE : ` ${ os . tmpdir ( ) } / ${ message . id } _YTP.mp4 ` ,
MAX _CLIPS : 20 ,
transitions : true ,
effects : {
effect _RandomSound : true ,
effect _RandomSoundMute : true ,
effect _Reverse : true ,
effect _Chorus : true ,
effect _Vibrato : true ,
effect _HighPitch : true ,
effect _LowPitch : true ,
effect _SpeedUp : true ,
effect _SlowDown : true ,
effect _Dance : true ,
effect _Squidward : false
}
} ;
new YTPGenerator ( ) . configurateAndGo ( options )
. then ( ( ) => {
loadingmsg . delete ( ) ;
return message . reply ( 'Here is your YTP!' , { files : [ ` ${ os . tmpdir ( ) } / ${ message . id } _YTP.mp4 ` ] } )
. catch ( ( ) => {
return message . channel . send ( 'Whoops, look like the vid might be too big for discord, my bad, please try again' ) ;
} ) ;
} )
. catch ( ( ) => {
loadingmsg . delete ( ) ;
return message . reply ( 'Oh no! An error has occured!' ) ;
} ) ;
} ) ;
}
}
module . exports = ytpCommand ;