2019-10-27 22:32:30 +01:00
const { Command } = require ( 'discord-akairo' ) ;
const YTPGenerator = require ( 'ytpplus-node' ) ;
const os = require ( 'os' ) ;
const fs = require ( 'fs' ) ;
const youtubedl = require ( 'youtube-dl' ) ;
2019-10-27 23:03:54 +01:00
const { prefix } = require ( '../../config.json' ) ;
2019-10-27 22:32:30 +01:00
class ytpCommand extends Command {
constructor ( ) {
super ( 'ytp' , {
aliases : [ 'ytp' , 'ytpplus' , 'ytp+' ] ,
category : 'fun' ,
2019-11-09 12:04:01 +01:00
clientPermissions : [ 'SEND_MESSAGES' , 'ATTACH_FILES' ] ,
2019-10-27 22:32:30 +01:00
args : [
{
id : 'add' ,
match : 'flag' ,
flag : [ '--add' ]
} ,
2019-10-27 23:18:09 +01:00
{
id : 'pool' ,
match : 'flag' ,
flag : [ '--pool' ]
} ,
2019-10-27 23:50:33 +01:00
{
id : 'force' ,
match : 'flag' ,
flag : [ '--force' ]
} ,
2019-10-27 22:32:30 +01:00
{
id : 'link' ,
type : 'string'
}
] ,
description : {
2019-10-27 23:50:33 +01:00
content : 'Generate random ytp | --add with a link or attachment to add a video to the pool, only .mp4 work | --pool to see how many vid there is currently in the pool | --force to make the command work outside of nsfw channel BE AWARE THAT IT WON\'T CHANGE THE FINAL RESULT SO NSFW CAN STILL HAPPEN' ,
2019-10-27 22:32:30 +01:00
usage : '' ,
examples : [ '' ]
}
} ) ;
}
async exec ( message , args ) {
2019-10-28 14:24:40 +01:00
let MAX _CLIPS = 20 ;
2019-10-27 23:18:09 +01:00
if ( args . pool ) {
2019-10-28 14:24:40 +01:00
let mp4 = [ ] ;
fs . readdirSync ( './asset/ytp/userVid/' ) . forEach ( file => {
if ( file . endsWith ( 'mp4' ) ) {
mp4 . push ( file ) ;
}
} ) ;
2019-10-28 16:48:58 +01:00
return message . channel . send ( ` There is currently ${ mp4 . length } videos, you can add yours by doing \` \` ${ prefix [ 0 ] } ytp --add (link or attachment) \` \` ` ) ;
2019-10-27 23:18:09 +01:00
}
2019-10-27 22:32:30 +01:00
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 ;
}
2019-10-27 22:49:03 +01:00
2019-10-27 22:32:30 +01:00
if ( url ) {
2019-10-28 14:41:19 +01:00
return youtubedl . exec ( url , [ '--format=mp4' , '-o' , ` ./asset/ytp/userVid/ ${ message . id } .mp4 ` ] , { } , function ( err ) {
2019-10-27 22:32:30 +01:00
if ( err ) {
console . error ( err ) ;
loadingmsg . delete ( ) ;
2019-10-28 14:34:59 +01:00
return message . channel . send ( 'An error has occured, I can\'t download from the link you provided. Is it an mp4?' ) ;
2019-10-27 22:32:30 +01:00
} else {
2019-10-28 14:24:40 +01:00
let mp4 = [ ] ;
fs . readdirSync ( './asset/ytp/userVid/' ) . forEach ( file => {
if ( file . endsWith ( 'mp4' ) ) {
mp4 . push ( file ) ;
}
} ) ;
2019-10-27 22:51:38 +01:00
loadingmsg . delete ( ) ;
2019-10-28 14:24:40 +01:00
return message . reply ( ` Video sucessfully added to the pool! There is now ${ mp4 . length } videos ` ) ;
2019-10-27 22:32:30 +01:00
}
} ) ;
} else {
2019-10-27 22:51:38 +01:00
loadingmsg . delete ( ) ;
2019-10-27 22:32:30 +01:00
return message . channel . send ( 'You need a valid video link!' ) ;
}
2019-10-27 22:50:50 +01:00
}
2019-10-27 22:32:30 +01:00
2019-10-28 14:24:40 +01:00
2019-10-27 23:50:33 +01:00
if ( ! message . channel . nsfw && ! args . force ) 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 ) OR --force to make the command work outside of nsfw channel BE AWARE THAT IT WON\'T CHANGE THE FINAL RESULT SO NSFW CAN STILL HAPPEN' ) ;
2019-10-27 22:32:30 +01:00
2019-10-28 02:47:08 +01:00
// Read userVid folder and select random vid and only take .mp4
2019-10-28 14:24:40 +01:00
let mp4 = [ ] ;
2019-10-27 22:32:30 +01:00
let asset = [ ] ;
2019-10-28 02:47:08 +01:00
let files = fs . readdirSync ( './asset/ytp/userVid/' ) ;
2019-10-28 14:24:40 +01:00
// Count number of total vid
files . forEach ( file => {
if ( file . endsWith ( 'mp4' ) ) {
mp4 . push ( file ) ;
}
} ) ;
2019-10-30 18:08:10 +01:00
// Select random vid depending on the amount of MAX_CLIPS
2019-10-28 14:24:40 +01:00
for ( let i = 0 ; i < MAX _CLIPS ; i ++ ) {
2019-10-28 02:47:08 +01:00
let random = Math . floor ( Math . random ( ) * files . length ) ;
let vid = ` ./asset/ytp/userVid/ ${ files [ random ] } ` ;
2019-10-30 18:08:10 +01:00
if ( files [ random ] . endsWith ( 'mp4' ) ) {
2019-10-28 02:47:08 +01:00
if ( ! asset . includes ( vid ) ) {
asset . push ( vid ) ;
2019-10-27 22:32:30 +01:00
}
2019-10-28 02:47:08 +01:00
}
}
2019-10-27 22:32:30 +01:00
2019-10-28 14:24:40 +01:00
let loadingmsg = await message . channel . send ( ` Processing, this can take a **long** time, i'll ping you when i finished <a:loadingmin:527579785212329984> \n Some info: There is currently ${ mp4 . length } videos, you can add yours by doing \` \` ${ prefix [ 0 ] } ytp --add (link or attachment) \` \` ` ) ;
2019-10-28 02:47:08 +01:00
let options = {
2019-11-09 12:04:01 +01:00
debug : true , // Better set this to false to avoid flood in console
2019-10-28 16:43:44 +01:00
MAX _STREAM _DURATION : Math . floor ( ( Math . random ( ) * 3 ) + 1 ) , // Random duration of video clip
2019-10-28 02:47:08 +01:00
sources : './asset/ytp/sources/' ,
sounds : './asset/ytp/sounds/' ,
music : './asset/ytp/music/' ,
resources : './asset/ytp/resources/' ,
temp : os . tmpdir ( ) ,
sourceList : asset ,
2019-11-09 12:04:01 +01:00
//outro: './asset/ytp/outro.mp4', // Need an outro or it won't work
2019-10-28 02:47:08 +01:00
OUTPUT _FILE : ` ${ os . tmpdir ( ) } / ${ message . id } _YTP.mp4 ` ,
2019-10-28 14:24:40 +01:00
MAX _CLIPS : MAX _CLIPS ,
2019-10-28 02:47:08 +01:00
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 ,
2019-11-09 12:04:01 +01:00
effect _Squidward : true // Not yet implemented
2019-10-28 02:47:08 +01:00
}
} ;
2019-10-27 22:32:30 +01:00
2019-10-28 02:47:08 +01:00
new YTPGenerator ( ) . configurateAndGo ( options )
. then ( ( ) => {
loadingmsg . delete ( ) ;
return message . reply ( 'Here is your YTP!' , { files : [ ` ${ os . tmpdir ( ) } / ${ message . id } _YTP.mp4 ` ] } )
2019-11-09 12:04:01 +01:00
. catch ( err => {
console . error ( err ) ;
2019-10-28 02:47:08 +01:00
return message . channel . send ( 'Whoops, look like the vid might be too big for discord, my bad, please try again' ) ;
} ) ;
} )
. catch ( err => {
console . error ( err ) ;
loadingmsg . delete ( ) ;
return message . reply ( 'Oh no! An error has occured!' ) ;
} ) ;
2019-10-27 22:32:30 +01:00
}
}
module . exports = ytpCommand ;