discord-portable-player
Version:
Easy to use, framework to facilitate music commands using discord.js
78 lines (77 loc) • 3.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.QueryResolver = void 0;
const ytdl_core_1 = require("ytdl-core");
const youtube_sr_1 = require("youtube-sr");
const types_1 = require("../types/types");
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const soundcloud_scraper_1 = require("soundcloud-scraper");
// scary things below *sigh*
const spotifySongRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:track\/|\?uri=spotify:track:)((\w|-){22})/;
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})/;
const vimeoRegex = /(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)/;
const facebookRegex = /(https?:\/\/)(www\.|m\.)?(facebook|fb).com\/.*\/videos\/.*/;
const reverbnationRegex = /https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)/;
const appleMusicTrack = /https?:\/\/music\.apple\.com\/.+?\/album\/.+?\/.+?\?i=([0-9]+)/;
const appleMusicPlaylist = /https?:\/\/music\.apple\.com\/.+?\/playlist\//;
const appleMusicAlbum = /https?:\/\/music\.apple\.com\/.+?\/album\//;
const attachmentRegex = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/;
// scary things above *sigh*
class QueryResolver {
/**
* Query resolver
*/
constructor() { } // eslint-disable-line @typescript-eslint/no-empty-function
/**
* Resolves the given search query
* @param {string} query The query
* @returns {QueryType}
*/
static resolve(query) {
if ((0, soundcloud_scraper_1.validateURL)(query, "track"))
return types_1.QueryType.SoundCloudTrack;
if ((0, soundcloud_scraper_1.validateURL)(query, "playlist") || query.includes("/sets/"))
return types_1.QueryType.SoundCloudPlaylist;
if (youtube_sr_1.YouTube.isPlaylist(query))
return types_1.QueryType.YouTubePlaylist;
if ((0, ytdl_core_1.validateID)(query) || (0, ytdl_core_1.validateURL)(query))
return types_1.QueryType.YouTubeVideo;
if (spotifySongRegex.test(query))
return types_1.QueryType.SpotifySong;
if (spotifyPlaylistRegex.test(query))
return types_1.QueryType.SpotifyPlaylist;
if (spotifyAlbumRegex.test(query))
return types_1.QueryType.SpotifyAlbum;
if (vimeoRegex.test(query))
return types_1.QueryType.Vimeo;
if (facebookRegex.test(query))
return types_1.QueryType.Facebook;
if (reverbnationRegex.test(query))
return types_1.QueryType.Reverbnation;
if (attachmentRegex.test(query))
return types_1.QueryType.Arbitrary;
if (appleMusicTrack.test(query))
return types_1.QueryType.AppleMusicTrack;
if (appleMusicPlaylist.test(query))
return types_1.QueryType.AppleMusicPlaylist;
if (appleMusicAlbum.test(query))
return types_1.QueryType.AppleMusicAlbum;
return types_1.QueryType.YouTubeSearch;
}
/**
* Parses vimeo id from url
* @param {string} query The query
* @returns {string}
*/
static getVimeoID(query) {
return QueryResolver.resolve(query) === types_1.QueryType.Vimeo
? query
.split("/")
.filter((x) => !!x)
.pop()
: null;
}
}
exports.QueryResolver = QueryResolver;