UNPKG

magmastream

Version:

A user-friendly Lavalink client designed for NodeJS.

208 lines (207 loc) 8.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TrackSourceTypes = exports.SeverityTypes = exports.TrackEndReasonTypes = exports.StateTypes = exports.LoadTypes = exports.Structure = exports.TrackUtils = void 0; const Manager_1 = require("./Manager"); /** @hidden */ const SIZES = ["0", "1", "2", "3", "default", "mqdefault", "hqdefault", "maxresdefault"]; class TrackUtils { static trackPartial = null; static manager; /** * Initializes the TrackUtils class with the given manager. * @param manager The manager instance to use. * @hidden */ static init(manager) { // Set the manager instance for TrackUtils. this.manager = manager; } /** * Sets the partial properties for the Track class. If a Track has some of its properties removed by the partial, * it will be considered a partial Track. * @param {TrackPartial} partial The array of string property names to remove from the Track class. */ static setTrackPartial(partial) { if (!Array.isArray(partial) || !partial.every((str) => typeof str === "string")) throw new Error("Provided partial is not an array or not a string array."); const defaultProperties = [ Manager_1.TrackPartial.Track, Manager_1.TrackPartial.Title, Manager_1.TrackPartial.Identifier, Manager_1.TrackPartial.Author, Manager_1.TrackPartial.Duration, Manager_1.TrackPartial.Isrc, Manager_1.TrackPartial.IsSeekable, Manager_1.TrackPartial.IsStream, Manager_1.TrackPartial.Uri, Manager_1.TrackPartial.ArtworkUrl, Manager_1.TrackPartial.SourceName, Manager_1.TrackPartial.ThumbNail, Manager_1.TrackPartial.Requester, Manager_1.TrackPartial.PluginInfo, Manager_1.TrackPartial.CustomData, ]; /** The array of property names that will be removed from the Track class */ this.trackPartial = Array.from(new Set([...defaultProperties, ...partial])); /** Make sure that the "track" property is always included */ if (!this.trackPartial.includes(Manager_1.TrackPartial.Track)) this.trackPartial.unshift(Manager_1.TrackPartial.Track); } /** * Checks if the provided argument is a valid Track. * If provided an array then every element will be checked. * @param trackOrTracks The Track or array of Tracks to check. * @returns {boolean} Whether the provided argument is a valid Track. */ static validate(trackOrTracks) { if (typeof trackOrTracks !== "object" || trackOrTracks === null) { return false; } const isValidTrack = (track) => { if (typeof track !== "object" || track === null) { return false; } const t = track; return (typeof t.track === "string" && typeof t.title === "string" && typeof t.identifier === "string" && typeof t.isrc === "string" && typeof t.uri === "string"); }; if (Array.isArray(trackOrTracks)) { return trackOrTracks.every(isValidTrack); } return isValidTrack(trackOrTracks); } /** * Builds a Track from the raw data from Lavalink and a optional requester. * @param data The raw data from Lavalink to build the Track from. * @param requester The user who requested the track, if any. * @returns The built Track. */ static build(data, requester) { if (typeof data === "undefined") throw new RangeError('Argument "data" must be present.'); try { const sourceNameMap = { applemusic: "AppleMusic", bandcamp: "Bandcamp", deezer: "Deezer", jiosaavn: "Jiosaavn", soundcloud: "SoundCloud", spotify: "Spotify", tidal: "Tidal", youtube: "YouTube", vkmusic: "VKMusic", }; const track = { track: data.encoded, title: data.info.title, identifier: data.info.identifier, author: data.info.author, duration: data.info.length, isrc: data.info?.isrc, isSeekable: data.info.isSeekable, isStream: data.info.isStream, uri: data.info.uri, artworkUrl: data.info?.artworkUrl, sourceName: sourceNameMap[data.info?.sourceName?.toLowerCase() ?? ""] ?? data.info?.sourceName, thumbnail: data.info.uri.includes("youtube") ? `https://img.youtube.com/vi/${data.info.identifier}/default.jpg` : null, displayThumbnail(size = "default") { const finalSize = SIZES.find((s) => s === size) ?? "default"; return this.uri.includes("youtube") ? `https://img.youtube.com/vi/${data.info.identifier}/${finalSize}.jpg` : null; }, requester: requester, pluginInfo: data.pluginInfo, customData: {}, }; track.displayThumbnail = track.displayThumbnail.bind(track); if (this.trackPartial) { for (const key of Object.keys(track)) { if (this.trackPartial.includes(key)) continue; delete track[key]; } } return track; } catch (error) { throw new RangeError(`Argument "data" is not a valid track: ${error.message}`); } } } exports.TrackUtils = TrackUtils; /** Gets or extends structures to extend the built in, or already extended, classes to add more functionality. */ class Structure { /** * Extends a class. * @param name * @param extender */ static extend(name, extender) { if (!structures[name]) throw new TypeError(`"${name} is not a valid structure`); const extended = extender(structures[name]); structures[name] = extended; return extended; } /** * Get a structure from available structures by name. * @param name */ static get(name) { const structure = structures[name]; if (!structure) throw new TypeError('"structure" must be provided.'); return structure; } } exports.Structure = Structure; const structures = { Player: require("./Player").Player, Queue: require("./Queue").Queue, Node: require("./Node").Node, Filters: require("./Filters").Filters, Manager: require("./Manager").Manager, Plugin: require("./Plugin").Plugin, Rest: require("./Rest").Rest, Utils: require("./Utils"), }; var LoadTypes; (function (LoadTypes) { LoadTypes["Track"] = "track"; LoadTypes["Playlist"] = "playlist"; LoadTypes["Search"] = "search"; LoadTypes["Empty"] = "empty"; LoadTypes["Error"] = "error"; })(LoadTypes || (exports.LoadTypes = LoadTypes = {})); var StateTypes; (function (StateTypes) { StateTypes["Connected"] = "CONNECTED"; StateTypes["Connecting"] = "CONNECTING"; StateTypes["Disconnected"] = "DISCONNECTED"; StateTypes["Disconnecting"] = "DISCONNECTING"; StateTypes["Destroying"] = "DESTROYING"; })(StateTypes || (exports.StateTypes = StateTypes = {})); var TrackEndReasonTypes; (function (TrackEndReasonTypes) { TrackEndReasonTypes["Finished"] = "finished"; TrackEndReasonTypes["LoadFailed"] = "loadFailed"; TrackEndReasonTypes["Stopped"] = "stopped"; TrackEndReasonTypes["Replaced"] = "replaced"; TrackEndReasonTypes["Cleanup"] = "cleanup"; })(TrackEndReasonTypes || (exports.TrackEndReasonTypes = TrackEndReasonTypes = {})); var SeverityTypes; (function (SeverityTypes) { SeverityTypes["Common"] = "common"; SeverityTypes["Suspicious"] = "suspicious"; SeverityTypes["Fault"] = "fault"; })(SeverityTypes || (exports.SeverityTypes = SeverityTypes = {})); var TrackSourceTypes; (function (TrackSourceTypes) { TrackSourceTypes["AppleMusic"] = "applemusic"; TrackSourceTypes["Bandcamp"] = "bandcamp"; TrackSourceTypes["Deezer"] = "deezer"; TrackSourceTypes["Jiosaavn"] = "jiosaavn"; TrackSourceTypes["SoundCloud"] = "soundcloud"; TrackSourceTypes["Spotify"] = "spotify"; TrackSourceTypes["Tidal"] = "tidal"; TrackSourceTypes["VKMusic"] = "vkmusic"; TrackSourceTypes["YouTube"] = "youtube"; })(TrackSourceTypes || (exports.TrackSourceTypes = TrackSourceTypes = {}));