magmastream 2.10.3-alpha.7 → 2.10.3-alpha.9
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/dist/structures/Enums.d.ts +42 -2
- package/dist/structures/Enums.js +43 -2
- package/dist/structures/Filters.js +4 -2
- package/dist/structures/Manager.d.ts +3 -0
- package/dist/structures/Manager.js +56 -13
- package/dist/structures/Node.js +2 -0
- package/dist/structures/Types.d.ts +12 -5
- package/dist/structures/Utils.js +3 -0
- package/package.json +1 -1
|
@@ -73,9 +73,18 @@ export declare enum SearchPlatform {
|
|
|
73
73
|
YouTubeMusic = "ytmsearch"
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
|
-
* NodeLink
|
|
76
|
+
* NodeLink Search Platform Enum
|
|
77
77
|
*/
|
|
78
78
|
export declare enum NodeLinkSearchPlatform {
|
|
79
|
+
Unified = "search",
|
|
80
|
+
YouTube = "ytsearch",
|
|
81
|
+
YouTubeMusic = "ytmsearch",
|
|
82
|
+
SoundCloud = "scsearch",
|
|
83
|
+
Spotify = "spsearch",
|
|
84
|
+
AppleMusic = "amsearch",
|
|
85
|
+
Deezer = "dzsearch",
|
|
86
|
+
Tidal = "tdsearch",
|
|
87
|
+
Bandcamp = "bcsearch",
|
|
79
88
|
AmazonMusic = "amazonmusic",
|
|
80
89
|
AmazonMusicSearch = "azsearch",
|
|
81
90
|
Anghami = "agsearch",
|
|
@@ -85,14 +94,19 @@ export declare enum NodeLinkSearchPlatform {
|
|
|
85
94
|
Bilibili = "bilibili",
|
|
86
95
|
BilibiliSearch = "bilisearch",
|
|
87
96
|
Bluesky = "bksearch",
|
|
97
|
+
EternalBoxDirect = "eternalbox",
|
|
98
|
+
EternalBox = "ebox",
|
|
99
|
+
EternalBoxJukebox = "jukebox",
|
|
88
100
|
Flowery = "flowery",
|
|
89
101
|
FloweryTTS = "ftts",
|
|
90
102
|
Gaana = "gaanasearch",
|
|
91
103
|
GaanaSearch = "gnsearch",
|
|
92
104
|
GoogleDrive = "gdsearch",
|
|
93
105
|
GoogleTTS = "gtts",
|
|
106
|
+
GoogleTTSSpeak = "speak",
|
|
94
107
|
IHeartRadio = "iheartradio",
|
|
95
108
|
IHeartRadioSearch = "ihsearch",
|
|
109
|
+
Jiosaavn = "jssearch",
|
|
96
110
|
LastFM = "lfsearch",
|
|
97
111
|
LazyTTS = "lazypytts",
|
|
98
112
|
LazyTTSAlt = "lazytts",
|
|
@@ -104,9 +118,35 @@ export declare enum NodeLinkSearchPlatform {
|
|
|
104
118
|
NicoVideoSearch = "ncsearch",
|
|
105
119
|
Pandora = "pdsearch",
|
|
106
120
|
PiperTTS = "pipertts",
|
|
121
|
+
Qobuz = "qbsearch",
|
|
107
122
|
Shazam = "shsearch",
|
|
108
123
|
ShazamAlt = "szsearch",
|
|
109
|
-
SongLink = "slsearch"
|
|
124
|
+
SongLink = "slsearch",
|
|
125
|
+
VKMusic = "vksearch",
|
|
126
|
+
Yandex = "ymsearch"
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* NodeLink Search Type Modifier Enum
|
|
130
|
+
*/
|
|
131
|
+
export declare enum NodeLinkSearchType {
|
|
132
|
+
Track = "track",
|
|
133
|
+
Playlist = "playlist",
|
|
134
|
+
Album = "album",
|
|
135
|
+
Artist = "artist",
|
|
136
|
+
Channel = "channel",
|
|
137
|
+
User = "user",
|
|
138
|
+
Users = "users",
|
|
139
|
+
People = "people",
|
|
140
|
+
Tracks = "tracks",
|
|
141
|
+
Sounds = "sounds",
|
|
142
|
+
Sound = "sound",
|
|
143
|
+
Albums = "albums",
|
|
144
|
+
Playlists = "playlists",
|
|
145
|
+
Set = "set",
|
|
146
|
+
Sets = "sets",
|
|
147
|
+
All = "all",
|
|
148
|
+
Everything = "everything",
|
|
149
|
+
Video = "video"
|
|
110
150
|
}
|
|
111
151
|
/**
|
|
112
152
|
* Player State Event Types Enum
|
package/dist/structures/Enums.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MagmaStreamErrorNumbers = exports.MagmaStreamErrorCode = exports.AvailableFilters = exports.SponsorBlockSegment = exports.SeverityTypes = exports.TrackEndReasonTypes = exports.ManagerEventTypes = exports.TrackPartial = exports.UseNodeOptions = exports.TrackSourceTypes = exports.PlayerStateEventTypes = exports.NodeLinkSearchPlatform = exports.SearchPlatform = exports.LoadTypes = exports.StateTypes = exports.AutoPlayPlatform = exports.StateStorageType = void 0;
|
|
3
|
+
exports.MagmaStreamErrorNumbers = exports.MagmaStreamErrorCode = exports.AvailableFilters = exports.SponsorBlockSegment = exports.SeverityTypes = exports.TrackEndReasonTypes = exports.ManagerEventTypes = exports.TrackPartial = exports.UseNodeOptions = exports.TrackSourceTypes = exports.PlayerStateEventTypes = exports.NodeLinkSearchType = exports.NodeLinkSearchPlatform = exports.SearchPlatform = exports.LoadTypes = exports.StateTypes = exports.AutoPlayPlatform = exports.StateStorageType = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* State Storage Enum
|
|
6
6
|
*/
|
|
@@ -81,10 +81,19 @@ var SearchPlatform;
|
|
|
81
81
|
SearchPlatform["YouTubeMusic"] = "ytmsearch";
|
|
82
82
|
})(SearchPlatform || (exports.SearchPlatform = SearchPlatform = {}));
|
|
83
83
|
/**
|
|
84
|
-
* NodeLink
|
|
84
|
+
* NodeLink Search Platform Enum
|
|
85
85
|
*/
|
|
86
86
|
var NodeLinkSearchPlatform;
|
|
87
87
|
(function (NodeLinkSearchPlatform) {
|
|
88
|
+
NodeLinkSearchPlatform["Unified"] = "search";
|
|
89
|
+
NodeLinkSearchPlatform["YouTube"] = "ytsearch";
|
|
90
|
+
NodeLinkSearchPlatform["YouTubeMusic"] = "ytmsearch";
|
|
91
|
+
NodeLinkSearchPlatform["SoundCloud"] = "scsearch";
|
|
92
|
+
NodeLinkSearchPlatform["Spotify"] = "spsearch";
|
|
93
|
+
NodeLinkSearchPlatform["AppleMusic"] = "amsearch";
|
|
94
|
+
NodeLinkSearchPlatform["Deezer"] = "dzsearch";
|
|
95
|
+
NodeLinkSearchPlatform["Tidal"] = "tdsearch";
|
|
96
|
+
NodeLinkSearchPlatform["Bandcamp"] = "bcsearch";
|
|
88
97
|
NodeLinkSearchPlatform["AmazonMusic"] = "amazonmusic";
|
|
89
98
|
NodeLinkSearchPlatform["AmazonMusicSearch"] = "azsearch";
|
|
90
99
|
NodeLinkSearchPlatform["Anghami"] = "agsearch";
|
|
@@ -94,14 +103,19 @@ var NodeLinkSearchPlatform;
|
|
|
94
103
|
NodeLinkSearchPlatform["Bilibili"] = "bilibili";
|
|
95
104
|
NodeLinkSearchPlatform["BilibiliSearch"] = "bilisearch";
|
|
96
105
|
NodeLinkSearchPlatform["Bluesky"] = "bksearch";
|
|
106
|
+
NodeLinkSearchPlatform["EternalBoxDirect"] = "eternalbox";
|
|
107
|
+
NodeLinkSearchPlatform["EternalBox"] = "ebox";
|
|
108
|
+
NodeLinkSearchPlatform["EternalBoxJukebox"] = "jukebox";
|
|
97
109
|
NodeLinkSearchPlatform["Flowery"] = "flowery";
|
|
98
110
|
NodeLinkSearchPlatform["FloweryTTS"] = "ftts";
|
|
99
111
|
NodeLinkSearchPlatform["Gaana"] = "gaanasearch";
|
|
100
112
|
NodeLinkSearchPlatform["GaanaSearch"] = "gnsearch";
|
|
101
113
|
NodeLinkSearchPlatform["GoogleDrive"] = "gdsearch";
|
|
102
114
|
NodeLinkSearchPlatform["GoogleTTS"] = "gtts";
|
|
115
|
+
NodeLinkSearchPlatform["GoogleTTSSpeak"] = "speak";
|
|
103
116
|
NodeLinkSearchPlatform["IHeartRadio"] = "iheartradio";
|
|
104
117
|
NodeLinkSearchPlatform["IHeartRadioSearch"] = "ihsearch";
|
|
118
|
+
NodeLinkSearchPlatform["Jiosaavn"] = "jssearch";
|
|
105
119
|
NodeLinkSearchPlatform["LastFM"] = "lfsearch";
|
|
106
120
|
NodeLinkSearchPlatform["LazyTTS"] = "lazypytts";
|
|
107
121
|
NodeLinkSearchPlatform["LazyTTSAlt"] = "lazytts";
|
|
@@ -113,10 +127,37 @@ var NodeLinkSearchPlatform;
|
|
|
113
127
|
NodeLinkSearchPlatform["NicoVideoSearch"] = "ncsearch";
|
|
114
128
|
NodeLinkSearchPlatform["Pandora"] = "pdsearch";
|
|
115
129
|
NodeLinkSearchPlatform["PiperTTS"] = "pipertts";
|
|
130
|
+
NodeLinkSearchPlatform["Qobuz"] = "qbsearch";
|
|
116
131
|
NodeLinkSearchPlatform["Shazam"] = "shsearch";
|
|
117
132
|
NodeLinkSearchPlatform["ShazamAlt"] = "szsearch";
|
|
118
133
|
NodeLinkSearchPlatform["SongLink"] = "slsearch";
|
|
134
|
+
NodeLinkSearchPlatform["VKMusic"] = "vksearch";
|
|
135
|
+
NodeLinkSearchPlatform["Yandex"] = "ymsearch";
|
|
119
136
|
})(NodeLinkSearchPlatform || (exports.NodeLinkSearchPlatform = NodeLinkSearchPlatform = {}));
|
|
137
|
+
/**
|
|
138
|
+
* NodeLink Search Type Modifier Enum
|
|
139
|
+
*/
|
|
140
|
+
var NodeLinkSearchType;
|
|
141
|
+
(function (NodeLinkSearchType) {
|
|
142
|
+
NodeLinkSearchType["Track"] = "track";
|
|
143
|
+
NodeLinkSearchType["Playlist"] = "playlist";
|
|
144
|
+
NodeLinkSearchType["Album"] = "album";
|
|
145
|
+
NodeLinkSearchType["Artist"] = "artist";
|
|
146
|
+
NodeLinkSearchType["Channel"] = "channel";
|
|
147
|
+
NodeLinkSearchType["User"] = "user";
|
|
148
|
+
NodeLinkSearchType["Users"] = "users";
|
|
149
|
+
NodeLinkSearchType["People"] = "people";
|
|
150
|
+
NodeLinkSearchType["Tracks"] = "tracks";
|
|
151
|
+
NodeLinkSearchType["Sounds"] = "sounds";
|
|
152
|
+
NodeLinkSearchType["Sound"] = "sound";
|
|
153
|
+
NodeLinkSearchType["Albums"] = "albums";
|
|
154
|
+
NodeLinkSearchType["Playlists"] = "playlists";
|
|
155
|
+
NodeLinkSearchType["Set"] = "set";
|
|
156
|
+
NodeLinkSearchType["Sets"] = "sets";
|
|
157
|
+
NodeLinkSearchType["All"] = "all";
|
|
158
|
+
NodeLinkSearchType["Everything"] = "everything";
|
|
159
|
+
NodeLinkSearchType["Video"] = "video";
|
|
160
|
+
})(NodeLinkSearchType || (exports.NodeLinkSearchType = NodeLinkSearchType = {}));
|
|
120
161
|
/**
|
|
121
162
|
* Player State Event Types Enum
|
|
122
163
|
*/
|
|
@@ -80,7 +80,6 @@ class Filters {
|
|
|
80
80
|
distortion,
|
|
81
81
|
equalizer,
|
|
82
82
|
karaoke,
|
|
83
|
-
lowPass,
|
|
84
83
|
pluginFilters,
|
|
85
84
|
rotation,
|
|
86
85
|
timescale,
|
|
@@ -94,6 +93,7 @@ class Filters {
|
|
|
94
93
|
compressor,
|
|
95
94
|
echo,
|
|
96
95
|
flanger,
|
|
96
|
+
lowpass: lowPass,
|
|
97
97
|
highpass,
|
|
98
98
|
phaser,
|
|
99
99
|
phonograph,
|
|
@@ -101,7 +101,9 @@ class Filters {
|
|
|
101
101
|
spatial,
|
|
102
102
|
tape,
|
|
103
103
|
}
|
|
104
|
-
: {
|
|
104
|
+
: {
|
|
105
|
+
lowPass,
|
|
106
|
+
}),
|
|
105
107
|
};
|
|
106
108
|
try {
|
|
107
109
|
await this.player.node.rest.updatePlayer({
|
|
@@ -135,8 +135,11 @@ export declare class Manager extends EventEmitter {
|
|
|
135
135
|
* @returns A promise that resolves when the player states have been loaded.
|
|
136
136
|
*/
|
|
137
137
|
loadPlayerStates(nodeId: string): Promise<void>;
|
|
138
|
+
private normalizeSearchType;
|
|
139
|
+
private buildLoadTracksIdentifier;
|
|
138
140
|
private isNodeLinkSearchSource;
|
|
139
141
|
private isPrefixedLoadTracksIdentifier;
|
|
142
|
+
private hasNodeLinkSearchTypeModifier;
|
|
140
143
|
private requiresNodeLinkSearchNode;
|
|
141
144
|
private requiresLavalinkSearchNode;
|
|
142
145
|
private getSearchNode;
|
|
@@ -21,7 +21,10 @@ function escapeRegExp(value) {
|
|
|
21
21
|
}
|
|
22
22
|
const YOUTUBE_URL_PATTERN = /(youtube\.com|youtu\.be)/;
|
|
23
23
|
const BLOCKED_WORDS_PATTERN = new RegExp(`\\b(${blockedWords_1.blockedWords.map(escapeRegExp).join("|")})\\b`, "gi");
|
|
24
|
+
const PORTABLE_SEARCH_PREFIXES = new Set(Object.values(Enums_1.SearchPlatform).map((source) => source.toLowerCase()));
|
|
24
25
|
const NODELINK_SEARCH_PREFIXES = new Set(Object.values(Enums_1.NodeLinkSearchPlatform).map((source) => source.toLowerCase()));
|
|
26
|
+
const NODELINK_ONLY_SEARCH_PREFIXES = new Set([...NODELINK_SEARCH_PREFIXES].filter((source) => !PORTABLE_SEARCH_PREFIXES.has(source)));
|
|
27
|
+
const NODELINK_SEARCH_TYPE_MODIFIERS = new Set(Object.values(Enums_1.NodeLinkSearchType).map((type) => type.toLowerCase()));
|
|
25
28
|
const KNOWN_LOADTRACKS_PREFIXES = new Set([
|
|
26
29
|
...Object.values(Enums_1.SearchPlatform).map((source) => source.toLowerCase()),
|
|
27
30
|
...NODELINK_SEARCH_PREFIXES,
|
|
@@ -38,10 +41,15 @@ const KNOWN_LOADTRACKS_PREFIXES = new Set([
|
|
|
38
41
|
"lmrec",
|
|
39
42
|
]);
|
|
40
43
|
const NODELINK_ONLY_LOADTRACKS_PREFIXES = new Set(["ytrec", "jsrec", "lmrec"]);
|
|
44
|
+
const SEARCH_TYPE_PATTERN = /^[A-Za-z0-9]+$/;
|
|
41
45
|
function getIdentifierPrefix(identifier) {
|
|
42
46
|
const match = /^([A-Za-z0-9]+):/.exec(identifier);
|
|
43
47
|
return match?.[1]?.toLowerCase() ?? null;
|
|
44
48
|
}
|
|
49
|
+
function getIdentifierSearchType(identifier) {
|
|
50
|
+
const match = /^[A-Za-z0-9]+:([A-Za-z0-9]+):/.exec(identifier);
|
|
51
|
+
return match?.[1]?.toLowerCase() ?? null;
|
|
52
|
+
}
|
|
45
53
|
/**
|
|
46
54
|
* The main hub for interacting with Lavalink and using Magmastream.
|
|
47
55
|
*/
|
|
@@ -224,15 +232,16 @@ class Manager extends events_1.EventEmitter {
|
|
|
224
232
|
*/
|
|
225
233
|
async search(query, requester) {
|
|
226
234
|
const _query = typeof query === "string" ? { query } : query;
|
|
227
|
-
const _source = _query.source ?? this.options.defaultSearchPlatform;
|
|
235
|
+
const _source = _query.source ?? this.options.defaultSearchPlatform ?? Enums_1.SearchPlatform.YouTube;
|
|
228
236
|
const isUrl = /^https?:\/\//.test(_query.query);
|
|
229
237
|
const isPrefixedIdentifier = this.isPrefixedLoadTracksIdentifier(_query.query);
|
|
230
|
-
const
|
|
231
|
-
const
|
|
238
|
+
const searchType = this.normalizeSearchType(_query.searchType);
|
|
239
|
+
const search = this.buildLoadTracksIdentifier(_source, _query.query, searchType, isUrl, isPrefixedIdentifier);
|
|
240
|
+
const node = this.getSearchNode(_source, search, searchType);
|
|
232
241
|
if (!node) {
|
|
233
242
|
throw new MagmastreamError_1.MagmaStreamError({
|
|
234
243
|
code: Enums_1.MagmaStreamErrorCode.MANAGER_NO_NODES,
|
|
235
|
-
message: this.requiresNodeLinkSearchNode(_source, search)
|
|
244
|
+
message: this.requiresNodeLinkSearchNode(_source, search, searchType)
|
|
236
245
|
? "No available NodeLink nodes to perform the NodeLink-specific search."
|
|
237
246
|
: this.requiresLavalinkSearchNode(search)
|
|
238
247
|
? "No available Lavalink nodes to perform the Lavalink-specific search."
|
|
@@ -241,8 +250,8 @@ class Manager extends events_1.EventEmitter {
|
|
|
241
250
|
});
|
|
242
251
|
}
|
|
243
252
|
this.emit(Enums_1.ManagerEventTypes.Debug, isUrl || isPrefixedIdentifier
|
|
244
|
-
? `[MANAGER] Performing search on ${node.options.identifier} for: ${
|
|
245
|
-
: `[MANAGER] Performing ${_source} search on ${node.options.identifier} for: ${_query.query}`);
|
|
253
|
+
? `[MANAGER] Performing search on ${node.options.identifier} for: ${search}`
|
|
254
|
+
: `[MANAGER] Performing ${_source}${searchType ? `:${searchType}` : ""} search on ${node.options.identifier} for: ${_query.query}`);
|
|
246
255
|
try {
|
|
247
256
|
const lavalinkResponse = (await node.rest.get(`/v4/loadtracks?identifier=${encodeURIComponent(search)}`));
|
|
248
257
|
if (!lavalinkResponse) {
|
|
@@ -759,20 +768,54 @@ class Manager extends events_1.EventEmitter {
|
|
|
759
768
|
this.emit(Enums_1.ManagerEventTypes.Debug, "[MANAGER] Finished loading saved players.");
|
|
760
769
|
this.emit(Enums_1.ManagerEventTypes.RestoreComplete, node);
|
|
761
770
|
}
|
|
771
|
+
normalizeSearchType(searchType) {
|
|
772
|
+
if (searchType === undefined || searchType === null)
|
|
773
|
+
return null;
|
|
774
|
+
if (typeof searchType !== "string" || !SEARCH_TYPE_PATTERN.test(searchType)) {
|
|
775
|
+
throw new MagmastreamError_1.MagmaStreamError({
|
|
776
|
+
code: Enums_1.MagmaStreamErrorCode.MANAGER_SEARCH_FAILED,
|
|
777
|
+
message: 'Search option "searchType" must be an alphanumeric NodeLink search type modifier.',
|
|
778
|
+
context: { searchType },
|
|
779
|
+
});
|
|
780
|
+
}
|
|
781
|
+
return searchType.toLowerCase();
|
|
782
|
+
}
|
|
783
|
+
buildLoadTracksIdentifier(source, query, searchType, isUrl, isPrefixedIdentifier) {
|
|
784
|
+
if (isUrl)
|
|
785
|
+
return query;
|
|
786
|
+
if (isPrefixedIdentifier) {
|
|
787
|
+
if (!searchType || this.hasNodeLinkSearchTypeModifier(query))
|
|
788
|
+
return query;
|
|
789
|
+
const prefix = getIdentifierPrefix(query);
|
|
790
|
+
if (!prefix)
|
|
791
|
+
return query;
|
|
792
|
+
return `${prefix}:${searchType}:${query.slice(prefix.length + 1)}`;
|
|
793
|
+
}
|
|
794
|
+
return searchType ? `${source}:${searchType}:${query}` : `${source}:${query}`;
|
|
795
|
+
}
|
|
762
796
|
isNodeLinkSearchSource(source) {
|
|
763
|
-
return typeof source === "string" &&
|
|
797
|
+
return typeof source === "string" && NODELINK_ONLY_SEARCH_PREFIXES.has(source.toLowerCase());
|
|
764
798
|
}
|
|
765
799
|
isPrefixedLoadTracksIdentifier(identifier) {
|
|
766
800
|
const prefix = getIdentifierPrefix(identifier);
|
|
767
801
|
return prefix !== null && KNOWN_LOADTRACKS_PREFIXES.has(prefix);
|
|
768
802
|
}
|
|
769
|
-
|
|
803
|
+
hasNodeLinkSearchTypeModifier(identifier) {
|
|
804
|
+
const prefix = getIdentifierPrefix(identifier);
|
|
805
|
+
const searchType = getIdentifierSearchType(identifier);
|
|
806
|
+
return prefix !== null && searchType !== null && KNOWN_LOADTRACKS_PREFIXES.has(prefix) && NODELINK_SEARCH_TYPE_MODIFIERS.has(searchType);
|
|
807
|
+
}
|
|
808
|
+
requiresNodeLinkSearchNode(source, identifier, searchType) {
|
|
809
|
+
if (searchType)
|
|
810
|
+
return true;
|
|
770
811
|
if (this.isNodeLinkSearchSource(source))
|
|
771
812
|
return true;
|
|
772
813
|
const prefix = getIdentifierPrefix(identifier);
|
|
773
814
|
if (prefix === null)
|
|
774
815
|
return false;
|
|
775
|
-
if (
|
|
816
|
+
if (NODELINK_ONLY_SEARCH_PREFIXES.has(prefix) || NODELINK_ONLY_LOADTRACKS_PREFIXES.has(prefix))
|
|
817
|
+
return true;
|
|
818
|
+
if (this.hasNodeLinkSearchTypeModifier(identifier))
|
|
776
819
|
return true;
|
|
777
820
|
const normalizedIdentifier = identifier.toLowerCase();
|
|
778
821
|
return prefix === "sprec" && !normalizedIdentifier.startsWith("sprec:mix:");
|
|
@@ -780,13 +823,13 @@ class Manager extends events_1.EventEmitter {
|
|
|
780
823
|
requiresLavalinkSearchNode(identifier) {
|
|
781
824
|
return identifier.toLowerCase().startsWith("sprec:mix:");
|
|
782
825
|
}
|
|
783
|
-
getSearchNode(source, identifier) {
|
|
784
|
-
if (this.requiresNodeLinkSearchNode(source, identifier)) {
|
|
785
|
-
return this.getPreferredNode((node) => node.isNodeLink);
|
|
786
|
-
}
|
|
826
|
+
getSearchNode(source, identifier, searchType) {
|
|
787
827
|
if (this.requiresLavalinkSearchNode(identifier)) {
|
|
788
828
|
return this.getPreferredNode((node) => !node.isNodeLink);
|
|
789
829
|
}
|
|
830
|
+
if (this.requiresNodeLinkSearchNode(source, identifier, searchType)) {
|
|
831
|
+
return this.getPreferredNode((node) => node.isNodeLink);
|
|
832
|
+
}
|
|
790
833
|
return this.useableNode ?? null;
|
|
791
834
|
}
|
|
792
835
|
getPreferredNode(predicate) {
|
package/dist/structures/Node.js
CHANGED
|
@@ -569,9 +569,11 @@ class Node {
|
|
|
569
569
|
this.socketClosed(player, payload);
|
|
570
570
|
break;
|
|
571
571
|
case "SegmentsLoaded":
|
|
572
|
+
case "SponsorBlockSegmentsLoadedEvent":
|
|
572
573
|
this.sponsorBlockSegmentLoaded(player, track, payload);
|
|
573
574
|
break;
|
|
574
575
|
case "SegmentSkipped":
|
|
576
|
+
case "SponsorBlockSegmentSkippedEvent":
|
|
575
577
|
this.sponsorBlockSegmentSkipped(player, track, payload);
|
|
576
578
|
break;
|
|
577
579
|
case "ChaptersLoaded":
|
|
@@ -6,7 +6,7 @@ import type { User as SeyfertUser, ClientUser as SeyfertClientUser, Message as S
|
|
|
6
6
|
import { JsonQueue } from "../statestorage/JsonQueue";
|
|
7
7
|
import { MemoryQueue } from "../statestorage/MemoryQueue";
|
|
8
8
|
import { RedisQueue } from "../statestorage/RedisQueue";
|
|
9
|
-
import { AutoPlayPlatform, LoadTypes, ManagerEventTypes, NodeLinkSearchPlatform, PlayerStateEventTypes, SearchPlatform, SeverityTypes, StateStorageType, TrackEndReasonTypes, TrackPartial, TrackSourceTypes, UseNodeOptions } from "./Enums";
|
|
9
|
+
import { AutoPlayPlatform, LoadTypes, ManagerEventTypes, NodeLinkSearchPlatform, NodeLinkSearchType, PlayerStateEventTypes, SearchPlatform, SeverityTypes, StateStorageType, TrackEndReasonTypes, TrackPartial, TrackSourceTypes, UseNodeOptions } from "./Enums";
|
|
10
10
|
import { Node } from "./Node";
|
|
11
11
|
import { Player } from "./Player";
|
|
12
12
|
import { Plugin } from "./Plugin";
|
|
@@ -426,6 +426,12 @@ export interface TrackPluginInfo {
|
|
|
426
426
|
export interface SearchQuery {
|
|
427
427
|
/** The source to search from. */
|
|
428
428
|
source?: SearchSource;
|
|
429
|
+
/**
|
|
430
|
+
* NodeLink search type modifier.
|
|
431
|
+
*
|
|
432
|
+
* Builds identifiers like `ytsearch:playlist:query` and routes the search to a NodeLink node.
|
|
433
|
+
*/
|
|
434
|
+
searchType?: NodeLinkSearchType | string;
|
|
429
435
|
/** The query to search for. */
|
|
430
436
|
query: string;
|
|
431
437
|
}
|
|
@@ -798,7 +804,7 @@ export interface WebSocketClosedEvent extends PlayerEvent {
|
|
|
798
804
|
* SponsorBlockSegmentsLoaded interface
|
|
799
805
|
*/
|
|
800
806
|
export interface SponsorBlockSegmentsLoaded extends PlayerEvent {
|
|
801
|
-
type: "SegmentsLoaded";
|
|
807
|
+
type: "SegmentsLoaded" | "SponsorBlockSegmentsLoadedEvent";
|
|
802
808
|
segments: {
|
|
803
809
|
category: string;
|
|
804
810
|
start: number;
|
|
@@ -809,7 +815,7 @@ export interface SponsorBlockSegmentsLoaded extends PlayerEvent {
|
|
|
809
815
|
* SponsorBlockSegmentSkipped interface
|
|
810
816
|
*/
|
|
811
817
|
export interface SponsorBlockSegmentSkipped extends PlayerEvent {
|
|
812
|
-
type: "SegmentSkipped";
|
|
818
|
+
type: "SegmentSkipped" | "SponsorBlockSegmentSkippedEvent";
|
|
813
819
|
segment: {
|
|
814
820
|
category: string;
|
|
815
821
|
start: number;
|
|
@@ -1554,6 +1560,7 @@ export interface LavalinkFilters {
|
|
|
1554
1560
|
rotation?: RotationOptions | null;
|
|
1555
1561
|
channelMix?: ChannelMixOptions | null;
|
|
1556
1562
|
lowPass?: LowPassOptions | null;
|
|
1563
|
+
lowpass?: LowPassOptions | null;
|
|
1557
1564
|
highpass?: HighPassOptions | null;
|
|
1558
1565
|
echo?: EchoOptions | null;
|
|
1559
1566
|
reverb?: ReverbOptions | null;
|
|
@@ -1644,7 +1651,7 @@ export type TrackEndReason = keyof typeof TrackEndReasonTypes;
|
|
|
1644
1651
|
/**
|
|
1645
1652
|
* Player Event Type Enum type
|
|
1646
1653
|
*/
|
|
1647
|
-
export type PlayerEventType = "TrackStartEvent" | "TrackEndEvent" | "TrackExceptionEvent" | "TrackStuckEvent" | "MixStartedEvent" | "MixEndedEvent" | "WebSocketClosedEvent" | "SegmentSkipped" | "SegmentsLoaded" | "ChaptersLoaded" | "ChapterStarted" | "LyricsFoundEvent" | "LyricsNotFoundEvent" | "LyricsLineEvent";
|
|
1654
|
+
export type PlayerEventType = "TrackStartEvent" | "TrackEndEvent" | "TrackExceptionEvent" | "TrackStuckEvent" | "MixStartedEvent" | "MixEndedEvent" | "WebSocketClosedEvent" | "SegmentSkipped" | "SegmentsLoaded" | "SponsorBlockSegmentSkippedEvent" | "SponsorBlockSegmentsLoadedEvent" | "ChaptersLoaded" | "ChapterStarted" | "LyricsFoundEvent" | "LyricsNotFoundEvent" | "LyricsLineEvent";
|
|
1648
1655
|
/**
|
|
1649
1656
|
* Severity Types Enum type
|
|
1650
1657
|
*/
|
|
@@ -1656,7 +1663,7 @@ export type SponsorBlockSegmentEvents = SponsorBlockSegmentSkipped | SponsorBloc
|
|
|
1656
1663
|
/**
|
|
1657
1664
|
* SponsorBlock Segment Event Type Enum type
|
|
1658
1665
|
*/
|
|
1659
|
-
export type SponsorBlockSegmentEventType = "SegmentSkipped" | "SegmentsLoaded" | "ChapterStarted" | "ChaptersLoaded";
|
|
1666
|
+
export type SponsorBlockSegmentEventType = "SegmentSkipped" | "SegmentsLoaded" | "SponsorBlockSegmentSkippedEvent" | "SponsorBlockSegmentsLoadedEvent" | "ChapterStarted" | "ChaptersLoaded";
|
|
1660
1667
|
/**
|
|
1661
1668
|
* Player Events Enum type
|
|
1662
1669
|
*/
|
package/dist/structures/Utils.js
CHANGED
|
@@ -105,12 +105,15 @@ class TrackUtils {
|
|
|
105
105
|
bandcamp: "Bandcamp",
|
|
106
106
|
bilibili: "Bilibili",
|
|
107
107
|
deezer: "Deezer",
|
|
108
|
+
eternalbox: "EternalBox",
|
|
108
109
|
flowery: "Flowery",
|
|
109
110
|
gaana: "Gaana",
|
|
110
111
|
googledrive: "GoogleDrive",
|
|
111
112
|
googletts: "GoogleTTS",
|
|
113
|
+
iheartradio: "IHeartRadio",
|
|
112
114
|
jiosaavn: "Jiosaavn",
|
|
113
115
|
lastfm: "LastFM",
|
|
116
|
+
netease: "Netease",
|
|
114
117
|
soundcloud: "SoundCloud",
|
|
115
118
|
spotify: "Spotify",
|
|
116
119
|
tidal: "Tidal",
|