lavalink-client 2.4.7 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/dist/cjs/structures/CustomSearches/BandCampSearch.js +3 -1
- package/dist/cjs/structures/LavalinkManagerStatics.js +7 -0
- package/dist/cjs/structures/Node.d.ts +0 -12
- package/dist/cjs/structures/Node.js +22 -45
- package/dist/cjs/structures/Player.js +3 -0
- package/dist/cjs/structures/Types/Player.d.ts +2 -0
- package/dist/cjs/structures/Types/Utils.d.ts +2 -2
- package/dist/cjs/structures/Utils.d.ts +1 -1
- package/dist/cjs/structures/Utils.js +1 -1
- package/dist/esm/structures/CustomSearches/BandCampSearch.js +3 -1
- package/dist/esm/structures/LavalinkManagerStatics.js +7 -0
- package/dist/esm/structures/Node.d.ts +0 -12
- package/dist/esm/structures/Node.js +22 -45
- package/dist/esm/structures/Player.js +3 -0
- package/dist/esm/structures/Types/Player.d.ts +2 -0
- package/dist/esm/structures/Types/Utils.d.ts +2 -2
- package/dist/esm/structures/Utils.d.ts +1 -1
- package/dist/esm/structures/Utils.js +1 -1
- package/dist/types/structures/Node.d.ts +0 -12
- package/dist/types/structures/Types/Player.d.ts +2 -0
- package/dist/types/structures/Types/Utils.d.ts +2 -2
- package/dist/types/structures/Utils.d.ts +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -819,3 +819,27 @@ if(previousTrack) {
|
|
|
819
819
|
- remove structuredClone so that it works in bun more stable
|
|
820
820
|
- Player Options Validation also allows single property objects
|
|
821
821
|
- Some typos were fixed
|
|
822
|
+
|
|
823
|
+
|
|
824
|
+
|
|
825
|
+
## **Version 2.5.0**
|
|
826
|
+
- Deps got updated
|
|
827
|
+
- Handling of parsing url got updated to use the URL object
|
|
828
|
+
- Flowerytts requests needs to be changed now:
|
|
829
|
+
|
|
830
|
+
```js
|
|
831
|
+
const query = "Hello World How are you?";
|
|
832
|
+
const voice = "Ava";
|
|
833
|
+
const speed = "1.0";
|
|
834
|
+
|
|
835
|
+
const fttsParams = new URLSearchParams();
|
|
836
|
+
if(voice) fttsParams.append("voice", voice);
|
|
837
|
+
if(speed) fttsParams.append("speed", speed);
|
|
838
|
+
|
|
839
|
+
const response = await player.search({
|
|
840
|
+
// For flowerytts you need to send a URL
|
|
841
|
+
// and if you want to add optiojns, this is how you add the params to the query..
|
|
842
|
+
query: `${encodeURI(query)}${fttsParams.size ? `?${fttsParams.toString()}` : ""}`,
|
|
843
|
+
source: "ftts"
|
|
844
|
+
}, interaction.user);
|
|
845
|
+
```
|
|
@@ -8,7 +8,9 @@ const bandCampSearch = async (player, query, requestUser) => {
|
|
|
8
8
|
console.log(`Lavalink-Client-Debug | SEARCHING | - ${query} on lavalink-client`);
|
|
9
9
|
player.LavalinkManager.utils.validateQueryString(player.node, query);
|
|
10
10
|
try {
|
|
11
|
-
const
|
|
11
|
+
const requestUrl = new URL("https://bandcamp.com/api/nusearch/2/autocomplete");
|
|
12
|
+
requestUrl.searchParams.append("q", query);
|
|
13
|
+
const data = await fetch(requestUrl.toString(), {
|
|
12
14
|
headers: {
|
|
13
15
|
'User-Agent': 'android-async-http/1.4.1 (http://loopj.com/android-async-http)',
|
|
14
16
|
'Cookie': '$Version=1'
|
|
@@ -39,11 +39,18 @@ exports.DefaultSources = {
|
|
|
39
39
|
"dz": "dzsearch",
|
|
40
40
|
"dzsearch": "dzsearch",
|
|
41
41
|
"dzisrc": "dzisrc",
|
|
42
|
+
"dzrec": "dzrec",
|
|
42
43
|
// yandexmusic
|
|
43
44
|
"yandex music": "ymsearch",
|
|
44
45
|
"yandexmusic": "ymsearch",
|
|
45
46
|
"yandex": "ymsearch",
|
|
46
47
|
"ymsearch": "ymsearch",
|
|
48
|
+
"ymrec": "ymrec",
|
|
49
|
+
// VK Music (lavasrc)
|
|
50
|
+
"vksearch": "vksearch",
|
|
51
|
+
"vkmusic": "vksearch",
|
|
52
|
+
"vk music": "vksearch",
|
|
53
|
+
"vkrec": "vkrec",
|
|
47
54
|
// speak PLUGIN
|
|
48
55
|
"speak": "speak",
|
|
49
56
|
"tts": "tts",
|
|
@@ -53,18 +53,6 @@ export declare class LavalinkNode {
|
|
|
53
53
|
* ```
|
|
54
54
|
*/
|
|
55
55
|
constructor(options: LavalinkNodeOptions, manager: NodeManager);
|
|
56
|
-
/**
|
|
57
|
-
* Parse url params correctly for lavalink requests, including support for urls and uris.
|
|
58
|
-
* @param url input url object
|
|
59
|
-
* @param extraQueryUrlParams UrlSearchParams to use in a encodedURI, useful for example for flowertts
|
|
60
|
-
* @returns the url as a valid string
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```ts
|
|
64
|
-
* player.node.getRequestingUrl(new URL(`http://localhost:2333/v4/loadtracks?identifier=Never gonna give you up`));
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
|
-
private getRequestingUrl;
|
|
68
56
|
/**
|
|
69
57
|
* Raw Request util function
|
|
70
58
|
* @param endpoint endpoint string
|
|
@@ -91,32 +91,6 @@ class LavalinkNode {
|
|
|
91
91
|
this.options.regions = (this.options.regions || []).map(a => a.toLowerCase());
|
|
92
92
|
Object.defineProperty(this, Utils_1.NodeSymbol, { configurable: true, value: true });
|
|
93
93
|
}
|
|
94
|
-
/**
|
|
95
|
-
* Parse url params correctly for lavalink requests, including support for urls and uris.
|
|
96
|
-
* @param url input url object
|
|
97
|
-
* @param extraQueryUrlParams UrlSearchParams to use in a encodedURI, useful for example for flowertts
|
|
98
|
-
* @returns the url as a valid string
|
|
99
|
-
*
|
|
100
|
-
* @example
|
|
101
|
-
* ```ts
|
|
102
|
-
* player.node.getRequestingUrl(new URL(`http://localhost:2333/v4/loadtracks?identifier=Never gonna give you up`));
|
|
103
|
-
* ```
|
|
104
|
-
*/
|
|
105
|
-
getRequestingUrl(url, extraQueryUrlParams) {
|
|
106
|
-
if (!url.searchParams.size)
|
|
107
|
-
return `${url.origin}${url.pathname}`;
|
|
108
|
-
const keysToAdd = [];
|
|
109
|
-
for (const [paramKey, paramValue] of url.searchParams.entries()) {
|
|
110
|
-
const decoded = decodeURIComponent(paramValue).trim(); // double decoding, once internally, a second time if decoded by provided user.
|
|
111
|
-
if (decoded.includes("://") && !/^https?:\/\//.test(decoded)) { // uri, but not url.
|
|
112
|
-
const [key, ...values] = decoded.split("://");
|
|
113
|
-
keysToAdd.push(`${paramKey}=${encodeURI(`${key}://${encodeURIComponent(values.join("://"))}${extraQueryUrlParams && extraQueryUrlParams?.size > 0 ? `?${extraQueryUrlParams.toString()}` : ""}`)}`);
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
keysToAdd.push(`${paramKey}=${encodeURIComponent(decoded)}`);
|
|
117
|
-
}
|
|
118
|
-
return `${url.origin}${url.pathname}?${keysToAdd.join("&")}`;
|
|
119
|
-
}
|
|
120
94
|
/**
|
|
121
95
|
* Raw Request util function
|
|
122
96
|
* @param endpoint endpoint string
|
|
@@ -131,7 +105,7 @@ class LavalinkNode {
|
|
|
131
105
|
*/
|
|
132
106
|
async rawRequest(endpoint, modify) {
|
|
133
107
|
const options = {
|
|
134
|
-
path: `/${this.version}/${endpoint.
|
|
108
|
+
path: `/${this.version}/${endpoint.startsWith("/") ? endpoint.slice(1) : endpoint}`,
|
|
135
109
|
method: "GET",
|
|
136
110
|
headers: {
|
|
137
111
|
"Authorization": this.options.authorization
|
|
@@ -141,7 +115,12 @@ class LavalinkNode {
|
|
|
141
115
|
modify?.(options);
|
|
142
116
|
const url = new URL(`${this.restAddress}${options.path}`);
|
|
143
117
|
url.searchParams.append("trace", "true");
|
|
144
|
-
|
|
118
|
+
if (options.extraQueryUrlParams && options.extraQueryUrlParams?.size > 0) {
|
|
119
|
+
for (const [paramKey, paramValue] of options.extraQueryUrlParams.entries()) {
|
|
120
|
+
url.searchParams.append(paramKey, paramValue);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const urlToUse = url.toString();
|
|
145
124
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
146
125
|
const { path, extraQueryUrlParams, ...fetchOptions } = options; // destructure fetch only options
|
|
147
126
|
const response = await fetch(urlToUse, fetchOptions);
|
|
@@ -180,20 +159,17 @@ class LavalinkNode {
|
|
|
180
159
|
if (["bcsearch", "bandcamp"].includes(Query.source) && !this.info.sourceManagers.includes("bandcamp")) {
|
|
181
160
|
throw new Error("Bandcamp Search only works on the player (lavaplayer version < 2.2.0!");
|
|
182
161
|
}
|
|
183
|
-
|
|
162
|
+
const requestUrl = new URL(`${this.restAddress}/loadtracks`);
|
|
184
163
|
if (/^https?:\/\//.test(Query.query) || ["http", "https", "link", "uri"].includes(Query.source)) { // if it's a link simply encode it
|
|
185
|
-
|
|
186
|
-
uri += url;
|
|
164
|
+
requestUrl.searchParams.append("identifier", Query.query);
|
|
187
165
|
}
|
|
188
166
|
else { // if not make a query out of it
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
uri += `//${encodeURIComponent(Query.query)}`;
|
|
193
|
-
else
|
|
194
|
-
uri += encodeURIComponent(Query.query);
|
|
167
|
+
const fttsPrefix = Query.source === "ftts" ? "//" : "";
|
|
168
|
+
const prefix = Query.source !== "local" ? `${Query.source}:${fttsPrefix}` : "";
|
|
169
|
+
requestUrl.searchParams.append("identifier", `${prefix}${Query.query}`);
|
|
195
170
|
}
|
|
196
|
-
const
|
|
171
|
+
const requestPathAndSearch = requestUrl.pathname + requestUrl.search;
|
|
172
|
+
const res = await this.request(requestPathAndSearch, (options) => {
|
|
197
173
|
if (typeof query === "object" && typeof query.extraQueryUrlParams?.size === "number" && query.extraQueryUrlParams?.size > 0) {
|
|
198
174
|
options.extraQueryUrlParams = query.extraQueryUrlParams;
|
|
199
175
|
}
|
|
@@ -221,7 +197,7 @@ class LavalinkNode {
|
|
|
221
197
|
thumbnail: (res.data.info?.artworkUrl) || (res.data.pluginInfo?.artworkUrl) || ((typeof res.data?.info?.selectedTrack !== "number" || res.data?.info?.selectedTrack === -1) ? null : resTracks[res.data?.info?.selectedTrack] ? (resTracks[res.data?.info?.selectedTrack]?.info?.artworkUrl || resTracks[res.data?.info?.selectedTrack]?.info?.pluginInfo?.artworkUrl) : null) || null,
|
|
222
198
|
uri: res.data.info?.url || res.data.info?.uri || res.data.info?.link || res.data.pluginInfo?.url || res.data.pluginInfo?.uri || res.data.pluginInfo?.link || null,
|
|
223
199
|
selectedTrack: typeof res.data?.info?.selectedTrack !== "number" || res.data?.info?.selectedTrack === -1 ? null : resTracks[res.data?.info?.selectedTrack] ? this.NodeManager.LavalinkManager.utils.buildTrack(resTracks[res.data?.info?.selectedTrack], requestUser) : null,
|
|
224
|
-
duration: resTracks.length ? resTracks.reduce((acc, cur) => acc + (cur?.info?.length || 0), 0) : 0,
|
|
200
|
+
duration: resTracks.length ? resTracks.reduce((acc, cur) => acc + (cur?.info?.duration || cur?.info?.length || 0), 0) : 0,
|
|
225
201
|
} : null,
|
|
226
202
|
tracks: (resTracks.length ? resTracks.map(t => this.NodeManager.LavalinkManager.utils.buildTrack(t, requestUser)) : [])
|
|
227
203
|
};
|
|
@@ -1090,7 +1066,7 @@ class LavalinkNode {
|
|
|
1090
1066
|
player.ping.ws = payload.state.ping >= 0 ? payload.state.ping : player.ping.ws <= 0 && player.connected ? null : player.ping.ws || 0;
|
|
1091
1067
|
if (!player.createdTimeStamp && payload.state.time)
|
|
1092
1068
|
player.createdTimeStamp = payload.state.time;
|
|
1093
|
-
if (player.filterManager.filterUpdatedState === true && ((player.queue.current?.info?.duration || 0) <= (player.LavalinkManager.options.advancedOptions.maxFilterFixDuration || 600_000) || (0, path_1.isAbsolute)(player.queue.current?.info?.uri))) {
|
|
1069
|
+
if (player.filterManager.filterUpdatedState === true && ((player.queue.current?.info?.duration || 0) <= (player.LavalinkManager.options.advancedOptions.maxFilterFixDuration || 600_000) || (player.queue.current?.info?.uri && (0, path_1.isAbsolute)(player.queue.current?.info?.uri)))) {
|
|
1094
1070
|
player.filterManager.filterUpdatedState = false;
|
|
1095
1071
|
if (this.NodeManager.LavalinkManager.options?.advancedOptions?.enableDebugEvents) {
|
|
1096
1072
|
this.NodeManager.LavalinkManager.emit("debug", Constants_1.DebugEvents.PlayerUpdateFilterFixApply, {
|
|
@@ -1336,22 +1312,22 @@ class LavalinkNode {
|
|
|
1336
1312
|
return;
|
|
1337
1313
|
}
|
|
1338
1314
|
/** @private util function for handling SponsorBlock Segmentloaded event */
|
|
1339
|
-
|
|
1315
|
+
SponsorBlockSegmentLoaded(player, track, payload) {
|
|
1340
1316
|
this.NodeManager.LavalinkManager.emit("SegmentsLoaded", player, track || this.getTrackOfPayload(payload), payload);
|
|
1341
1317
|
return;
|
|
1342
1318
|
}
|
|
1343
1319
|
/** @private util function for handling SponsorBlock SegmentSkipped event */
|
|
1344
|
-
|
|
1320
|
+
SponsorBlockSegmentSkipped(player, track, payload) {
|
|
1345
1321
|
this.NodeManager.LavalinkManager.emit("SegmentSkipped", player, track || this.getTrackOfPayload(payload), payload);
|
|
1346
1322
|
return;
|
|
1347
1323
|
}
|
|
1348
1324
|
/** @private util function for handling SponsorBlock Chaptersloaded event */
|
|
1349
|
-
|
|
1325
|
+
SponsorBlockChaptersLoaded(player, track, payload) {
|
|
1350
1326
|
this.NodeManager.LavalinkManager.emit("ChaptersLoaded", player, track || this.getTrackOfPayload(payload), payload);
|
|
1351
1327
|
return;
|
|
1352
1328
|
}
|
|
1353
1329
|
/** @private util function for handling SponsorBlock Chaptersstarted event */
|
|
1354
|
-
|
|
1330
|
+
SponsorBlockChapterStarted(player, track, payload) {
|
|
1355
1331
|
this.NodeManager.LavalinkManager.emit("ChapterStarted", player, track || this.getTrackOfPayload(payload), payload);
|
|
1356
1332
|
return;
|
|
1357
1333
|
}
|
|
@@ -1477,7 +1453,8 @@ class LavalinkNode {
|
|
|
1477
1453
|
if (player.queue.current) {
|
|
1478
1454
|
if (payload.type === "TrackEndEvent")
|
|
1479
1455
|
this.NodeManager.LavalinkManager.emit("trackEnd", player, track, payload);
|
|
1480
|
-
|
|
1456
|
+
if (this.NodeManager.LavalinkManager.options.autoSkip)
|
|
1457
|
+
return player.play({ noReplace: true, paused: false });
|
|
1481
1458
|
}
|
|
1482
1459
|
}
|
|
1483
1460
|
else {
|
|
@@ -74,6 +74,9 @@ class Player {
|
|
|
74
74
|
* @param LavalinkManager
|
|
75
75
|
*/
|
|
76
76
|
constructor(options, LavalinkManager) {
|
|
77
|
+
if (typeof options?.customData === "object")
|
|
78
|
+
for (const [key, value] of Object.entries(options.customData))
|
|
79
|
+
this.set(key, value);
|
|
77
80
|
this.options = options;
|
|
78
81
|
this.filterManager = new Filters_1.FilterManager(this);
|
|
79
82
|
this.LavalinkManager = LavalinkManager;
|
|
@@ -73,6 +73,8 @@ export interface PlayerOptions {
|
|
|
73
73
|
instaUpdateFiltersFix?: boolean;
|
|
74
74
|
/** If a volume should be applied via filters instead of lavalink-volume */
|
|
75
75
|
applyVolumeAsFilter?: boolean;
|
|
76
|
+
/** Custom Data for the player get/set datastorage */
|
|
77
|
+
customData?: anyObject;
|
|
76
78
|
}
|
|
77
79
|
export type anyObject = {
|
|
78
80
|
[key: string | number]: string | number | null | anyObject;
|
|
@@ -11,7 +11,7 @@ export type Opaque<T, K> = T & {
|
|
|
11
11
|
export type IntegerNumber = Opaque<number, 'Int'>;
|
|
12
12
|
/** Opqaue tyep for floatnumber */
|
|
13
13
|
export type FloatNumber = Opaque<number, 'Float'>;
|
|
14
|
-
export type LavaSrcSearchPlatformBase = "spsearch" | "sprec" | "amsearch" | "dzsearch" | "dzisrc" | "ymsearch";
|
|
14
|
+
export type LavaSrcSearchPlatformBase = "spsearch" | "sprec" | "amsearch" | "dzsearch" | "dzisrc" | "dzrec" | "ymsearch" | "ymrec" | "vksearch" | "vkrec";
|
|
15
15
|
export type LavaSrcSearchPlatform = LavaSrcSearchPlatformBase | "ftts";
|
|
16
16
|
export type JioSaavnSearchPlatform = "jssearch" | "jsrec";
|
|
17
17
|
export type DuncteSearchPlatform = "speak" | "phsearch" | "pornhub" | "porn" | "tts";
|
|
@@ -20,7 +20,7 @@ export type LavalinkClientSearchPlatformResolve = "bandcamp" | "bc";
|
|
|
20
20
|
export type LavalinkSearchPlatform = "ytsearch" | "ytmsearch" | "scsearch" | "bcsearch" | LavaSrcSearchPlatform | DuncteSearchPlatform | JioSaavnSearchPlatform | LavalinkClientSearchPlatform;
|
|
21
21
|
export type ClientCustomSearchPlatformUtils = "local" | "http" | "https" | "link" | "uri";
|
|
22
22
|
export type ClientSearchPlatform = ClientCustomSearchPlatformUtils | // for file/link requests
|
|
23
|
-
"youtube" | "yt" | "youtube music" | "youtubemusic" | "ytm" | "musicyoutube" | "music youtube" | "soundcloud" | "sc" | "am" | "apple music" | "applemusic" | "apple" | "musicapple" | "music apple" | "sp" | "spsuggestion" | "spotify" | "spotify.com" | "spotifycom" | "dz" | "deezer" | "yandex" | "yandex music" | "yandexmusic" | "flowerytts" | "flowery" | "flowery.tts" | LavalinkClientSearchPlatformResolve | LavalinkClientSearchPlatform | "js" | "jiosaavn";
|
|
23
|
+
"youtube" | "yt" | "youtube music" | "youtubemusic" | "ytm" | "musicyoutube" | "music youtube" | "soundcloud" | "sc" | "am" | "apple music" | "applemusic" | "apple" | "musicapple" | "music apple" | "sp" | "spsuggestion" | "spotify" | "spotify.com" | "spotifycom" | "dz" | "deezer" | "yandex" | "yandex music" | "yandexmusic" | "vk music" | "vkmusic" | "flowerytts" | "flowery" | "flowery.tts" | LavalinkClientSearchPlatformResolve | LavalinkClientSearchPlatform | "js" | "jiosaavn";
|
|
24
24
|
export type SearchPlatform = LavalinkSearchPlatform | ClientSearchPlatform;
|
|
25
25
|
export type SourcesRegex = "YoutubeRegex" | "YoutubeMusicRegex" | "SoundCloudRegex" | "SoundCloudMobileRegex" | "DeezerTrackRegex" | "DeezerArtistRegex" | "DeezerEpisodeRegex" | "DeezerMixesRegex" | "DeezerPageLinkRegex" | "DeezerPlaylistRegex" | "DeezerAlbumRegex" | "AllDeezerRegex" | "AllDeezerRegexWithoutPageLink" | "SpotifySongRegex" | "SpotifyPlaylistRegex" | "SpotifyArtistRegex" | "SpotifyEpisodeRegex" | "SpotifyShowRegex" | "SpotifyAlbumRegex" | "AllSpotifyRegex" | "mp3Url" | "m3uUrl" | "m3u8Url" | "mp4Url" | "m4aUrl" | "wavUrl" | "aacpUrl" | "tiktok" | "mixcloud" | "musicYandex" | "radiohost" | "bandcamp" | "jiosaavn" | "appleMusic" | "TwitchTv" | "vimeo";
|
|
26
26
|
export interface PlaylistInfo {
|
|
@@ -20,7 +20,7 @@ export declare function parseLavalinkConnUrl(connectionUrl: string): {
|
|
|
20
20
|
port: number;
|
|
21
21
|
};
|
|
22
22
|
export declare class ManagerUtils {
|
|
23
|
-
LavalinkManager: LavalinkManager |
|
|
23
|
+
LavalinkManager: LavalinkManager | undefined;
|
|
24
24
|
constructor(LavalinkManager?: LavalinkManager);
|
|
25
25
|
buildPluginInfo(data: any, clientData?: any): any;
|
|
26
26
|
buildTrack(data: LavalinkTrack | Track, requester: unknown): Track;
|
|
@@ -5,7 +5,9 @@ export const bandCampSearch = async (player, query, requestUser) => {
|
|
|
5
5
|
console.log(`Lavalink-Client-Debug | SEARCHING | - ${query} on lavalink-client`);
|
|
6
6
|
player.LavalinkManager.utils.validateQueryString(player.node, query);
|
|
7
7
|
try {
|
|
8
|
-
const
|
|
8
|
+
const requestUrl = new URL("https://bandcamp.com/api/nusearch/2/autocomplete");
|
|
9
|
+
requestUrl.searchParams.append("q", query);
|
|
10
|
+
const data = await fetch(requestUrl.toString(), {
|
|
9
11
|
headers: {
|
|
10
12
|
'User-Agent': 'android-async-http/1.4.1 (http://loopj.com/android-async-http)',
|
|
11
13
|
'Cookie': '$Version=1'
|
|
@@ -36,11 +36,18 @@ export const DefaultSources = {
|
|
|
36
36
|
"dz": "dzsearch",
|
|
37
37
|
"dzsearch": "dzsearch",
|
|
38
38
|
"dzisrc": "dzisrc",
|
|
39
|
+
"dzrec": "dzrec",
|
|
39
40
|
// yandexmusic
|
|
40
41
|
"yandex music": "ymsearch",
|
|
41
42
|
"yandexmusic": "ymsearch",
|
|
42
43
|
"yandex": "ymsearch",
|
|
43
44
|
"ymsearch": "ymsearch",
|
|
45
|
+
"ymrec": "ymrec",
|
|
46
|
+
// VK Music (lavasrc)
|
|
47
|
+
"vksearch": "vksearch",
|
|
48
|
+
"vkmusic": "vksearch",
|
|
49
|
+
"vk music": "vksearch",
|
|
50
|
+
"vkrec": "vkrec",
|
|
44
51
|
// speak PLUGIN
|
|
45
52
|
"speak": "speak",
|
|
46
53
|
"tts": "tts",
|
|
@@ -53,18 +53,6 @@ export declare class LavalinkNode {
|
|
|
53
53
|
* ```
|
|
54
54
|
*/
|
|
55
55
|
constructor(options: LavalinkNodeOptions, manager: NodeManager);
|
|
56
|
-
/**
|
|
57
|
-
* Parse url params correctly for lavalink requests, including support for urls and uris.
|
|
58
|
-
* @param url input url object
|
|
59
|
-
* @param extraQueryUrlParams UrlSearchParams to use in a encodedURI, useful for example for flowertts
|
|
60
|
-
* @returns the url as a valid string
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```ts
|
|
64
|
-
* player.node.getRequestingUrl(new URL(`http://localhost:2333/v4/loadtracks?identifier=Never gonna give you up`));
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
|
-
private getRequestingUrl;
|
|
68
56
|
/**
|
|
69
57
|
* Raw Request util function
|
|
70
58
|
* @param endpoint endpoint string
|
|
@@ -87,32 +87,6 @@ export class LavalinkNode {
|
|
|
87
87
|
this.options.regions = (this.options.regions || []).map(a => a.toLowerCase());
|
|
88
88
|
Object.defineProperty(this, NodeSymbol, { configurable: true, value: true });
|
|
89
89
|
}
|
|
90
|
-
/**
|
|
91
|
-
* Parse url params correctly for lavalink requests, including support for urls and uris.
|
|
92
|
-
* @param url input url object
|
|
93
|
-
* @param extraQueryUrlParams UrlSearchParams to use in a encodedURI, useful for example for flowertts
|
|
94
|
-
* @returns the url as a valid string
|
|
95
|
-
*
|
|
96
|
-
* @example
|
|
97
|
-
* ```ts
|
|
98
|
-
* player.node.getRequestingUrl(new URL(`http://localhost:2333/v4/loadtracks?identifier=Never gonna give you up`));
|
|
99
|
-
* ```
|
|
100
|
-
*/
|
|
101
|
-
getRequestingUrl(url, extraQueryUrlParams) {
|
|
102
|
-
if (!url.searchParams.size)
|
|
103
|
-
return `${url.origin}${url.pathname}`;
|
|
104
|
-
const keysToAdd = [];
|
|
105
|
-
for (const [paramKey, paramValue] of url.searchParams.entries()) {
|
|
106
|
-
const decoded = decodeURIComponent(paramValue).trim(); // double decoding, once internally, a second time if decoded by provided user.
|
|
107
|
-
if (decoded.includes("://") && !/^https?:\/\//.test(decoded)) { // uri, but not url.
|
|
108
|
-
const [key, ...values] = decoded.split("://");
|
|
109
|
-
keysToAdd.push(`${paramKey}=${encodeURI(`${key}://${encodeURIComponent(values.join("://"))}${extraQueryUrlParams && extraQueryUrlParams?.size > 0 ? `?${extraQueryUrlParams.toString()}` : ""}`)}`);
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
keysToAdd.push(`${paramKey}=${encodeURIComponent(decoded)}`);
|
|
113
|
-
}
|
|
114
|
-
return `${url.origin}${url.pathname}?${keysToAdd.join("&")}`;
|
|
115
|
-
}
|
|
116
90
|
/**
|
|
117
91
|
* Raw Request util function
|
|
118
92
|
* @param endpoint endpoint string
|
|
@@ -127,7 +101,7 @@ export class LavalinkNode {
|
|
|
127
101
|
*/
|
|
128
102
|
async rawRequest(endpoint, modify) {
|
|
129
103
|
const options = {
|
|
130
|
-
path: `/${this.version}/${endpoint.
|
|
104
|
+
path: `/${this.version}/${endpoint.startsWith("/") ? endpoint.slice(1) : endpoint}`,
|
|
131
105
|
method: "GET",
|
|
132
106
|
headers: {
|
|
133
107
|
"Authorization": this.options.authorization
|
|
@@ -137,7 +111,12 @@ export class LavalinkNode {
|
|
|
137
111
|
modify?.(options);
|
|
138
112
|
const url = new URL(`${this.restAddress}${options.path}`);
|
|
139
113
|
url.searchParams.append("trace", "true");
|
|
140
|
-
|
|
114
|
+
if (options.extraQueryUrlParams && options.extraQueryUrlParams?.size > 0) {
|
|
115
|
+
for (const [paramKey, paramValue] of options.extraQueryUrlParams.entries()) {
|
|
116
|
+
url.searchParams.append(paramKey, paramValue);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const urlToUse = url.toString();
|
|
141
120
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
142
121
|
const { path, extraQueryUrlParams, ...fetchOptions } = options; // destructure fetch only options
|
|
143
122
|
const response = await fetch(urlToUse, fetchOptions);
|
|
@@ -176,20 +155,17 @@ export class LavalinkNode {
|
|
|
176
155
|
if (["bcsearch", "bandcamp"].includes(Query.source) && !this.info.sourceManagers.includes("bandcamp")) {
|
|
177
156
|
throw new Error("Bandcamp Search only works on the player (lavaplayer version < 2.2.0!");
|
|
178
157
|
}
|
|
179
|
-
|
|
158
|
+
const requestUrl = new URL(`${this.restAddress}/loadtracks`);
|
|
180
159
|
if (/^https?:\/\//.test(Query.query) || ["http", "https", "link", "uri"].includes(Query.source)) { // if it's a link simply encode it
|
|
181
|
-
|
|
182
|
-
uri += url;
|
|
160
|
+
requestUrl.searchParams.append("identifier", Query.query);
|
|
183
161
|
}
|
|
184
162
|
else { // if not make a query out of it
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
uri += `//${encodeURIComponent(Query.query)}`;
|
|
189
|
-
else
|
|
190
|
-
uri += encodeURIComponent(Query.query);
|
|
163
|
+
const fttsPrefix = Query.source === "ftts" ? "//" : "";
|
|
164
|
+
const prefix = Query.source !== "local" ? `${Query.source}:${fttsPrefix}` : "";
|
|
165
|
+
requestUrl.searchParams.append("identifier", `${prefix}${Query.query}`);
|
|
191
166
|
}
|
|
192
|
-
const
|
|
167
|
+
const requestPathAndSearch = requestUrl.pathname + requestUrl.search;
|
|
168
|
+
const res = await this.request(requestPathAndSearch, (options) => {
|
|
193
169
|
if (typeof query === "object" && typeof query.extraQueryUrlParams?.size === "number" && query.extraQueryUrlParams?.size > 0) {
|
|
194
170
|
options.extraQueryUrlParams = query.extraQueryUrlParams;
|
|
195
171
|
}
|
|
@@ -217,7 +193,7 @@ export class LavalinkNode {
|
|
|
217
193
|
thumbnail: (res.data.info?.artworkUrl) || (res.data.pluginInfo?.artworkUrl) || ((typeof res.data?.info?.selectedTrack !== "number" || res.data?.info?.selectedTrack === -1) ? null : resTracks[res.data?.info?.selectedTrack] ? (resTracks[res.data?.info?.selectedTrack]?.info?.artworkUrl || resTracks[res.data?.info?.selectedTrack]?.info?.pluginInfo?.artworkUrl) : null) || null,
|
|
218
194
|
uri: res.data.info?.url || res.data.info?.uri || res.data.info?.link || res.data.pluginInfo?.url || res.data.pluginInfo?.uri || res.data.pluginInfo?.link || null,
|
|
219
195
|
selectedTrack: typeof res.data?.info?.selectedTrack !== "number" || res.data?.info?.selectedTrack === -1 ? null : resTracks[res.data?.info?.selectedTrack] ? this.NodeManager.LavalinkManager.utils.buildTrack(resTracks[res.data?.info?.selectedTrack], requestUser) : null,
|
|
220
|
-
duration: resTracks.length ? resTracks.reduce((acc, cur) => acc + (cur?.info?.length || 0), 0) : 0,
|
|
196
|
+
duration: resTracks.length ? resTracks.reduce((acc, cur) => acc + (cur?.info?.duration || cur?.info?.length || 0), 0) : 0,
|
|
221
197
|
} : null,
|
|
222
198
|
tracks: (resTracks.length ? resTracks.map(t => this.NodeManager.LavalinkManager.utils.buildTrack(t, requestUser)) : [])
|
|
223
199
|
};
|
|
@@ -1086,7 +1062,7 @@ export class LavalinkNode {
|
|
|
1086
1062
|
player.ping.ws = payload.state.ping >= 0 ? payload.state.ping : player.ping.ws <= 0 && player.connected ? null : player.ping.ws || 0;
|
|
1087
1063
|
if (!player.createdTimeStamp && payload.state.time)
|
|
1088
1064
|
player.createdTimeStamp = payload.state.time;
|
|
1089
|
-
if (player.filterManager.filterUpdatedState === true && ((player.queue.current?.info?.duration || 0) <= (player.LavalinkManager.options.advancedOptions.maxFilterFixDuration || 600_000) || isAbsolute(player.queue.current?.info?.uri))) {
|
|
1065
|
+
if (player.filterManager.filterUpdatedState === true && ((player.queue.current?.info?.duration || 0) <= (player.LavalinkManager.options.advancedOptions.maxFilterFixDuration || 600_000) || (player.queue.current?.info?.uri && isAbsolute(player.queue.current?.info?.uri)))) {
|
|
1090
1066
|
player.filterManager.filterUpdatedState = false;
|
|
1091
1067
|
if (this.NodeManager.LavalinkManager.options?.advancedOptions?.enableDebugEvents) {
|
|
1092
1068
|
this.NodeManager.LavalinkManager.emit("debug", DebugEvents.PlayerUpdateFilterFixApply, {
|
|
@@ -1332,22 +1308,22 @@ export class LavalinkNode {
|
|
|
1332
1308
|
return;
|
|
1333
1309
|
}
|
|
1334
1310
|
/** @private util function for handling SponsorBlock Segmentloaded event */
|
|
1335
|
-
|
|
1311
|
+
SponsorBlockSegmentLoaded(player, track, payload) {
|
|
1336
1312
|
this.NodeManager.LavalinkManager.emit("SegmentsLoaded", player, track || this.getTrackOfPayload(payload), payload);
|
|
1337
1313
|
return;
|
|
1338
1314
|
}
|
|
1339
1315
|
/** @private util function for handling SponsorBlock SegmentSkipped event */
|
|
1340
|
-
|
|
1316
|
+
SponsorBlockSegmentSkipped(player, track, payload) {
|
|
1341
1317
|
this.NodeManager.LavalinkManager.emit("SegmentSkipped", player, track || this.getTrackOfPayload(payload), payload);
|
|
1342
1318
|
return;
|
|
1343
1319
|
}
|
|
1344
1320
|
/** @private util function for handling SponsorBlock Chaptersloaded event */
|
|
1345
|
-
|
|
1321
|
+
SponsorBlockChaptersLoaded(player, track, payload) {
|
|
1346
1322
|
this.NodeManager.LavalinkManager.emit("ChaptersLoaded", player, track || this.getTrackOfPayload(payload), payload);
|
|
1347
1323
|
return;
|
|
1348
1324
|
}
|
|
1349
1325
|
/** @private util function for handling SponsorBlock Chaptersstarted event */
|
|
1350
|
-
|
|
1326
|
+
SponsorBlockChapterStarted(player, track, payload) {
|
|
1351
1327
|
this.NodeManager.LavalinkManager.emit("ChapterStarted", player, track || this.getTrackOfPayload(payload), payload);
|
|
1352
1328
|
return;
|
|
1353
1329
|
}
|
|
@@ -1473,7 +1449,8 @@ export class LavalinkNode {
|
|
|
1473
1449
|
if (player.queue.current) {
|
|
1474
1450
|
if (payload.type === "TrackEndEvent")
|
|
1475
1451
|
this.NodeManager.LavalinkManager.emit("trackEnd", player, track, payload);
|
|
1476
|
-
|
|
1452
|
+
if (this.NodeManager.LavalinkManager.options.autoSkip)
|
|
1453
|
+
return player.play({ noReplace: true, paused: false });
|
|
1477
1454
|
}
|
|
1478
1455
|
}
|
|
1479
1456
|
else {
|
|
@@ -71,6 +71,9 @@ export class Player {
|
|
|
71
71
|
* @param LavalinkManager
|
|
72
72
|
*/
|
|
73
73
|
constructor(options, LavalinkManager) {
|
|
74
|
+
if (typeof options?.customData === "object")
|
|
75
|
+
for (const [key, value] of Object.entries(options.customData))
|
|
76
|
+
this.set(key, value);
|
|
74
77
|
this.options = options;
|
|
75
78
|
this.filterManager = new FilterManager(this);
|
|
76
79
|
this.LavalinkManager = LavalinkManager;
|
|
@@ -73,6 +73,8 @@ export interface PlayerOptions {
|
|
|
73
73
|
instaUpdateFiltersFix?: boolean;
|
|
74
74
|
/** If a volume should be applied via filters instead of lavalink-volume */
|
|
75
75
|
applyVolumeAsFilter?: boolean;
|
|
76
|
+
/** Custom Data for the player get/set datastorage */
|
|
77
|
+
customData?: anyObject;
|
|
76
78
|
}
|
|
77
79
|
export type anyObject = {
|
|
78
80
|
[key: string | number]: string | number | null | anyObject;
|
|
@@ -11,7 +11,7 @@ export type Opaque<T, K> = T & {
|
|
|
11
11
|
export type IntegerNumber = Opaque<number, 'Int'>;
|
|
12
12
|
/** Opqaue tyep for floatnumber */
|
|
13
13
|
export type FloatNumber = Opaque<number, 'Float'>;
|
|
14
|
-
export type LavaSrcSearchPlatformBase = "spsearch" | "sprec" | "amsearch" | "dzsearch" | "dzisrc" | "ymsearch";
|
|
14
|
+
export type LavaSrcSearchPlatformBase = "spsearch" | "sprec" | "amsearch" | "dzsearch" | "dzisrc" | "dzrec" | "ymsearch" | "ymrec" | "vksearch" | "vkrec";
|
|
15
15
|
export type LavaSrcSearchPlatform = LavaSrcSearchPlatformBase | "ftts";
|
|
16
16
|
export type JioSaavnSearchPlatform = "jssearch" | "jsrec";
|
|
17
17
|
export type DuncteSearchPlatform = "speak" | "phsearch" | "pornhub" | "porn" | "tts";
|
|
@@ -20,7 +20,7 @@ export type LavalinkClientSearchPlatformResolve = "bandcamp" | "bc";
|
|
|
20
20
|
export type LavalinkSearchPlatform = "ytsearch" | "ytmsearch" | "scsearch" | "bcsearch" | LavaSrcSearchPlatform | DuncteSearchPlatform | JioSaavnSearchPlatform | LavalinkClientSearchPlatform;
|
|
21
21
|
export type ClientCustomSearchPlatformUtils = "local" | "http" | "https" | "link" | "uri";
|
|
22
22
|
export type ClientSearchPlatform = ClientCustomSearchPlatformUtils | // for file/link requests
|
|
23
|
-
"youtube" | "yt" | "youtube music" | "youtubemusic" | "ytm" | "musicyoutube" | "music youtube" | "soundcloud" | "sc" | "am" | "apple music" | "applemusic" | "apple" | "musicapple" | "music apple" | "sp" | "spsuggestion" | "spotify" | "spotify.com" | "spotifycom" | "dz" | "deezer" | "yandex" | "yandex music" | "yandexmusic" | "flowerytts" | "flowery" | "flowery.tts" | LavalinkClientSearchPlatformResolve | LavalinkClientSearchPlatform | "js" | "jiosaavn";
|
|
23
|
+
"youtube" | "yt" | "youtube music" | "youtubemusic" | "ytm" | "musicyoutube" | "music youtube" | "soundcloud" | "sc" | "am" | "apple music" | "applemusic" | "apple" | "musicapple" | "music apple" | "sp" | "spsuggestion" | "spotify" | "spotify.com" | "spotifycom" | "dz" | "deezer" | "yandex" | "yandex music" | "yandexmusic" | "vk music" | "vkmusic" | "flowerytts" | "flowery" | "flowery.tts" | LavalinkClientSearchPlatformResolve | LavalinkClientSearchPlatform | "js" | "jiosaavn";
|
|
24
24
|
export type SearchPlatform = LavalinkSearchPlatform | ClientSearchPlatform;
|
|
25
25
|
export type SourcesRegex = "YoutubeRegex" | "YoutubeMusicRegex" | "SoundCloudRegex" | "SoundCloudMobileRegex" | "DeezerTrackRegex" | "DeezerArtistRegex" | "DeezerEpisodeRegex" | "DeezerMixesRegex" | "DeezerPageLinkRegex" | "DeezerPlaylistRegex" | "DeezerAlbumRegex" | "AllDeezerRegex" | "AllDeezerRegexWithoutPageLink" | "SpotifySongRegex" | "SpotifyPlaylistRegex" | "SpotifyArtistRegex" | "SpotifyEpisodeRegex" | "SpotifyShowRegex" | "SpotifyAlbumRegex" | "AllSpotifyRegex" | "mp3Url" | "m3uUrl" | "m3u8Url" | "mp4Url" | "m4aUrl" | "wavUrl" | "aacpUrl" | "tiktok" | "mixcloud" | "musicYandex" | "radiohost" | "bandcamp" | "jiosaavn" | "appleMusic" | "TwitchTv" | "vimeo";
|
|
26
26
|
export interface PlaylistInfo {
|
|
@@ -20,7 +20,7 @@ export declare function parseLavalinkConnUrl(connectionUrl: string): {
|
|
|
20
20
|
port: number;
|
|
21
21
|
};
|
|
22
22
|
export declare class ManagerUtils {
|
|
23
|
-
LavalinkManager: LavalinkManager |
|
|
23
|
+
LavalinkManager: LavalinkManager | undefined;
|
|
24
24
|
constructor(LavalinkManager?: LavalinkManager);
|
|
25
25
|
buildPluginInfo(data: any, clientData?: any): any;
|
|
26
26
|
buildTrack(data: LavalinkTrack | Track, requester: unknown): Track;
|
|
@@ -53,18 +53,6 @@ export declare class LavalinkNode {
|
|
|
53
53
|
* ```
|
|
54
54
|
*/
|
|
55
55
|
constructor(options: LavalinkNodeOptions, manager: NodeManager);
|
|
56
|
-
/**
|
|
57
|
-
* Parse url params correctly for lavalink requests, including support for urls and uris.
|
|
58
|
-
* @param url input url object
|
|
59
|
-
* @param extraQueryUrlParams UrlSearchParams to use in a encodedURI, useful for example for flowertts
|
|
60
|
-
* @returns the url as a valid string
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```ts
|
|
64
|
-
* player.node.getRequestingUrl(new URL(`http://localhost:2333/v4/loadtracks?identifier=Never gonna give you up`));
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
|
-
private getRequestingUrl;
|
|
68
56
|
/**
|
|
69
57
|
* Raw Request util function
|
|
70
58
|
* @param endpoint endpoint string
|
|
@@ -73,6 +73,8 @@ export interface PlayerOptions {
|
|
|
73
73
|
instaUpdateFiltersFix?: boolean;
|
|
74
74
|
/** If a volume should be applied via filters instead of lavalink-volume */
|
|
75
75
|
applyVolumeAsFilter?: boolean;
|
|
76
|
+
/** Custom Data for the player get/set datastorage */
|
|
77
|
+
customData?: anyObject;
|
|
76
78
|
}
|
|
77
79
|
export type anyObject = {
|
|
78
80
|
[key: string | number]: string | number | null | anyObject;
|
|
@@ -11,7 +11,7 @@ export type Opaque<T, K> = T & {
|
|
|
11
11
|
export type IntegerNumber = Opaque<number, 'Int'>;
|
|
12
12
|
/** Opqaue tyep for floatnumber */
|
|
13
13
|
export type FloatNumber = Opaque<number, 'Float'>;
|
|
14
|
-
export type LavaSrcSearchPlatformBase = "spsearch" | "sprec" | "amsearch" | "dzsearch" | "dzisrc" | "ymsearch";
|
|
14
|
+
export type LavaSrcSearchPlatformBase = "spsearch" | "sprec" | "amsearch" | "dzsearch" | "dzisrc" | "dzrec" | "ymsearch" | "ymrec" | "vksearch" | "vkrec";
|
|
15
15
|
export type LavaSrcSearchPlatform = LavaSrcSearchPlatformBase | "ftts";
|
|
16
16
|
export type JioSaavnSearchPlatform = "jssearch" | "jsrec";
|
|
17
17
|
export type DuncteSearchPlatform = "speak" | "phsearch" | "pornhub" | "porn" | "tts";
|
|
@@ -20,7 +20,7 @@ export type LavalinkClientSearchPlatformResolve = "bandcamp" | "bc";
|
|
|
20
20
|
export type LavalinkSearchPlatform = "ytsearch" | "ytmsearch" | "scsearch" | "bcsearch" | LavaSrcSearchPlatform | DuncteSearchPlatform | JioSaavnSearchPlatform | LavalinkClientSearchPlatform;
|
|
21
21
|
export type ClientCustomSearchPlatformUtils = "local" | "http" | "https" | "link" | "uri";
|
|
22
22
|
export type ClientSearchPlatform = ClientCustomSearchPlatformUtils | // for file/link requests
|
|
23
|
-
"youtube" | "yt" | "youtube music" | "youtubemusic" | "ytm" | "musicyoutube" | "music youtube" | "soundcloud" | "sc" | "am" | "apple music" | "applemusic" | "apple" | "musicapple" | "music apple" | "sp" | "spsuggestion" | "spotify" | "spotify.com" | "spotifycom" | "dz" | "deezer" | "yandex" | "yandex music" | "yandexmusic" | "flowerytts" | "flowery" | "flowery.tts" | LavalinkClientSearchPlatformResolve | LavalinkClientSearchPlatform | "js" | "jiosaavn";
|
|
23
|
+
"youtube" | "yt" | "youtube music" | "youtubemusic" | "ytm" | "musicyoutube" | "music youtube" | "soundcloud" | "sc" | "am" | "apple music" | "applemusic" | "apple" | "musicapple" | "music apple" | "sp" | "spsuggestion" | "spotify" | "spotify.com" | "spotifycom" | "dz" | "deezer" | "yandex" | "yandex music" | "yandexmusic" | "vk music" | "vkmusic" | "flowerytts" | "flowery" | "flowery.tts" | LavalinkClientSearchPlatformResolve | LavalinkClientSearchPlatform | "js" | "jiosaavn";
|
|
24
24
|
export type SearchPlatform = LavalinkSearchPlatform | ClientSearchPlatform;
|
|
25
25
|
export type SourcesRegex = "YoutubeRegex" | "YoutubeMusicRegex" | "SoundCloudRegex" | "SoundCloudMobileRegex" | "DeezerTrackRegex" | "DeezerArtistRegex" | "DeezerEpisodeRegex" | "DeezerMixesRegex" | "DeezerPageLinkRegex" | "DeezerPlaylistRegex" | "DeezerAlbumRegex" | "AllDeezerRegex" | "AllDeezerRegexWithoutPageLink" | "SpotifySongRegex" | "SpotifyPlaylistRegex" | "SpotifyArtistRegex" | "SpotifyEpisodeRegex" | "SpotifyShowRegex" | "SpotifyAlbumRegex" | "AllSpotifyRegex" | "mp3Url" | "m3uUrl" | "m3u8Url" | "mp4Url" | "m4aUrl" | "wavUrl" | "aacpUrl" | "tiktok" | "mixcloud" | "musicYandex" | "radiohost" | "bandcamp" | "jiosaavn" | "appleMusic" | "TwitchTv" | "vimeo";
|
|
26
26
|
export interface PlaylistInfo {
|
|
@@ -20,7 +20,7 @@ export declare function parseLavalinkConnUrl(connectionUrl: string): {
|
|
|
20
20
|
port: number;
|
|
21
21
|
};
|
|
22
22
|
export declare class ManagerUtils {
|
|
23
|
-
LavalinkManager: LavalinkManager |
|
|
23
|
+
LavalinkManager: LavalinkManager | undefined;
|
|
24
24
|
constructor(LavalinkManager?: LavalinkManager);
|
|
25
25
|
buildPluginInfo(data: any, clientData?: any): any;
|
|
26
26
|
buildTrack(data: LavalinkTrack | Track, requester: unknown): Track;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lavalink-client",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "Easy, flexible and feature-rich lavalink@v4 Client. Both for Beginners and Proficients.",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -59,12 +59,12 @@
|
|
|
59
59
|
"homepage": "https://tomato6966.github.io/lavalink-client/",
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@eslint/eslintrc": "^3.2.0",
|
|
62
|
-
"@eslint/js": "^9.
|
|
63
|
-
"@types/node": "^22.
|
|
62
|
+
"@eslint/js": "^9.20.0",
|
|
63
|
+
"@types/node": "^22.13.4",
|
|
64
64
|
"@types/ws": "^8.5.14",
|
|
65
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
66
|
-
"@typescript-eslint/parser": "^8.
|
|
67
|
-
"eslint": "^9.
|
|
65
|
+
"@typescript-eslint/eslint-plugin": "^8.24.1",
|
|
66
|
+
"@typescript-eslint/parser": "^8.24.1",
|
|
67
|
+
"eslint": "^9.20.1",
|
|
68
68
|
"tsc-alias": "^1.8.10",
|
|
69
69
|
"typescript": "^5.7.3"
|
|
70
70
|
},
|