discord-player 6.0.0-dev.3 → 6.0.0-dev.4
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/index.d.ts +198 -98
- package/dist/index.js +343 -176
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +303 -138
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -56,7 +56,6 @@ __export(src_exports, {
|
|
|
56
56
|
BASS_EQ_BANDS: () => import_equalizer3.BASS_EQ_BANDS,
|
|
57
57
|
BaseExtractor: () => BaseExtractor,
|
|
58
58
|
BiquadFilterType: () => import_equalizer3.FilterType,
|
|
59
|
-
BiquadFilters: () => import_equalizer3.BiquadFilters,
|
|
60
59
|
DiscordPlayerQueryResultCache: () => DiscordPlayerQueryResultCache,
|
|
61
60
|
EqualizerConfigurationPreset: () => EqualizerConfigurationPreset,
|
|
62
61
|
ErrorStatusCode: () => ErrorStatusCode,
|
|
@@ -72,9 +71,9 @@ __export(src_exports, {
|
|
|
72
71
|
GuildQueueHistory: () => GuildQueueHistory,
|
|
73
72
|
GuildQueuePlayerNode: () => GuildQueuePlayerNode,
|
|
74
73
|
PCMAudioFilters: () => import_equalizer3.AudioFilters,
|
|
75
|
-
PCMFilters: () => import_equalizer3.PCMFilters,
|
|
76
74
|
Player: () => Player,
|
|
77
75
|
PlayerError: () => PlayerError,
|
|
76
|
+
PlayerEventsEmitter: () => PlayerEventsEmitter,
|
|
78
77
|
Playlist: () => Playlist,
|
|
79
78
|
Q_BUTTERWORTH: () => import_equalizer3.Q_BUTTERWORTH,
|
|
80
79
|
QueryCache: () => QueryCache,
|
|
@@ -84,6 +83,7 @@ __export(src_exports, {
|
|
|
84
83
|
StreamDispatcher: () => StreamDispatcher,
|
|
85
84
|
Track: () => Track,
|
|
86
85
|
Util: () => Util,
|
|
86
|
+
VoiceReceiverNode: () => VoiceReceiverNode,
|
|
87
87
|
VoiceUtils: () => VoiceUtils,
|
|
88
88
|
VolumeTransformer: () => import_equalizer3.VolumeTransformer,
|
|
89
89
|
createFFmpegStream: () => createFFmpegStream,
|
|
@@ -92,6 +92,108 @@ __export(src_exports, {
|
|
|
92
92
|
module.exports = __toCommonJS(src_exports);
|
|
93
93
|
var import_discord4 = require("discord.js");
|
|
94
94
|
|
|
95
|
+
// src/utils/PlayerEventsEmitter.ts
|
|
96
|
+
var import_utils = require("@discord-player/utils");
|
|
97
|
+
|
|
98
|
+
// src/utils/Util.ts
|
|
99
|
+
var import_promises = require("timers/promises");
|
|
100
|
+
var Util = class {
|
|
101
|
+
constructor() {
|
|
102
|
+
}
|
|
103
|
+
static durationString(durObj) {
|
|
104
|
+
return Object.values(durObj).map((m) => isNaN(m) ? 0 : m).join(":");
|
|
105
|
+
}
|
|
106
|
+
static parseMS(milliseconds) {
|
|
107
|
+
if (isNaN(milliseconds))
|
|
108
|
+
milliseconds = 0;
|
|
109
|
+
const round = milliseconds > 0 ? Math.floor : Math.ceil;
|
|
110
|
+
return {
|
|
111
|
+
days: round(milliseconds / 864e5),
|
|
112
|
+
hours: round(milliseconds / 36e5) % 24,
|
|
113
|
+
minutes: round(milliseconds / 6e4) % 60,
|
|
114
|
+
seconds: round(milliseconds / 1e3) % 60
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
static buildTimeCode(duration) {
|
|
118
|
+
const items = Object.keys(duration);
|
|
119
|
+
const required = ["days", "hours", "minutes", "seconds"];
|
|
120
|
+
const parsed = items.filter((x) => required.includes(x)).map((m) => duration[m]);
|
|
121
|
+
const final = parsed.slice(parsed.findIndex((x) => x !== 0)).map((x) => x.toString().padStart(2, "0")).join(":");
|
|
122
|
+
return final.length <= 3 ? `0:${final.padStart(2, "0") || 0}` : final;
|
|
123
|
+
}
|
|
124
|
+
static last(arr) {
|
|
125
|
+
if (!Array.isArray(arr))
|
|
126
|
+
return arr;
|
|
127
|
+
return arr[arr.length - 1];
|
|
128
|
+
}
|
|
129
|
+
static isVoiceEmpty(channel) {
|
|
130
|
+
return channel && channel.members.filter((member) => !member.user.bot).size === 0;
|
|
131
|
+
}
|
|
132
|
+
static require(id) {
|
|
133
|
+
try {
|
|
134
|
+
return { module: require(id), error: null };
|
|
135
|
+
} catch (error) {
|
|
136
|
+
return { module: null, error };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
static async import(id) {
|
|
140
|
+
try {
|
|
141
|
+
const mod = await import(id);
|
|
142
|
+
return { module: mod, error: null };
|
|
143
|
+
} catch (error) {
|
|
144
|
+
return { module: null, error };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
static wait(time) {
|
|
148
|
+
return (0, import_promises.setTimeout)(time, void 0, { ref: false });
|
|
149
|
+
}
|
|
150
|
+
static noop() {
|
|
151
|
+
}
|
|
152
|
+
static async getFetch() {
|
|
153
|
+
if ("fetch" in globalThis)
|
|
154
|
+
return globalThis.fetch;
|
|
155
|
+
for (const lib of ["node-fetch", "undici"]) {
|
|
156
|
+
try {
|
|
157
|
+
return await import(lib).then((res) => res.fetch || res.default?.fetch || res.default);
|
|
158
|
+
} catch {
|
|
159
|
+
try {
|
|
160
|
+
const res = require(lib);
|
|
161
|
+
if (res)
|
|
162
|
+
return res.fetch || res.default?.fetch || res.default;
|
|
163
|
+
} catch {
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
static warn(message, code = "DeprecationWarning", detail) {
|
|
169
|
+
process.emitWarning(message, {
|
|
170
|
+
code,
|
|
171
|
+
detail
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
__name(Util, "Util");
|
|
176
|
+
|
|
177
|
+
// src/utils/PlayerEventsEmitter.ts
|
|
178
|
+
var PlayerEventsEmitter = class extends import_utils.EventEmitter {
|
|
179
|
+
constructor(requiredEvents = []) {
|
|
180
|
+
super();
|
|
181
|
+
this.requiredEvents = requiredEvents;
|
|
182
|
+
}
|
|
183
|
+
emit(name, ...args) {
|
|
184
|
+
if (this.requiredEvents.includes(name) && !this.eventNames().includes(name)) {
|
|
185
|
+
console.error(...args);
|
|
186
|
+
Util.warn(
|
|
187
|
+
`No event listener found for event "${String(name)}". Events ${this.requiredEvents.map((m) => `"${String(m)}"`).join(", ")} must have event listeners.`,
|
|
188
|
+
"UnhandledEventsWarning"
|
|
189
|
+
);
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
return super.emit(name, ...args);
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
__name(PlayerEventsEmitter, "PlayerEventsEmitter");
|
|
196
|
+
|
|
95
197
|
// src/utils/AudioFilters.ts
|
|
96
198
|
var bass = /* @__PURE__ */ __name((g) => `bass=g=${g}:f=110:w=0.3`, "bass");
|
|
97
199
|
var _AudioFilters = class {
|
|
@@ -202,16 +304,32 @@ var BaseExtractor = class {
|
|
|
202
304
|
createResponse(playlist, tracks = playlist?.tracks || []) {
|
|
203
305
|
return { playlist: playlist || null, tracks };
|
|
204
306
|
}
|
|
307
|
+
debug(message) {
|
|
308
|
+
return this.context.player.debug(message);
|
|
309
|
+
}
|
|
205
310
|
};
|
|
206
311
|
__name(BaseExtractor, "BaseExtractor");
|
|
207
312
|
BaseExtractor.identifier = "com.discord-player.extractor";
|
|
208
313
|
|
|
209
314
|
// src/extractors/ExtractorExecutionContext.ts
|
|
210
|
-
var
|
|
315
|
+
var import_utils2 = require("@discord-player/utils");
|
|
316
|
+
var knownExtractorKeys = ["YouTubeExtractor", "SoundCloudExtractor", "ReverbnationExtractor", "VimeoExtractor", "AttachmentExtractor"];
|
|
317
|
+
var knownExtractorLib = "@discord-player/extractor";
|
|
211
318
|
var ExtractorExecutionContext = class {
|
|
212
319
|
constructor(player) {
|
|
213
320
|
this.player = player;
|
|
214
|
-
this.store = new
|
|
321
|
+
this.store = new import_utils2.Collection();
|
|
322
|
+
}
|
|
323
|
+
async loadDefault() {
|
|
324
|
+
const mod = await Util.import(knownExtractorLib);
|
|
325
|
+
if (mod.error)
|
|
326
|
+
return { success: false, error: mod.error };
|
|
327
|
+
knownExtractorKeys.forEach((key) => {
|
|
328
|
+
if (!mod.module[key])
|
|
329
|
+
return;
|
|
330
|
+
this.register(mod.module[key]);
|
|
331
|
+
});
|
|
332
|
+
return { success: true, error: null };
|
|
215
333
|
}
|
|
216
334
|
isRegistered(identifier) {
|
|
217
335
|
return this.store.has(identifier);
|
|
@@ -228,9 +346,12 @@ var ExtractorExecutionContext = class {
|
|
|
228
346
|
const extractor = new _extractor(this);
|
|
229
347
|
try {
|
|
230
348
|
this.store.set(_extractor.identifier, extractor);
|
|
349
|
+
this.player.debug(`${_extractor.identifier} extractor loaded!`);
|
|
231
350
|
await extractor.activate();
|
|
232
|
-
|
|
351
|
+
this.player.debug(`${_extractor.identifier} extractor activated!`);
|
|
352
|
+
} catch (e) {
|
|
233
353
|
this.store.delete(_extractor.identifier);
|
|
354
|
+
this.player.debug(`${_extractor.identifier} extractor failed to activate! Error: ${e}`);
|
|
234
355
|
}
|
|
235
356
|
}
|
|
236
357
|
async unregister(_extractor) {
|
|
@@ -240,8 +361,11 @@ var ExtractorExecutionContext = class {
|
|
|
240
361
|
try {
|
|
241
362
|
const key = extractor.identifier || this.store.findKey((e) => e === extractor);
|
|
242
363
|
this.store.delete(key);
|
|
364
|
+
this.player.debug(`${extractor.identifier} extractor disabled!`);
|
|
243
365
|
await extractor.deactivate();
|
|
366
|
+
this.player.debug(`${extractor.identifier} extractor deactivated!`);
|
|
244
367
|
} catch {
|
|
368
|
+
this.player.debug(`${extractor.identifier} extractor failed to deactivate!`);
|
|
245
369
|
}
|
|
246
370
|
}
|
|
247
371
|
async unregisterAll() {
|
|
@@ -275,11 +399,11 @@ var ExtractorExecutionContext = class {
|
|
|
275
399
|
__name(ExtractorExecutionContext, "ExtractorExecutionContext");
|
|
276
400
|
|
|
277
401
|
// src/Structures/GuildNodeManager.ts
|
|
278
|
-
var
|
|
402
|
+
var import_utils5 = require("@discord-player/utils");
|
|
279
403
|
|
|
280
404
|
// src/Structures/GuildQueue.ts
|
|
281
405
|
var import_discord2 = require("discord.js");
|
|
282
|
-
var
|
|
406
|
+
var import_utils4 = require("@discord-player/utils");
|
|
283
407
|
|
|
284
408
|
// src/Structures/Track.ts
|
|
285
409
|
var import_discord = require("discord.js");
|
|
@@ -287,7 +411,10 @@ var Track = class {
|
|
|
287
411
|
constructor(player, data) {
|
|
288
412
|
this.requestedBy = null;
|
|
289
413
|
this.queryType = null;
|
|
290
|
-
this.raw = {
|
|
414
|
+
this.raw = {
|
|
415
|
+
source: "arbitrary"
|
|
416
|
+
};
|
|
417
|
+
this.extractor = null;
|
|
291
418
|
this.id = import_discord.SnowflakeUtil.generate().toString();
|
|
292
419
|
Object.defineProperty(this, "player", { value: player, enumerable: false });
|
|
293
420
|
void this._patch(data);
|
|
@@ -302,7 +429,7 @@ var Track = class {
|
|
|
302
429
|
this.queryType = data.queryType;
|
|
303
430
|
this.requestedBy = data.requestedBy || null;
|
|
304
431
|
this.playlist = data.playlist;
|
|
305
|
-
|
|
432
|
+
this.raw = Object.assign({}, { source: data.raw?.source ?? data.source }, data.raw ?? data);
|
|
306
433
|
}
|
|
307
434
|
get queue() {
|
|
308
435
|
return this.player.nodes.cache.find((q) => q.tracks.some((ab) => ab.id === this.id));
|
|
@@ -317,7 +444,7 @@ var Track = class {
|
|
|
317
444
|
return this.duration.split(":").reverse().map((m, i) => parseInt(m) * times(60, i)).reduce((a, c) => a + c, 0);
|
|
318
445
|
}
|
|
319
446
|
get source() {
|
|
320
|
-
return this.raw
|
|
447
|
+
return this.raw?.source ?? "arbitrary";
|
|
321
448
|
}
|
|
322
449
|
toString() {
|
|
323
450
|
return `${this.title} by ${this.author}`;
|
|
@@ -343,77 +470,6 @@ __name(Track, "Track");
|
|
|
343
470
|
// src/Structures/GuildQueue.ts
|
|
344
471
|
var import_voice2 = require("@discordjs/voice");
|
|
345
472
|
|
|
346
|
-
// src/utils/Util.ts
|
|
347
|
-
var import_promises = require("timers/promises");
|
|
348
|
-
var Util = class {
|
|
349
|
-
constructor() {
|
|
350
|
-
}
|
|
351
|
-
static durationString(durObj) {
|
|
352
|
-
return Object.values(durObj).map((m) => isNaN(m) ? 0 : m).join(":");
|
|
353
|
-
}
|
|
354
|
-
static parseMS(milliseconds) {
|
|
355
|
-
if (isNaN(milliseconds))
|
|
356
|
-
milliseconds = 0;
|
|
357
|
-
const round = milliseconds > 0 ? Math.floor : Math.ceil;
|
|
358
|
-
return {
|
|
359
|
-
days: round(milliseconds / 864e5),
|
|
360
|
-
hours: round(milliseconds / 36e5) % 24,
|
|
361
|
-
minutes: round(milliseconds / 6e4) % 60,
|
|
362
|
-
seconds: round(milliseconds / 1e3) % 60
|
|
363
|
-
};
|
|
364
|
-
}
|
|
365
|
-
static buildTimeCode(duration) {
|
|
366
|
-
const items = Object.keys(duration);
|
|
367
|
-
const required = ["days", "hours", "minutes", "seconds"];
|
|
368
|
-
const parsed = items.filter((x) => required.includes(x)).map((m) => duration[m]);
|
|
369
|
-
const final = parsed.slice(parsed.findIndex((x) => x !== 0)).map((x) => x.toString().padStart(2, "0")).join(":");
|
|
370
|
-
return final.length <= 3 ? `0:${final.padStart(2, "0") || 0}` : final;
|
|
371
|
-
}
|
|
372
|
-
static last(arr) {
|
|
373
|
-
if (!Array.isArray(arr))
|
|
374
|
-
return arr;
|
|
375
|
-
return arr[arr.length - 1];
|
|
376
|
-
}
|
|
377
|
-
static isVoiceEmpty(channel) {
|
|
378
|
-
return channel && channel.members.filter((member) => !member.user.bot).size === 0;
|
|
379
|
-
}
|
|
380
|
-
static require(id) {
|
|
381
|
-
try {
|
|
382
|
-
return require(id);
|
|
383
|
-
} catch {
|
|
384
|
-
return null;
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
static wait(time) {
|
|
388
|
-
return (0, import_promises.setTimeout)(time, void 0, { ref: false });
|
|
389
|
-
}
|
|
390
|
-
static noop() {
|
|
391
|
-
}
|
|
392
|
-
static async getFetch() {
|
|
393
|
-
if ("fetch" in globalThis)
|
|
394
|
-
return globalThis.fetch;
|
|
395
|
-
for (const lib of ["node-fetch", "undici"]) {
|
|
396
|
-
try {
|
|
397
|
-
return await import(lib).then((res) => res.fetch || res.default?.fetch || res.default);
|
|
398
|
-
} catch {
|
|
399
|
-
try {
|
|
400
|
-
const res = require(lib);
|
|
401
|
-
if (res)
|
|
402
|
-
return res.fetch || res.default?.fetch || res.default;
|
|
403
|
-
} catch {
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
static warn(message, code = "DeprecationWarning", detail) {
|
|
409
|
-
process.emitWarning(message, {
|
|
410
|
-
code,
|
|
411
|
-
detail
|
|
412
|
-
});
|
|
413
|
-
}
|
|
414
|
-
};
|
|
415
|
-
__name(Util, "Util");
|
|
416
|
-
|
|
417
473
|
// src/Structures/Playlist.ts
|
|
418
474
|
var Playlist = class {
|
|
419
475
|
constructor(player, data) {
|
|
@@ -451,11 +507,11 @@ var Playlist = class {
|
|
|
451
507
|
__name(Playlist, "Playlist");
|
|
452
508
|
|
|
453
509
|
// src/Structures/GuildQueueHistory.ts
|
|
454
|
-
var
|
|
510
|
+
var import_utils3 = require("@discord-player/utils");
|
|
455
511
|
var GuildQueueHistory = class {
|
|
456
512
|
constructor(queue) {
|
|
457
513
|
this.queue = queue;
|
|
458
|
-
this.tracks = new
|
|
514
|
+
this.tracks = new import_utils3.Queue("LIFO");
|
|
459
515
|
}
|
|
460
516
|
get currentTrack() {
|
|
461
517
|
return this.queue.dispatcher?.audioResource?.metadata || this.queue.__current;
|
|
@@ -481,20 +537,25 @@ var GuildQueueHistory = class {
|
|
|
481
537
|
clear() {
|
|
482
538
|
this.tracks.clear();
|
|
483
539
|
}
|
|
484
|
-
next() {
|
|
540
|
+
async next() {
|
|
485
541
|
const track = this.nextTrack;
|
|
486
542
|
if (!track) {
|
|
487
543
|
throw new Error("No next track in the queue");
|
|
488
544
|
}
|
|
489
545
|
this.queue.node.skip();
|
|
490
546
|
}
|
|
491
|
-
previous() {
|
|
492
|
-
const track = this.
|
|
547
|
+
async previous() {
|
|
548
|
+
const track = this.tracks.dispatch();
|
|
493
549
|
if (!track) {
|
|
494
550
|
throw new Error("No previous track in the queue");
|
|
495
551
|
}
|
|
496
|
-
|
|
497
|
-
this.queue.node.
|
|
552
|
+
const current = this.currentTrack;
|
|
553
|
+
await this.queue.node.play(track, { queue: false });
|
|
554
|
+
if (current)
|
|
555
|
+
this.queue.node.insert(current, 0);
|
|
556
|
+
}
|
|
557
|
+
back() {
|
|
558
|
+
return this.previous();
|
|
498
559
|
}
|
|
499
560
|
};
|
|
500
561
|
__name(GuildQueueHistory, "GuildQueueHistory");
|
|
@@ -537,7 +598,7 @@ var QueueRepeatMode = /* @__PURE__ */ ((QueueRepeatMode2) => {
|
|
|
537
598
|
})(QueueRepeatMode || {});
|
|
538
599
|
|
|
539
600
|
// src/utils/QueryResolver.ts
|
|
540
|
-
var
|
|
601
|
+
var soundcloud = __toESM(require("soundcloud-scraper"));
|
|
541
602
|
var spotifySongRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:track\/|\?uri=spotify:track:)((\w|-){22})(\?si=.+)?$/;
|
|
542
603
|
var spotifyPlaylistRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})(\?si=.+)?$/;
|
|
543
604
|
var spotifyAlbumRegex = /^https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:album\/|\?uri=spotify:album:)((\w|-){22})(\?si=.+)?$/;
|
|
@@ -565,9 +626,9 @@ var QueryResolver = class {
|
|
|
565
626
|
}
|
|
566
627
|
static resolve(query) {
|
|
567
628
|
query = query.trim();
|
|
568
|
-
if (
|
|
629
|
+
if (soundcloud.validateURL(query, "track"))
|
|
569
630
|
return QueryType.SOUNDCLOUD_TRACK;
|
|
570
|
-
if (
|
|
631
|
+
if (soundcloud.validateURL(query, "playlist") || query.includes("/sets/"))
|
|
571
632
|
return QueryType.SOUNDCLOUD_PLAYLIST;
|
|
572
633
|
if (import_youtube_sr.YouTube.isPlaylist(query))
|
|
573
634
|
return QueryType.YOUTUBE_PLAYLIST;
|
|
@@ -799,6 +860,9 @@ var GuildQueuePlayerNode = class {
|
|
|
799
860
|
}
|
|
800
861
|
return true;
|
|
801
862
|
}
|
|
863
|
+
async playRaw(resource) {
|
|
864
|
+
await this.queue.dispatcher?.playStream(resource);
|
|
865
|
+
}
|
|
802
866
|
async play(res, options) {
|
|
803
867
|
if (!this.queue.dispatcher?.voiceConnection) {
|
|
804
868
|
throw new Error("No voice connection available");
|
|
@@ -821,23 +885,29 @@ var GuildQueuePlayerNode = class {
|
|
|
821
885
|
if (!track) {
|
|
822
886
|
throw new Error("Play request received but track was not provided");
|
|
823
887
|
}
|
|
888
|
+
if (this.queue.initializing) {
|
|
889
|
+
this.queue.debug("Queue is currently initializing another track, waiting...");
|
|
890
|
+
await this.queue.awaitInitialization();
|
|
891
|
+
this.queue.debug("Queue has finished initialization...");
|
|
892
|
+
}
|
|
824
893
|
this.queue.debug("Requested option requires to play the track, initializing...");
|
|
825
894
|
this.queue.initializing = true;
|
|
826
895
|
try {
|
|
827
896
|
this.queue.debug(`Initiating stream extraction process...`);
|
|
828
|
-
const
|
|
897
|
+
const src = track.raw?.source || track.source;
|
|
898
|
+
const qt = track.queryType || (src === "spotify" ? "spotifySong" : src === "apple_music" ? "appleMusicSong" : src);
|
|
829
899
|
this.queue.debug(`Executing onBeforeCreateStream hook (QueryType: ${qt})...`);
|
|
830
|
-
let stream = await this.queue.onBeforeCreateStream?.(track, qt, this.queue).catch(() => null);
|
|
900
|
+
let stream = await this.queue.onBeforeCreateStream?.(track, qt || "arbitrary", this.queue).catch(() => null);
|
|
831
901
|
if (!stream) {
|
|
832
902
|
this.queue.debug("Failed to get stream from onBeforeCreateStream!");
|
|
833
903
|
stream = await __privateMethod(this, _createGenericStream, createGenericStream_fn).call(this, track).catch(() => null);
|
|
834
904
|
}
|
|
835
905
|
if (!stream) {
|
|
836
906
|
const error = new Error("Could not extract stream for this track");
|
|
837
|
-
this.queue.initializing = false;
|
|
838
907
|
if (this.queue.options.skipOnNoStream) {
|
|
839
908
|
this.queue.player.events.emit("playerSkip", this.queue, track);
|
|
840
909
|
this.queue.player.events.emit("playerError", this.queue, error, track);
|
|
910
|
+
this.queue.initializing = false;
|
|
841
911
|
this.play(this.queue.tracks.dispatch());
|
|
842
912
|
return;
|
|
843
913
|
}
|
|
@@ -848,7 +918,7 @@ var GuildQueuePlayerNode = class {
|
|
|
848
918
|
} else {
|
|
849
919
|
__privateSet(this, _progress, 0);
|
|
850
920
|
}
|
|
851
|
-
const cookies = track.source === "youtube" ? this.queue.player.options.ytdlOptions?.requestOptions?.headers?.cookie : void 0;
|
|
921
|
+
const cookies = track.raw?.source === "youtube" ? this.queue.player.options.ytdlOptions?.requestOptions?.headers?.cookie : void 0;
|
|
852
922
|
const pcmStream = __privateMethod(this, _createFFmpegStream, createFFmpegStream_fn).call(this, stream, track, options.seek ?? 0, cookies);
|
|
853
923
|
if (options.transitionMode) {
|
|
854
924
|
this.queue.debug(`Transition mode detected, player will wait for buffering timeout to expire (Timeout: ${this.queue.options.bufferingTimeout}ms)`);
|
|
@@ -892,6 +962,7 @@ var GuildQueuePlayerNode = class {
|
|
|
892
962
|
});
|
|
893
963
|
this.queue.setTransitioning(!!options.transitionMode);
|
|
894
964
|
await __privateMethod(this, _performPlay, performPlay_fn).call(this, resource);
|
|
965
|
+
this.queue.initializing = false;
|
|
895
966
|
} catch (e) {
|
|
896
967
|
this.queue.debug(`Failed to initialize audio player: ${e}`);
|
|
897
968
|
this.queue.initializing = false;
|
|
@@ -947,7 +1018,7 @@ createFFmpegStream_fn = /* @__PURE__ */ __name(function(stream, track, seek = 0,
|
|
|
947
1018
|
var import_equalizer = require("@discord-player/equalizer");
|
|
948
1019
|
|
|
949
1020
|
// src/utils/FFmpegStream.ts
|
|
950
|
-
var
|
|
1021
|
+
var prism = __toESM(require("prism-media"));
|
|
951
1022
|
function FFMPEG_ARGS_STRING(stream, fmt, cookies) {
|
|
952
1023
|
const args = [
|
|
953
1024
|
"-reconnect",
|
|
@@ -999,7 +1070,7 @@ function createFFmpegStream(stream, options) {
|
|
|
999
1070
|
args.unshift("-ss", String(options.seek));
|
|
1000
1071
|
if (Array.isArray(options.encoderArgs))
|
|
1001
1072
|
args.push(...options.encoderArgs);
|
|
1002
|
-
const transcoder = new
|
|
1073
|
+
const transcoder = new prism.FFmpeg({ shell: false, args });
|
|
1003
1074
|
transcoder.on("close", () => transcoder.destroy());
|
|
1004
1075
|
if (typeof stream !== "string") {
|
|
1005
1076
|
stream.on("error", () => transcoder.destroy());
|
|
@@ -1232,7 +1303,7 @@ var GuildQueueStatistics = class {
|
|
|
1232
1303
|
memoryUsage: process.memoryUsage(),
|
|
1233
1304
|
versions: {
|
|
1234
1305
|
node: process.version,
|
|
1235
|
-
player: "6.0.0-dev.
|
|
1306
|
+
player: "6.0.0-dev.4"
|
|
1236
1307
|
}
|
|
1237
1308
|
};
|
|
1238
1309
|
}
|
|
@@ -1240,7 +1311,7 @@ var GuildQueueStatistics = class {
|
|
|
1240
1311
|
__name(GuildQueueStatistics, "GuildQueueStatistics");
|
|
1241
1312
|
|
|
1242
1313
|
// src/Structures/GuildQueue.ts
|
|
1243
|
-
var _transitioning, _initializing, _deleted, _initializingPromises, _attachListeners, attachListeners_fn, _removeListeners, removeListeners_fn, _performStart, performStart_fn, _performFinish, performFinish_fn, _emitEnd, emitEnd_fn, _handleAutoplay, handleAutoplay_fn, _resolveInitializerAwaiters, resolveInitializerAwaiters_fn
|
|
1314
|
+
var _transitioning, _initializing, _deleted, _initializingPromises, _attachListeners, attachListeners_fn, _removeListeners, removeListeners_fn, _performStart, performStart_fn, _performFinish, performFinish_fn, _emitEnd, emitEnd_fn, _handleAutoplay, handleAutoplay_fn, _resolveInitializerAwaiters, resolveInitializerAwaiters_fn;
|
|
1244
1315
|
var GuildQueue = class {
|
|
1245
1316
|
constructor(player, options) {
|
|
1246
1317
|
this.player = player;
|
|
@@ -1252,7 +1323,6 @@ var GuildQueue = class {
|
|
|
1252
1323
|
__privateAdd(this, _emitEnd);
|
|
1253
1324
|
__privateAdd(this, _handleAutoplay);
|
|
1254
1325
|
__privateAdd(this, _resolveInitializerAwaiters);
|
|
1255
|
-
__privateAdd(this, _warnIfDeleted);
|
|
1256
1326
|
__privateAdd(this, _transitioning, false);
|
|
1257
1327
|
__privateAdd(this, _initializing, false);
|
|
1258
1328
|
__privateAdd(this, _deleted, false);
|
|
@@ -1268,9 +1338,9 @@ var GuildQueue = class {
|
|
|
1268
1338
|
type: import_voice2.StreamType.Raw
|
|
1269
1339
|
}), "onAfterCreateStream");
|
|
1270
1340
|
this.repeatMode = 0 /* OFF */;
|
|
1271
|
-
this.timeouts = new
|
|
1341
|
+
this.timeouts = new import_utils4.Collection();
|
|
1272
1342
|
this.stats = new GuildQueueStatistics(this);
|
|
1273
|
-
this.tracks = new
|
|
1343
|
+
this.tracks = new import_utils4.Queue(options.queueStrategy);
|
|
1274
1344
|
if (typeof options.onBeforeCreateStream === "function")
|
|
1275
1345
|
this.onBeforeCreateStream = options.onBeforeCreateStream;
|
|
1276
1346
|
if (typeof options.onAfterCreateStream === "function")
|
|
@@ -1295,6 +1365,9 @@ var GuildQueue = class {
|
|
|
1295
1365
|
}
|
|
1296
1366
|
this.debug(`GuildQueue initialized for guild ${this.options.guild.name} (ID: ${this.options.guild.id})`);
|
|
1297
1367
|
}
|
|
1368
|
+
get voiceReceiver() {
|
|
1369
|
+
return this.dispatcher?.receiver ?? null;
|
|
1370
|
+
}
|
|
1298
1371
|
debug(m) {
|
|
1299
1372
|
this.player.events.emit("debug", this, m);
|
|
1300
1373
|
}
|
|
@@ -1305,7 +1378,6 @@ var GuildQueue = class {
|
|
|
1305
1378
|
this.options.metadata = m;
|
|
1306
1379
|
}
|
|
1307
1380
|
setMetadata(m) {
|
|
1308
|
-
__privateMethod(this, _warnIfDeleted, warnIfDeleted_fn).call(this);
|
|
1309
1381
|
this.options.metadata = m;
|
|
1310
1382
|
}
|
|
1311
1383
|
get initializing() {
|
|
@@ -1344,26 +1416,21 @@ var GuildQueue = class {
|
|
|
1344
1416
|
return this.guild.id;
|
|
1345
1417
|
}
|
|
1346
1418
|
setTransitioning(state) {
|
|
1347
|
-
__privateMethod(this, _warnIfDeleted, warnIfDeleted_fn).call(this);
|
|
1348
1419
|
__privateSet(this, _transitioning, state);
|
|
1349
1420
|
}
|
|
1350
1421
|
isTransitioning() {
|
|
1351
1422
|
return __privateGet(this, _transitioning);
|
|
1352
1423
|
}
|
|
1353
1424
|
setRepeatMode(mode) {
|
|
1354
|
-
__privateMethod(this, _warnIfDeleted, warnIfDeleted_fn).call(this);
|
|
1355
1425
|
this.repeatMode = mode;
|
|
1356
1426
|
}
|
|
1357
1427
|
isEmpty() {
|
|
1358
|
-
__privateMethod(this, _warnIfDeleted, warnIfDeleted_fn).call(this);
|
|
1359
1428
|
return this.tracks.size < 1;
|
|
1360
1429
|
}
|
|
1361
1430
|
isPlaying() {
|
|
1362
|
-
__privateMethod(this, _warnIfDeleted, warnIfDeleted_fn).call(this);
|
|
1363
1431
|
return this.dispatcher?.audioResource != null;
|
|
1364
1432
|
}
|
|
1365
1433
|
addTrack(track) {
|
|
1366
|
-
__privateMethod(this, _warnIfDeleted, warnIfDeleted_fn).call(this);
|
|
1367
1434
|
const toAdd = track instanceof Playlist ? track.tracks : track;
|
|
1368
1435
|
this.tracks.add(toAdd);
|
|
1369
1436
|
const isMulti = Array.isArray(toAdd);
|
|
@@ -1374,8 +1441,13 @@ var GuildQueue = class {
|
|
|
1374
1441
|
this.player.events.emit("audioTrackAdd", this, toAdd);
|
|
1375
1442
|
}
|
|
1376
1443
|
}
|
|
1444
|
+
removeTrack(track) {
|
|
1445
|
+
return this.node.remove(track);
|
|
1446
|
+
}
|
|
1447
|
+
insertTrack(track, index = 0) {
|
|
1448
|
+
return this.node.insert(track, index);
|
|
1449
|
+
}
|
|
1377
1450
|
async connect(channelResolvable, options = {}) {
|
|
1378
|
-
__privateMethod(this, _warnIfDeleted, warnIfDeleted_fn).call(this);
|
|
1379
1451
|
const channel = this.player.client.channels.resolve(channelResolvable);
|
|
1380
1452
|
if (!channel || !channel.isVoiceBased()) {
|
|
1381
1453
|
throw new Error(`Expected a voice based channel (type ${import_discord2.ChannelType.GuildVoice}/${import_discord2.ChannelType.GuildStageVoice}), received ${channel?.type}`);
|
|
@@ -1408,6 +1480,12 @@ var GuildQueue = class {
|
|
|
1408
1480
|
__privateSet(this, _deleted, true);
|
|
1409
1481
|
}
|
|
1410
1482
|
}
|
|
1483
|
+
revive() {
|
|
1484
|
+
if (!this.deleted || this.player.nodes.has(this.id))
|
|
1485
|
+
return;
|
|
1486
|
+
__privateSet(this, _deleted, false);
|
|
1487
|
+
this.player.nodes.cache.set(this.id, this);
|
|
1488
|
+
}
|
|
1411
1489
|
awaitInitialization() {
|
|
1412
1490
|
return new Promise((r) => {
|
|
1413
1491
|
if (!__privateGet(this, _initializing))
|
|
@@ -1415,6 +1493,12 @@ var GuildQueue = class {
|
|
|
1415
1493
|
__privateGet(this, _initializingPromises).push(r);
|
|
1416
1494
|
});
|
|
1417
1495
|
}
|
|
1496
|
+
setSelfDeaf(mode, reason) {
|
|
1497
|
+
return this.guild.members.me.voice.setDeaf(mode, reason);
|
|
1498
|
+
}
|
|
1499
|
+
setSelfMute(mode, reason) {
|
|
1500
|
+
return this.guild.members.me.voice.setMute(mode, reason);
|
|
1501
|
+
}
|
|
1418
1502
|
};
|
|
1419
1503
|
__name(GuildQueue, "GuildQueue");
|
|
1420
1504
|
_transitioning = new WeakMap();
|
|
@@ -1465,7 +1549,7 @@ performFinish_fn = /* @__PURE__ */ __name(function(resource) {
|
|
|
1465
1549
|
} else {
|
|
1466
1550
|
if (this.repeatMode === 1 /* TRACK */) {
|
|
1467
1551
|
this.__current = this.history.tracks.dispatch() || track;
|
|
1468
|
-
return this.node.play(this.__current);
|
|
1552
|
+
return this.node.play(this.__current, { queue: false });
|
|
1469
1553
|
}
|
|
1470
1554
|
if (this.repeatMode === 2 /* QUEUE */)
|
|
1471
1555
|
this.tracks.add(this.history.tracks.dispatch() || track);
|
|
@@ -1528,18 +1612,12 @@ resolveInitializerAwaiters_fn = /* @__PURE__ */ __name(function() {
|
|
|
1528
1612
|
});
|
|
1529
1613
|
__privateSet(this, _initializingPromises, []);
|
|
1530
1614
|
}, "#resolveInitializerAwaiters");
|
|
1531
|
-
_warnIfDeleted = new WeakSet();
|
|
1532
|
-
warnIfDeleted_fn = /* @__PURE__ */ __name(function() {
|
|
1533
|
-
if (!this.deleted)
|
|
1534
|
-
return;
|
|
1535
|
-
Util.warn("Deleted queue usage detected! Please remove references to deleted queues in order to prevent memory leaks.", "DiscordPlayerWarning");
|
|
1536
|
-
}, "#warnIfDeleted");
|
|
1537
1615
|
|
|
1538
1616
|
// src/Structures/GuildNodeManager.ts
|
|
1539
1617
|
var GuildNodeManager = class {
|
|
1540
1618
|
constructor(player) {
|
|
1541
1619
|
this.player = player;
|
|
1542
|
-
this.cache = new
|
|
1620
|
+
this.cache = new import_utils5.Collection();
|
|
1543
1621
|
}
|
|
1544
1622
|
create(guild, options = {}) {
|
|
1545
1623
|
const server = this.player.client.guilds.resolve(guild);
|
|
@@ -1629,11 +1707,82 @@ var GuildNodeManager = class {
|
|
|
1629
1707
|
};
|
|
1630
1708
|
__name(GuildNodeManager, "GuildNodeManager");
|
|
1631
1709
|
|
|
1710
|
+
// src/Structures/VoiceReceiverNode.ts
|
|
1711
|
+
var import_stream = require("stream");
|
|
1712
|
+
var import_voice3 = require("@discordjs/voice");
|
|
1713
|
+
var prism2 = __toESM(require("prism-media"));
|
|
1714
|
+
var VoiceReceiverNode = class {
|
|
1715
|
+
constructor(dispatcher) {
|
|
1716
|
+
this.dispatcher = dispatcher;
|
|
1717
|
+
}
|
|
1718
|
+
createRawTrack(stream, data = {}) {
|
|
1719
|
+
data.title ?? (data.title = `Recording ${Date.now()}`);
|
|
1720
|
+
return new Track(this.dispatcher.queue.player, {
|
|
1721
|
+
author: "Discord",
|
|
1722
|
+
description: data.title,
|
|
1723
|
+
title: data.title,
|
|
1724
|
+
duration: data.duration || "0:00",
|
|
1725
|
+
views: 0,
|
|
1726
|
+
requestedBy: data.requestedBy,
|
|
1727
|
+
thumbnail: data.thumbnail || "https://cdn.discordapp.com/embed/avatars/0.png",
|
|
1728
|
+
url: data.url || "https://discord.com",
|
|
1729
|
+
source: "arbitrary",
|
|
1730
|
+
raw: {
|
|
1731
|
+
engine: stream,
|
|
1732
|
+
source: "arbitrary"
|
|
1733
|
+
}
|
|
1734
|
+
});
|
|
1735
|
+
}
|
|
1736
|
+
mergeRecordings(streams) {
|
|
1737
|
+
throw new Error("Not implemented");
|
|
1738
|
+
}
|
|
1739
|
+
recordUser(user, options = {
|
|
1740
|
+
end: import_voice3.EndBehaviorType.AfterSilence,
|
|
1741
|
+
mode: "pcm",
|
|
1742
|
+
silenceDuration: 1e3
|
|
1743
|
+
}) {
|
|
1744
|
+
const _user = this.dispatcher.queue.player.client.users.resolveId(user);
|
|
1745
|
+
const passThrough = new import_stream.PassThrough();
|
|
1746
|
+
const receiver = this.dispatcher.voiceConnection.receiver;
|
|
1747
|
+
if (!receiver)
|
|
1748
|
+
throw new Error("Voice receiver is not available, maybe connect to a voice channel first?");
|
|
1749
|
+
receiver.speaking.on("start", (userId) => {
|
|
1750
|
+
if (userId === _user) {
|
|
1751
|
+
const receiveStream = receiver.subscribe(_user, {
|
|
1752
|
+
end: {
|
|
1753
|
+
behavior: options.end || import_voice3.EndBehaviorType.AfterSilence,
|
|
1754
|
+
duration: options.silenceDuration ?? 1e3
|
|
1755
|
+
}
|
|
1756
|
+
});
|
|
1757
|
+
setImmediate(async () => {
|
|
1758
|
+
if (options.mode === "pcm") {
|
|
1759
|
+
const pcm = receiveStream.pipe(
|
|
1760
|
+
new prism2.opus.Decoder({
|
|
1761
|
+
channels: 2,
|
|
1762
|
+
frameSize: 960,
|
|
1763
|
+
rate: 48e3
|
|
1764
|
+
})
|
|
1765
|
+
);
|
|
1766
|
+
return pcm.pipe(passThrough);
|
|
1767
|
+
} else {
|
|
1768
|
+
return receiveStream.pipe(passThrough);
|
|
1769
|
+
}
|
|
1770
|
+
}).unref();
|
|
1771
|
+
}
|
|
1772
|
+
});
|
|
1773
|
+
return passThrough;
|
|
1774
|
+
}
|
|
1775
|
+
};
|
|
1776
|
+
__name(VoiceReceiverNode, "VoiceReceiverNode");
|
|
1777
|
+
|
|
1632
1778
|
// src/Structures/SearchResult.ts
|
|
1633
1779
|
var SearchResult = class {
|
|
1634
1780
|
constructor(player, _data) {
|
|
1635
1781
|
this.player = player;
|
|
1636
1782
|
this._data = _data;
|
|
1783
|
+
this._data.tracks?.forEach((track) => {
|
|
1784
|
+
track.extractor = this._data.extractor || null;
|
|
1785
|
+
});
|
|
1637
1786
|
}
|
|
1638
1787
|
get query() {
|
|
1639
1788
|
return this._data.query;
|
|
@@ -1729,21 +1878,22 @@ var PlayerError = class extends Error {
|
|
|
1729
1878
|
__name(PlayerError, "PlayerError");
|
|
1730
1879
|
|
|
1731
1880
|
// src/VoiceInterface/VoiceUtils.ts
|
|
1732
|
-
var
|
|
1881
|
+
var import_voice5 = require("@discordjs/voice");
|
|
1733
1882
|
|
|
1734
1883
|
// src/VoiceInterface/StreamDispatcher.ts
|
|
1735
|
-
var
|
|
1736
|
-
var
|
|
1884
|
+
var import_voice4 = require("@discordjs/voice");
|
|
1885
|
+
var import_utils6 = require("@discord-player/utils");
|
|
1737
1886
|
var import_equalizer2 = require("@discord-player/equalizer");
|
|
1738
|
-
var StreamDispatcher = class extends
|
|
1887
|
+
var StreamDispatcher = class extends import_utils6.EventEmitter {
|
|
1739
1888
|
constructor(connection, channel, queue, connectionTimeout = 2e4) {
|
|
1740
1889
|
super();
|
|
1741
1890
|
this.queue = queue;
|
|
1742
1891
|
this.connectionTimeout = connectionTimeout;
|
|
1892
|
+
this.receiver = new VoiceReceiverNode(this);
|
|
1743
1893
|
this.readyLock = false;
|
|
1744
1894
|
this.dsp = new import_equalizer2.FiltersChain();
|
|
1745
1895
|
this.voiceConnection = connection;
|
|
1746
|
-
this.audioPlayer = (0,
|
|
1896
|
+
this.audioPlayer = (0, import_voice4.createAudioPlayer)();
|
|
1747
1897
|
this.channel = channel;
|
|
1748
1898
|
this.dsp.onUpdate = () => {
|
|
1749
1899
|
if (!this.dsp)
|
|
@@ -1761,10 +1911,10 @@ var StreamDispatcher = class extends import_utils5.EventEmitter {
|
|
|
1761
1911
|
};
|
|
1762
1912
|
this.dsp.onError = (e) => this.emit("error", e);
|
|
1763
1913
|
this.voiceConnection.on("stateChange", async (_, newState) => {
|
|
1764
|
-
if (newState.status ===
|
|
1765
|
-
if (newState.reason ===
|
|
1914
|
+
if (newState.status === import_voice4.VoiceConnectionStatus.Disconnected) {
|
|
1915
|
+
if (newState.reason === import_voice4.VoiceConnectionDisconnectReason.WebSocketClose && newState.closeCode === 4014) {
|
|
1766
1916
|
try {
|
|
1767
|
-
await (0,
|
|
1917
|
+
await (0, import_voice4.entersState)(this.voiceConnection, import_voice4.VoiceConnectionStatus.Connecting, this.connectionTimeout);
|
|
1768
1918
|
} catch {
|
|
1769
1919
|
try {
|
|
1770
1920
|
this.voiceConnection.destroy();
|
|
@@ -1782,14 +1932,14 @@ var StreamDispatcher = class extends import_utils5.EventEmitter {
|
|
|
1782
1932
|
this.emit("error", err);
|
|
1783
1933
|
}
|
|
1784
1934
|
}
|
|
1785
|
-
} else if (newState.status ===
|
|
1935
|
+
} else if (newState.status === import_voice4.VoiceConnectionStatus.Destroyed) {
|
|
1786
1936
|
this.end();
|
|
1787
|
-
} else if (!this.readyLock && (newState.status ===
|
|
1937
|
+
} else if (!this.readyLock && (newState.status === import_voice4.VoiceConnectionStatus.Connecting || newState.status === import_voice4.VoiceConnectionStatus.Signalling)) {
|
|
1788
1938
|
this.readyLock = true;
|
|
1789
1939
|
try {
|
|
1790
|
-
await (0,
|
|
1940
|
+
await (0, import_voice4.entersState)(this.voiceConnection, import_voice4.VoiceConnectionStatus.Ready, this.connectionTimeout);
|
|
1791
1941
|
} catch {
|
|
1792
|
-
if (this.voiceConnection.state.status !==
|
|
1942
|
+
if (this.voiceConnection.state.status !== import_voice4.VoiceConnectionStatus.Destroyed) {
|
|
1793
1943
|
try {
|
|
1794
1944
|
this.voiceConnection.destroy();
|
|
1795
1945
|
} catch (err) {
|
|
@@ -1802,11 +1952,11 @@ var StreamDispatcher = class extends import_utils5.EventEmitter {
|
|
|
1802
1952
|
}
|
|
1803
1953
|
});
|
|
1804
1954
|
this.audioPlayer.on("stateChange", (oldState, newState) => {
|
|
1805
|
-
if (newState.status ===
|
|
1806
|
-
if (oldState.status ===
|
|
1955
|
+
if (newState.status === import_voice4.AudioPlayerStatus.Playing) {
|
|
1956
|
+
if (oldState.status === import_voice4.AudioPlayerStatus.Idle || oldState.status === import_voice4.AudioPlayerStatus.Buffering) {
|
|
1807
1957
|
return this.emit("start", this.audioResource);
|
|
1808
1958
|
}
|
|
1809
|
-
} else if (newState.status ===
|
|
1959
|
+
} else if (newState.status === import_voice4.AudioPlayerStatus.Idle && oldState.status !== import_voice4.AudioPlayerStatus.Idle) {
|
|
1810
1960
|
this.emit("finish", this.audioResource);
|
|
1811
1961
|
this.dsp.destroy();
|
|
1812
1962
|
this.audioResource = null;
|
|
@@ -1817,22 +1967,22 @@ var StreamDispatcher = class extends import_utils5.EventEmitter {
|
|
|
1817
1967
|
this.voiceConnection.subscribe(this.audioPlayer);
|
|
1818
1968
|
}
|
|
1819
1969
|
get paused() {
|
|
1820
|
-
return this.audioPlayer.state.status ===
|
|
1970
|
+
return this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.Paused;
|
|
1821
1971
|
}
|
|
1822
1972
|
set paused(val) {
|
|
1823
1973
|
val ? this.pause(true) : this.resume();
|
|
1824
1974
|
}
|
|
1825
1975
|
isPaused() {
|
|
1826
|
-
return this.paused || this.audioPlayer.state.status ===
|
|
1976
|
+
return this.paused || this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.AutoPaused;
|
|
1827
1977
|
}
|
|
1828
1978
|
isBuffering() {
|
|
1829
|
-
return this.audioPlayer.state.status ===
|
|
1979
|
+
return this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.Buffering;
|
|
1830
1980
|
}
|
|
1831
1981
|
isPlaying() {
|
|
1832
|
-
return this.audioPlayer.state.status ===
|
|
1982
|
+
return this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.Playing;
|
|
1833
1983
|
}
|
|
1834
1984
|
isIdle() {
|
|
1835
|
-
return this.audioPlayer.state.status ===
|
|
1985
|
+
return this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.Idle;
|
|
1836
1986
|
}
|
|
1837
1987
|
async createStream(src, ops) {
|
|
1838
1988
|
if (!ops?.disableFilters)
|
|
@@ -1863,12 +2013,12 @@ var StreamDispatcher = class extends import_utils5.EventEmitter {
|
|
|
1863
2013
|
const postStream = await this.queue.onAfterCreateStream?.(stream, this.queue).catch(
|
|
1864
2014
|
() => ({
|
|
1865
2015
|
stream,
|
|
1866
|
-
type: ops?.type ??
|
|
2016
|
+
type: ops?.type ?? import_voice4.StreamType.Arbitrary
|
|
1867
2017
|
})
|
|
1868
2018
|
);
|
|
1869
2019
|
this.queue.debug("Preparing AudioResource...");
|
|
1870
|
-
this.audioResource = (0,
|
|
1871
|
-
inputType: postStream?.type ?? ops?.type ??
|
|
2020
|
+
this.audioResource = (0, import_voice4.createAudioResource)(postStream?.stream ?? stream, {
|
|
2021
|
+
inputType: postStream?.type ?? ops?.type ?? import_voice4.StreamType.Arbitrary,
|
|
1872
2022
|
metadata: ops?.data,
|
|
1873
2023
|
inlineVolume: false
|
|
1874
2024
|
});
|
|
@@ -1916,9 +2066,9 @@ var StreamDispatcher = class extends import_utils5.EventEmitter {
|
|
|
1916
2066
|
}
|
|
1917
2067
|
if (!this.audioResource)
|
|
1918
2068
|
this.audioResource = resource;
|
|
1919
|
-
if (this.voiceConnection.state.status !==
|
|
2069
|
+
if (this.voiceConnection.state.status !== import_voice4.VoiceConnectionStatus.Ready) {
|
|
1920
2070
|
try {
|
|
1921
|
-
await (0,
|
|
2071
|
+
await (0, import_voice4.entersState)(this.voiceConnection, import_voice4.VoiceConnectionStatus.Ready, this.connectionTimeout);
|
|
1922
2072
|
} catch (err) {
|
|
1923
2073
|
return void this.emit("error", err);
|
|
1924
2074
|
}
|
|
@@ -1949,10 +2099,10 @@ var StreamDispatcher = class extends import_utils5.EventEmitter {
|
|
|
1949
2099
|
__name(StreamDispatcher, "StreamDispatcher");
|
|
1950
2100
|
|
|
1951
2101
|
// src/VoiceInterface/VoiceUtils.ts
|
|
1952
|
-
var
|
|
2102
|
+
var import_utils7 = require("@discord-player/utils");
|
|
1953
2103
|
var VoiceUtils = class {
|
|
1954
2104
|
constructor() {
|
|
1955
|
-
this.cache = new
|
|
2105
|
+
this.cache = new import_utils7.Collection();
|
|
1956
2106
|
}
|
|
1957
2107
|
async connect(channel, options) {
|
|
1958
2108
|
if (!options?.queue)
|
|
@@ -1963,7 +2113,7 @@ var VoiceUtils = class {
|
|
|
1963
2113
|
return sub;
|
|
1964
2114
|
}
|
|
1965
2115
|
async join(channel, options) {
|
|
1966
|
-
const conn = (0,
|
|
2116
|
+
const conn = (0, import_voice5.joinVoiceChannel)({
|
|
1967
2117
|
guildId: channel.guild.id,
|
|
1968
2118
|
channelId: channel.id,
|
|
1969
2119
|
adapterCreator: channel.guild.voiceAdapterCreator,
|
|
@@ -1977,7 +2127,7 @@ var VoiceUtils = class {
|
|
|
1977
2127
|
return connection.destroy();
|
|
1978
2128
|
}
|
|
1979
2129
|
getConnection(guild) {
|
|
1980
|
-
return this.cache.get(guild) || (0,
|
|
2130
|
+
return this.cache.get(guild) || (0, import_voice5.getVoiceConnection)(guild);
|
|
1981
2131
|
}
|
|
1982
2132
|
};
|
|
1983
2133
|
__name(VoiceUtils, "VoiceUtils");
|
|
@@ -2062,8 +2212,7 @@ __name(DiscordPlayerQueryResultCache, "DiscordPlayerQueryResultCache");
|
|
|
2062
2212
|
|
|
2063
2213
|
// src/Player.ts
|
|
2064
2214
|
var import_discord3 = require("discord.js");
|
|
2065
|
-
var
|
|
2066
|
-
var import_voice5 = require("@discordjs/voice");
|
|
2215
|
+
var import_voice6 = require("@discordjs/voice");
|
|
2067
2216
|
|
|
2068
2217
|
// src/utils/__internal__/_container.ts
|
|
2069
2218
|
var instances = /* @__PURE__ */ new Map();
|
|
@@ -2092,19 +2241,18 @@ __name(getPlayers, "getPlayers");
|
|
|
2092
2241
|
// src/Player.ts
|
|
2093
2242
|
var kSingleton = Symbol("InstanceDiscordPlayerSingleton");
|
|
2094
2243
|
var _lastLatency, _voiceStateUpdateListener, _lagMonitorTimeout, _lagMonitorInterval;
|
|
2095
|
-
var _Player = class extends
|
|
2244
|
+
var _Player = class extends PlayerEventsEmitter {
|
|
2096
2245
|
constructor(client, options = {}) {
|
|
2097
|
-
super();
|
|
2098
|
-
this.id = import_discord3.SnowflakeUtil.generate().toString();
|
|
2099
|
-
this.nodes = new GuildNodeManager(this);
|
|
2100
|
-
this.voiceUtils = new VoiceUtils();
|
|
2101
|
-
this.requiredEvents = ["error", "connectionError"];
|
|
2102
|
-
this.extractors = new ExtractorExecutionContext(this);
|
|
2103
|
-
this.events = new import_utils7.EventEmitter();
|
|
2246
|
+
super(["error"]);
|
|
2104
2247
|
__privateAdd(this, _lastLatency, -1);
|
|
2105
2248
|
__privateAdd(this, _voiceStateUpdateListener, this.handleVoiceState.bind(this));
|
|
2106
2249
|
__privateAdd(this, _lagMonitorTimeout, void 0);
|
|
2107
2250
|
__privateAdd(this, _lagMonitorInterval, void 0);
|
|
2251
|
+
this.id = import_discord3.SnowflakeUtil.generate().toString();
|
|
2252
|
+
this.nodes = new GuildNodeManager(this);
|
|
2253
|
+
this.voiceUtils = new VoiceUtils();
|
|
2254
|
+
this.extractors = new ExtractorExecutionContext(this);
|
|
2255
|
+
this.events = new PlayerEventsEmitter(["error", "playerError"]);
|
|
2108
2256
|
this.client = client;
|
|
2109
2257
|
if (this.client?.options?.intents && !new import_discord3.IntentsBitField(this.client?.options?.intents).has(import_discord3.IntentsBitField.Flags.GuildVoiceStates)) {
|
|
2110
2258
|
Util.warn('client is missing "GuildVoiceStates" intent', "InvalidIntentsBitField");
|
|
@@ -2126,21 +2274,30 @@ var _Player = class extends import_utils7.EventEmitter {
|
|
|
2126
2274
|
};
|
|
2127
2275
|
this.client.on("voiceStateUpdate", __privateGet(this, _voiceStateUpdateListener));
|
|
2128
2276
|
if (this.options?.autoRegisterExtractor) {
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2277
|
+
this.extractors.loadDefault().then((r) => {
|
|
2278
|
+
if (r.error) {
|
|
2279
|
+
this.emit("error", new Error(`Failed to load default extractors: ${r.error?.stack ?? r.error}`));
|
|
2280
|
+
} else {
|
|
2281
|
+
this.debug("Default extractors loaded!");
|
|
2282
|
+
}
|
|
2283
|
+
this.debug(`[Dependencies Report]
|
|
2284
|
+
${this.scanDeps()}`);
|
|
2285
|
+
});
|
|
2133
2286
|
}
|
|
2134
2287
|
if (typeof this.options.lagMonitor === "number" && this.options.lagMonitor > 0) {
|
|
2135
2288
|
__privateSet(this, _lagMonitorInterval, setInterval(() => {
|
|
2136
2289
|
const start = performance.now();
|
|
2137
2290
|
__privateSet(this, _lagMonitorTimeout, setTimeout(() => {
|
|
2138
2291
|
__privateSet(this, _lastLatency, performance.now() - start);
|
|
2292
|
+
this.debug(`[Lag Monitor] Event loop latency: ${__privateGet(this, _lastLatency)}ms`);
|
|
2139
2293
|
}, 0).unref());
|
|
2140
2294
|
}, this.options.lagMonitor).unref());
|
|
2141
2295
|
}
|
|
2142
2296
|
addPlayer(this);
|
|
2143
2297
|
}
|
|
2298
|
+
debug(m) {
|
|
2299
|
+
return this.emit("debug", m);
|
|
2300
|
+
}
|
|
2144
2301
|
static singleton(client, options = {}) {
|
|
2145
2302
|
if (!(kSingleton in _Player)) {
|
|
2146
2303
|
Object.defineProperty(_Player, kSingleton, {
|
|
@@ -2321,7 +2478,8 @@ var _Player = class extends import_utils7.EventEmitter {
|
|
|
2321
2478
|
if (options.requestedBy != null)
|
|
2322
2479
|
options.requestedBy = this.client.users.resolve(options.requestedBy);
|
|
2323
2480
|
options.blockExtractors ?? (options.blockExtractors = this.options.blockExtractors);
|
|
2324
|
-
if (query instanceof Track)
|
|
2481
|
+
if (query instanceof Track) {
|
|
2482
|
+
this.debug(`Searching ${query.title}`);
|
|
2325
2483
|
return new SearchResult(this, {
|
|
2326
2484
|
playlist: query.playlist || null,
|
|
2327
2485
|
tracks: [query],
|
|
@@ -2330,9 +2488,13 @@ var _Player = class extends import_utils7.EventEmitter {
|
|
|
2330
2488
|
queryType: query.queryType,
|
|
2331
2489
|
requestedBy: options.requestedBy
|
|
2332
2490
|
});
|
|
2491
|
+
}
|
|
2492
|
+
this.debug(`Searching ${query}`);
|
|
2333
2493
|
let extractor = null;
|
|
2334
2494
|
options.searchEngine ?? (options.searchEngine = QueryType.AUTO);
|
|
2495
|
+
this.debug(`Search engine set to ${options.searchEngine}`);
|
|
2335
2496
|
const queryType = options.searchEngine === QueryType.AUTO ? QueryResolver.resolve(query) : options.searchEngine;
|
|
2497
|
+
this.debug(`Query type identified as ${queryType}`);
|
|
2336
2498
|
if (options.searchEngine.startsWith("ext:")) {
|
|
2337
2499
|
extractor = this.extractors.get(options.searchEngine.substring(4));
|
|
2338
2500
|
if (!extractor)
|
|
@@ -2340,14 +2502,19 @@ var _Player = class extends import_utils7.EventEmitter {
|
|
|
2340
2502
|
}
|
|
2341
2503
|
if (!extractor) {
|
|
2342
2504
|
if (!options.ignoreCache) {
|
|
2505
|
+
this.debug(`Checking cache...`);
|
|
2343
2506
|
const res2 = await this.queryCache?.resolve({
|
|
2344
2507
|
query,
|
|
2345
2508
|
queryType,
|
|
2346
2509
|
requestedBy: options.requestedBy
|
|
2347
2510
|
});
|
|
2348
|
-
if (res2?.hasTracks())
|
|
2511
|
+
if (res2?.hasTracks()) {
|
|
2512
|
+
this.debug(`Cache hit for query ${query}`);
|
|
2349
2513
|
return res2;
|
|
2514
|
+
}
|
|
2515
|
+
this.debug(`Cache miss for query ${query}`);
|
|
2350
2516
|
}
|
|
2517
|
+
this.debug(`Executing extractors...`);
|
|
2351
2518
|
extractor = (await this.extractors.run(async (ext) => {
|
|
2352
2519
|
if (options.blockExtractors?.includes(ext.identifier))
|
|
2353
2520
|
return false;
|
|
@@ -2355,13 +2522,16 @@ var _Player = class extends import_utils7.EventEmitter {
|
|
|
2355
2522
|
}))?.extractor || null;
|
|
2356
2523
|
}
|
|
2357
2524
|
if (!extractor) {
|
|
2525
|
+
this.debug("Failed to find appropriate extractor");
|
|
2358
2526
|
return new SearchResult(this, { query, queryType });
|
|
2359
2527
|
}
|
|
2528
|
+
this.debug(`Executing metadata query using ${extractor.identifier} extractor...`);
|
|
2360
2529
|
const res = await extractor.handle(query, {
|
|
2361
2530
|
type: queryType,
|
|
2362
2531
|
requestedBy: options.requestedBy
|
|
2363
2532
|
}).catch(() => null);
|
|
2364
2533
|
if (res) {
|
|
2534
|
+
this.debug("Metadata query was successful!");
|
|
2365
2535
|
const result2 = new SearchResult(this, {
|
|
2366
2536
|
query,
|
|
2367
2537
|
queryType,
|
|
@@ -2370,18 +2540,23 @@ var _Player = class extends import_utils7.EventEmitter {
|
|
|
2370
2540
|
extractor
|
|
2371
2541
|
});
|
|
2372
2542
|
if (!options.ignoreCache) {
|
|
2543
|
+
this.debug(`Adding data to cache...`);
|
|
2373
2544
|
await this.queryCache?.addData(result2);
|
|
2374
2545
|
}
|
|
2375
2546
|
return result2;
|
|
2376
2547
|
}
|
|
2548
|
+
this.debug("Failed to find result using appropriate extractor. Querying all extractors...");
|
|
2377
2549
|
const result = await this.extractors.run(
|
|
2378
2550
|
async (ext) => !options.blockExtractors?.includes(ext.identifier) && await ext.validate(query) && ext.handle(query, {
|
|
2379
2551
|
type: queryType,
|
|
2380
2552
|
requestedBy: options.requestedBy
|
|
2381
2553
|
})
|
|
2382
2554
|
);
|
|
2383
|
-
if (!result?.result)
|
|
2555
|
+
if (!result?.result) {
|
|
2556
|
+
this.debug(`Failed to query metadata query using ${result?.extractor.identifier || "N/A"} extractor.`);
|
|
2384
2557
|
return new SearchResult(this, { query, queryType });
|
|
2558
|
+
}
|
|
2559
|
+
this.debug(`Metadata query was successful using ${result.extractor.identifier}!`);
|
|
2385
2560
|
const data = new SearchResult(this, {
|
|
2386
2561
|
query,
|
|
2387
2562
|
queryType,
|
|
@@ -2390,13 +2565,14 @@ var _Player = class extends import_utils7.EventEmitter {
|
|
|
2390
2565
|
extractor: result.extractor
|
|
2391
2566
|
});
|
|
2392
2567
|
if (!options.ignoreCache) {
|
|
2568
|
+
this.debug(`Adding data to cache...`);
|
|
2393
2569
|
await this.queryCache?.addData(data);
|
|
2394
2570
|
}
|
|
2395
2571
|
return data;
|
|
2396
2572
|
}
|
|
2397
2573
|
scanDeps() {
|
|
2398
2574
|
const line = "-".repeat(50);
|
|
2399
|
-
const depsReport = (0,
|
|
2575
|
+
const depsReport = (0, import_voice6.generateDependencyReport)();
|
|
2400
2576
|
const extractorReport = this.extractors.store.map((m) => {
|
|
2401
2577
|
return m.identifier;
|
|
2402
2578
|
}).join("\n");
|
|
@@ -2405,15 +2581,6 @@ Loaded Extractors:
|
|
|
2405
2581
|
${extractorReport || "None"}
|
|
2406
2582
|
${line}`;
|
|
2407
2583
|
}
|
|
2408
|
-
emit(eventName, ...args) {
|
|
2409
|
-
if (this.requiredEvents.includes(eventName) && !super.eventNames().includes(eventName)) {
|
|
2410
|
-
console.error(...args);
|
|
2411
|
-
Util.warn(`Unhandled "${eventName}" event! Events ${this.requiredEvents.map((m) => `"${m}"`).join(", ")} must have event listeners!`, "UnhandledEventWarning");
|
|
2412
|
-
return false;
|
|
2413
|
-
} else {
|
|
2414
|
-
return super.emit(eventName, ...args);
|
|
2415
|
-
}
|
|
2416
|
-
}
|
|
2417
2584
|
*[Symbol.iterator]() {
|
|
2418
2585
|
yield* this.nodes.cache.values();
|
|
2419
2586
|
}
|
|
@@ -2431,7 +2598,7 @@ Player._singletonKey = kSingleton;
|
|
|
2431
2598
|
|
|
2432
2599
|
// src/index.ts
|
|
2433
2600
|
var import_equalizer3 = require("@discord-player/equalizer");
|
|
2434
|
-
var version = "6.0.0-dev.
|
|
2601
|
+
var version = "6.0.0-dev.4";
|
|
2435
2602
|
if (!import_discord4.version.startsWith("14")) {
|
|
2436
2603
|
process.emitWarning(`Discord.js v${import_discord4.version} is incompatible with Discord Player v${version}! Please use >=v14.x of Discord.js`);
|
|
2437
2604
|
}
|
|
@@ -2444,7 +2611,6 @@ if (!import_discord4.version.startsWith("14")) {
|
|
|
2444
2611
|
BASS_EQ_BANDS,
|
|
2445
2612
|
BaseExtractor,
|
|
2446
2613
|
BiquadFilterType,
|
|
2447
|
-
BiquadFilters,
|
|
2448
2614
|
DiscordPlayerQueryResultCache,
|
|
2449
2615
|
EqualizerConfigurationPreset,
|
|
2450
2616
|
ErrorStatusCode,
|
|
@@ -2460,9 +2626,9 @@ if (!import_discord4.version.startsWith("14")) {
|
|
|
2460
2626
|
GuildQueueHistory,
|
|
2461
2627
|
GuildQueuePlayerNode,
|
|
2462
2628
|
PCMAudioFilters,
|
|
2463
|
-
PCMFilters,
|
|
2464
2629
|
Player,
|
|
2465
2630
|
PlayerError,
|
|
2631
|
+
PlayerEventsEmitter,
|
|
2466
2632
|
Playlist,
|
|
2467
2633
|
Q_BUTTERWORTH,
|
|
2468
2634
|
QueryCache,
|
|
@@ -2472,6 +2638,7 @@ if (!import_discord4.version.startsWith("14")) {
|
|
|
2472
2638
|
StreamDispatcher,
|
|
2473
2639
|
Track,
|
|
2474
2640
|
Util,
|
|
2641
|
+
VoiceReceiverNode,
|
|
2475
2642
|
VoiceUtils,
|
|
2476
2643
|
VolumeTransformer,
|
|
2477
2644
|
createFFmpegStream,
|