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.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 import_utils = require("@discord-player/utils");
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 import_utils.Collection();
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
- } catch {
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 import_utils4 = require("@discord-player/utils");
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 import_utils3 = require("@discord-player/utils");
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
- Object.defineProperty(this, "raw", { value: Object.assign({}, { source: data.raw?.source ?? data.source }, data.raw ?? data), enumerable: false });
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.source ?? "arbitrary";
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 import_utils2 = require("@discord-player/utils");
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 import_utils2.Queue("LIFO");
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.previousTrack;
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
- this.queue.node.play(track, { queue: true });
497
- this.queue.node.skip();
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 import_soundcloud_scraper = require("soundcloud-scraper");
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 ((0, import_soundcloud_scraper.validateURL)(query, "track"))
629
+ if (soundcloud.validateURL(query, "track"))
569
630
  return QueryType.SOUNDCLOUD_TRACK;
570
- if ((0, import_soundcloud_scraper.validateURL)(query, "playlist") || query.includes("/sets/"))
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 qt = track.queryType || (track.raw.source === "spotify" ? "spotifySong" : track.raw.source === "apple_music" ? "appleMusicSong" : track.raw.source) || "arbitrary";
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 import_prism_media = require("prism-media");
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 import_prism_media.FFmpeg({ shell: false, args });
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.3"
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, _warnIfDeleted, warnIfDeleted_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 import_utils3.Collection();
1341
+ this.timeouts = new import_utils4.Collection();
1272
1342
  this.stats = new GuildQueueStatistics(this);
1273
- this.tracks = new import_utils3.Queue(options.queueStrategy);
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 import_utils4.Collection();
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 import_voice4 = require("@discordjs/voice");
1881
+ var import_voice5 = require("@discordjs/voice");
1733
1882
 
1734
1883
  // src/VoiceInterface/StreamDispatcher.ts
1735
- var import_voice3 = require("@discordjs/voice");
1736
- var import_utils5 = require("@discord-player/utils");
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 import_utils5.EventEmitter {
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, import_voice3.createAudioPlayer)();
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 === import_voice3.VoiceConnectionStatus.Disconnected) {
1765
- if (newState.reason === import_voice3.VoiceConnectionDisconnectReason.WebSocketClose && newState.closeCode === 4014) {
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, import_voice3.entersState)(this.voiceConnection, import_voice3.VoiceConnectionStatus.Connecting, this.connectionTimeout);
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 === import_voice3.VoiceConnectionStatus.Destroyed) {
1935
+ } else if (newState.status === import_voice4.VoiceConnectionStatus.Destroyed) {
1786
1936
  this.end();
1787
- } else if (!this.readyLock && (newState.status === import_voice3.VoiceConnectionStatus.Connecting || newState.status === import_voice3.VoiceConnectionStatus.Signalling)) {
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, import_voice3.entersState)(this.voiceConnection, import_voice3.VoiceConnectionStatus.Ready, this.connectionTimeout);
1940
+ await (0, import_voice4.entersState)(this.voiceConnection, import_voice4.VoiceConnectionStatus.Ready, this.connectionTimeout);
1791
1941
  } catch {
1792
- if (this.voiceConnection.state.status !== import_voice3.VoiceConnectionStatus.Destroyed) {
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 === import_voice3.AudioPlayerStatus.Playing) {
1806
- if (oldState.status === import_voice3.AudioPlayerStatus.Idle || oldState.status === import_voice3.AudioPlayerStatus.Buffering) {
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 === import_voice3.AudioPlayerStatus.Idle && oldState.status !== import_voice3.AudioPlayerStatus.Idle) {
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 === import_voice3.AudioPlayerStatus.Paused;
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 === import_voice3.AudioPlayerStatus.AutoPaused;
1976
+ return this.paused || this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.AutoPaused;
1827
1977
  }
1828
1978
  isBuffering() {
1829
- return this.audioPlayer.state.status === import_voice3.AudioPlayerStatus.Buffering;
1979
+ return this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.Buffering;
1830
1980
  }
1831
1981
  isPlaying() {
1832
- return this.audioPlayer.state.status === import_voice3.AudioPlayerStatus.Playing;
1982
+ return this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.Playing;
1833
1983
  }
1834
1984
  isIdle() {
1835
- return this.audioPlayer.state.status === import_voice3.AudioPlayerStatus.Idle;
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 ?? import_voice3.StreamType.Arbitrary
2016
+ type: ops?.type ?? import_voice4.StreamType.Arbitrary
1867
2017
  })
1868
2018
  );
1869
2019
  this.queue.debug("Preparing AudioResource...");
1870
- this.audioResource = (0, import_voice3.createAudioResource)(postStream?.stream ?? stream, {
1871
- inputType: postStream?.type ?? ops?.type ?? import_voice3.StreamType.Arbitrary,
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 !== import_voice3.VoiceConnectionStatus.Ready) {
2069
+ if (this.voiceConnection.state.status !== import_voice4.VoiceConnectionStatus.Ready) {
1920
2070
  try {
1921
- await (0, import_voice3.entersState)(this.voiceConnection, import_voice3.VoiceConnectionStatus.Ready, this.connectionTimeout);
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 import_utils6 = require("@discord-player/utils");
2102
+ var import_utils7 = require("@discord-player/utils");
1953
2103
  var VoiceUtils = class {
1954
2104
  constructor() {
1955
- this.cache = new import_utils6.Collection();
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, import_voice4.joinVoiceChannel)({
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, import_voice4.getVoiceConnection)(guild);
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 import_utils7 = require("@discord-player/utils");
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 import_utils7.EventEmitter {
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
- let nv;
2130
- if (nv = Util.require("@discord-player/extractor")) {
2131
- ["YouTubeExtractor", "SoundCloudExtractor", "ReverbnationExtractor", "VimeoExtractor", "AttachmentExtractor"].forEach((ext) => void this.extractors.register(nv[ext]));
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, import_voice5.generateDependencyReport)();
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.3";
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,