2021-02-19 02:40:31 +05:00
const ytsr = require ( 'youtube-sr' ) . default
2020-08-14 17:57:32 +05:00
const soundcloud = require ( 'soundcloud-scraper' )
2021-01-10 21:13:10 +05:00
const chalk = require ( 'chalk' )
2020-08-13 18:21:42 +05:00
const spotifySongRegex = ( /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:track\/|\?uri=spotify:track:)((\w|-){22})/ )
2021-01-10 20:38:28 +05:00
const spotifyPlaylistRegex = ( /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})/ )
const spotifyAlbumRegex = ( /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:album\/|\?uri=spotify:album:)((\w|-){22})/ )
2021-02-19 02:40:31 +05:00
const vimeoRegex = ( /(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)/ )
const facebookRegex = ( /(https?:\/\/)(www\.|m\.)?(facebook|fb).com\/.*\/videos\/.*/ )
const xvRegex = ( /(http|https):\/\/(.+)?xvideos.com\/(.+)\/(.+)/ )
2020-08-13 18:21:42 +05:00
module . exports = class Util {
constructor ( ) {
throw new Error ( ` The ${ this . constructor . name } class may not be instantiated. ` )
}
2021-01-10 21:13:10 +05:00
static checkFFMPEG ( ) {
try {
const prism = require ( 'prism-media' )
prism . FFmpeg . getInfo ( )
2021-02-19 02:40:31 +05:00
return true
} catch {
this . alertFFMPEG ( )
return false
2021-01-10 21:13:10 +05:00
}
}
static alertFFMPEG ( ) {
2021-02-19 02:40:31 +05:00
console . log ( chalk . red ( 'ERROR:' ) , 'FFMPEG is not installed. Install with "npm install ffmpeg-static" or download it here: https://ffmpeg.org/download.html.' )
2021-01-10 21:13:10 +05:00
}
2020-08-14 02:07:54 +05:00
static isVoiceEmpty ( channel ) {
return channel . members . filter ( ( member ) => ! member . user . bot ) . size === 0
}
2020-08-14 17:47:49 +05:00
static isSoundcloudLink ( query ) {
2020-08-14 17:57:32 +05:00
return soundcloud . validateURL ( query )
2020-08-14 17:47:49 +05:00
}
2020-08-13 18:21:42 +05:00
static isSpotifyLink ( query ) {
return spotifySongRegex . test ( query )
}
2021-01-10 20:38:28 +05:00
static isSpotifyPLLink ( query ) {
return spotifyPlaylistRegex . test ( query )
}
2021-02-19 02:40:31 +05:00
static isSpotifyAlbumLink ( query ) {
2021-01-10 20:38:28 +05:00
return spotifyAlbumRegex . test ( query )
}
2020-08-13 18:21:42 +05:00
static isYTPlaylistLink ( query ) {
2021-02-19 02:40:31 +05:00
return ytsr . validate ( query , 'PLAYLIST_ID' )
2020-08-13 18:21:42 +05:00
}
static isYTVideoLink ( query ) {
2021-01-03 16:01:24 +05:00
return ytsr . validate ( query , 'VIDEO' )
2020-08-13 18:21:42 +05:00
}
2021-02-19 02:40:31 +05:00
static isSoundcloudPlaylist ( query ) {
return Util . isSoundcloudLink ( query ) && query . includes ( '/sets/' )
}
static isVimeoLink ( query ) {
return vimeoRegex . test ( query )
}
static getVimeoID ( query ) {
return Util . isVimeoLink ( query ) ? query . split ( '/' ) . filter ( x => ! ! x ) . pop ( ) : null
}
static isFacebookLink ( query ) {
return facebookRegex . test ( query )
}
static isReverbnationLink ( query ) {
return /https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)/ . test ( query )
}
static isDiscordAttachment ( query ) {
return /https:\/\/cdn.discordapp.com\/attachments\/(\d{17,19})\/(\d{17,19})\/(.+)/ . test ( query )
}
static isXVLink ( query ) {
return xvRegex . test ( query )
}
static buildTimecode ( data ) {
const items = Object . keys ( data )
const required = [ 'days' , 'hours' , 'minutes' , 'seconds' ]
const parsed = items . filter ( x => required . includes ( x ) ) . map ( m => data [ m ] > 0 ? data [ m ] : '' )
const final = parsed . filter ( x => ! ! x ) . join ( ':' )
return final . length <= 3 ? ` 0: ${ final . length === 1 ? ` 0 ${ final } ` : final || 0 } ` : final
}
2020-08-13 18:21:42 +05:00
}