discord-player 6.0.0-dev.4 → 6.0.0-dev.5

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 CHANGED
@@ -8,7 +8,6 @@ import * as _discord_player_equalizer from '@discord-player/equalizer';
8
8
  import { PCMFilters, EqualizerBand, BiquadFilters, FiltersChain } from '@discord-player/equalizer';
9
9
  export { AF_NIGHTCORE_RATE, AF_VAPORWAVE_RATE, BASS_EQ_BANDS, FilterType as BiquadFilterType, BiquadFilters, FiltersChain, AudioFilters as PCMAudioFilters, PCMFilters, Q_BUTTERWORTH, VolumeTransformer } from '@discord-player/equalizer';
10
10
  import { RequestOptions } from 'http';
11
- import Fuse from 'fuse.js';
12
11
  import { downloadOptions } from 'ytdl-core';
13
12
 
14
13
  declare class PlayerEventsEmitter<L extends ListenerSignature<L> = DefaultListener> extends EventEmitter<L> {
@@ -39,6 +38,14 @@ declare class Playlist {
39
38
  */
40
39
  constructor(player: Player, data: PlaylistInitData);
41
40
  [Symbol.iterator](): Generator<Track, void, undefined>;
41
+ /**
42
+ * Estimated duration of this playlist
43
+ */
44
+ get estimatedDuration(): number;
45
+ /**
46
+ * Formatted estimated duration of this playlist
47
+ */
48
+ get durationFormatted(): string;
42
49
  /**
43
50
  * JSON representation of this playlist
44
51
  * @param {boolean} [withTracks=true] If it should build json with tracks
@@ -258,6 +265,26 @@ declare class StreamDispatcher extends EventEmitter<VoiceEvents> {
258
265
  * Whether or not the player is currently idle
259
266
  */
260
267
  isIdle(): boolean;
268
+ /**
269
+ * Whether or not the voice connection has been destroyed
270
+ */
271
+ isDestroyed(): boolean;
272
+ /**
273
+ * Whether or not the voice connection has been destroyed
274
+ */
275
+ isDisconnected(): boolean;
276
+ /**
277
+ * Whether or not the voice connection is ready to play
278
+ */
279
+ isReady(): boolean;
280
+ /**
281
+ * Whether or not the voice connection is signalling
282
+ */
283
+ isSignalling(): boolean;
284
+ /**
285
+ * Whether or not the voice connection is connecting
286
+ */
287
+ isConnecting(): boolean;
261
288
  /**
262
289
  * Creates stream
263
290
  * @param {Readable} src The stream source
@@ -363,6 +390,11 @@ declare class GuildQueueHistory<Meta = unknown> {
363
390
  * If history is disabled
364
391
  */
365
392
  get disabled(): boolean;
393
+ /**
394
+ * Gets the size of the queue
395
+ */
396
+ get size(): number;
397
+ getSize(): number;
366
398
  /**
367
399
  * If history is empty
368
400
  */
@@ -383,7 +415,7 @@ declare class GuildQueueHistory<Meta = unknown> {
383
415
  /**
384
416
  * Play the previous track in the queue
385
417
  */
386
- previous(): Promise<void>;
418
+ previous(preserveCurrent?: boolean): Promise<void>;
387
419
  /**
388
420
  * Alias to [GuildQueueHistory].previous()
389
421
  */
@@ -772,6 +804,18 @@ interface GuildQueueEvents<Meta = unknown> {
772
804
  * @param tracks The tracks array
773
805
  */
774
806
  audioTracksAdd: (queue: GuildQueue<Meta>, track: Track[]) => unknown;
807
+ /**
808
+ * Emitted when audio track is removed from the queue
809
+ * @param queue The queue where this event occurred
810
+ * @param track The track
811
+ */
812
+ audioTrackRemove: (queue: GuildQueue<Meta>, track: Track) => unknown;
813
+ /**
814
+ * Emitted when audio tracks are removed from the queue
815
+ * @param queue The queue where this event occurred
816
+ * @param track The track
817
+ */
818
+ audioTracksRemove: (queue: GuildQueue<Meta>, track: Track[]) => unknown;
775
819
  /**
776
820
  * Emitted when a connection is created
777
821
  * @param queue The queue where this event occurred
@@ -859,6 +903,14 @@ declare class GuildQueue<Meta = unknown> {
859
903
  timeouts: Collection<string, NodeJS.Timeout>;
860
904
  stats: GuildQueueStatistics<Meta>;
861
905
  constructor(player: Player, options: GuildNodeInit<Meta>);
906
+ /**
907
+ * Estimated duration of this queue in ms
908
+ */
909
+ get estimatedDuration(): number;
910
+ /**
911
+ * Formatted duration of this queue
912
+ */
913
+ get durationFormatted(): string;
862
914
  /**
863
915
  * The voice receiver for this queue
864
916
  */
@@ -922,6 +974,18 @@ declare class GuildQueue<Meta = unknown> {
922
974
  * @param mode The repeat mode to apply
923
975
  */
924
976
  setRepeatMode(mode: QueueRepeatMode): void;
977
+ /**
978
+ * Gets the size of the queue
979
+ */
980
+ get size(): number;
981
+ /**
982
+ * The size of this queue
983
+ */
984
+ getSize(): number;
985
+ /**
986
+ * Clear this queue
987
+ */
988
+ clear(): void;
925
989
  /**
926
990
  * Check if this queue has no tracks left in it
927
991
  */
@@ -931,7 +995,7 @@ declare class GuildQueue<Meta = unknown> {
931
995
  */
932
996
  isPlaying(): boolean;
933
997
  /**
934
- * Add track to the queue
998
+ * Add track to the queue. This will emit `audioTracksAdd` when multiple tracks are added, otherwise `audioTrackAdd`.
935
999
  * @param track Track or playlist or array of tracks to add
936
1000
  */
937
1001
  addTrack(track: Track | Track[] | Playlist): void;
@@ -1067,6 +1131,12 @@ declare class SearchResult {
1067
1131
  player: Player;
1068
1132
  private _data;
1069
1133
  constructor(player: Player, _data: SearchResultData);
1134
+ setQueryType(type: SearchQueryType | QueryExtractorSearch): this;
1135
+ setRequestedBy(user: User): this;
1136
+ setExtractor(extractor: BaseExtractor): this;
1137
+ setTracks(tracks: Track[]): this;
1138
+ setQuery(query: string): this;
1139
+ setPlaylist(playlist: Playlist): this;
1070
1140
  /**
1071
1141
  * The search query
1072
1142
  */
@@ -1128,7 +1198,6 @@ declare class QueryCache {
1128
1198
  player: Player;
1129
1199
  options: QueryCacheOptions;
1130
1200
  timer: NodeJS.Timer;
1131
- fuse: Fuse<Track>;
1132
1201
  constructor(player: Player, options?: QueryCacheOptions);
1133
1202
  get checkInterval(): number;
1134
1203
  cleanup(): Promise<void>;
@@ -1663,6 +1732,7 @@ interface PlaylistJSON {
1663
1732
  * @property {string[]} [blockExtractors] List of extractors to disable querying metadata from
1664
1733
  * @property {string[]} [blockStreamFrom] List of extractors to disable streaming from
1665
1734
  * @property {QueryCache | null} [queryCache] Query cache provider
1735
+ * @property {boolean} [ignoreInstance] Ignore player instance
1666
1736
  */
1667
1737
  interface PlayerInitOptions {
1668
1738
  autoRegisterExtractor?: boolean;
@@ -1674,6 +1744,7 @@ interface PlayerInitOptions {
1674
1744
  blockExtractors?: string[];
1675
1745
  blockStreamFrom?: string[];
1676
1746
  queryCache?: QueryCache | null;
1747
+ ignoreInstance?: boolean;
1677
1748
  }
1678
1749
 
1679
1750
  declare class AudioFilters {
@@ -1775,6 +1846,44 @@ declare class Util {
1775
1846
  static warn(message: string, code?: string, detail?: string): void;
1776
1847
  }
1777
1848
 
1849
+ declare class QueryResolver {
1850
+ /**
1851
+ * Query resolver
1852
+ */
1853
+ private constructor();
1854
+ static get regex(): {
1855
+ spotifyAlbumRegex: RegExp;
1856
+ spotifyPlaylistRegex: RegExp;
1857
+ spotifySongRegex: RegExp;
1858
+ vimeoRegex: RegExp;
1859
+ reverbnationRegex: RegExp;
1860
+ attachmentRegex: RegExp;
1861
+ appleMusicAlbumRegex: RegExp;
1862
+ appleMusicPlaylistRegex: RegExp;
1863
+ appleMusicSongRegex: RegExp;
1864
+ };
1865
+ /**
1866
+ * Resolves the given search query
1867
+ * @param {string} query The query
1868
+ * @returns {QueryType}
1869
+ */
1870
+ static resolve(query: string): (typeof QueryType)[keyof typeof QueryType];
1871
+ /**
1872
+ * Parses vimeo id from url
1873
+ * @param {string} query The query
1874
+ * @returns {string}
1875
+ */
1876
+ static getVimeoID(query: string): string | null | undefined;
1877
+ static validateId(q: string): boolean;
1878
+ static validateURL(q: string): boolean;
1879
+ }
1880
+
1881
+ declare function useHistory<Meta = unknown>(node: NodeResolvable): GuildQueueHistory<Meta> | null;
1882
+
1883
+ declare function usePlayer<Meta = unknown>(node: NodeResolvable): GuildQueuePlayerNode<Meta> | null;
1884
+
1885
+ declare function useQueue<Meta = unknown>(node: NodeResolvable): GuildQueue<Meta> | null;
1886
+
1778
1887
  declare const version: string;
1779
1888
 
1780
- export { AFilterGraph, AudioFilters, BaseExtractor, DiscordPlayerQueryResultCache, EqualizerConfigurationPreset, ErrorStatusCode, ExtractorExecutionContext, ExtractorExecutionFN, ExtractorExecutionResult, ExtractorInfo, ExtractorSearchContext, FFMPEG_ARGS_PIPED, FFMPEG_ARGS_STRING, FFMPEG_SRATE_REGEX, FFmpegFilterer, FFmpegStreamOptions, FilterGraph, FiltersName, GuildNodeCreateOptions, GuildNodeInit, GuildNodeManager, GuildQueue, GuildQueueAFiltersCache, GuildQueueAudioFilters, GuildQueueEvents, GuildQueueHistory, GuildQueuePlayerNode, NextFunction, NodeResolvable, OnAfterCreateStreamHandler, OnBeforeCreateStreamHandler, PlayOptions, Player, PlayerError, PlayerEvents, PlayerEventsEmitter, PlayerInitOptions, PlayerProgressbarOptions, PlayerSearchResult, PlayerTimestamp, PlayerTriggeredReason, Playlist, PlaylistInitData, PlaylistJSON, PostProcessedResult, QueryCache, QueryCacheOptions, QueryCacheResolverContext, QueryExtractorSearch, QueryType, QueueFilters, QueueRepeatMode, RawTrackData, RawTrackInit, ResourcePlayOptions, SearchOptions, SearchQueryType, SearchResult, SearchResultData, StreamDispatcher, TimeData, Track, TrackJSON, TrackResolvable, TrackSource, Util, VoiceConnectConfig, VoiceEvents, VoiceReceiverNode, VoiceReceiverOptions, VoiceUtils, createFFmpegStream, version };
1889
+ export { AFilterGraph, AudioFilters, BaseExtractor, DiscordPlayerQueryResultCache, EqualizerConfigurationPreset, ErrorStatusCode, ExtractorExecutionContext, ExtractorExecutionFN, ExtractorExecutionResult, ExtractorInfo, ExtractorSearchContext, FFMPEG_ARGS_PIPED, FFMPEG_ARGS_STRING, FFMPEG_SRATE_REGEX, FFmpegFilterer, FFmpegStreamOptions, FilterGraph, FiltersName, GuildNodeCreateOptions, GuildNodeInit, GuildNodeManager, GuildQueue, GuildQueueAFiltersCache, GuildQueueAudioFilters, GuildQueueEvents, GuildQueueHistory, GuildQueuePlayerNode, NextFunction, NodeResolvable, OnAfterCreateStreamHandler, OnBeforeCreateStreamHandler, PlayOptions, Player, PlayerError, PlayerEvents, PlayerEventsEmitter, PlayerInitOptions, PlayerProgressbarOptions, PlayerSearchResult, PlayerTimestamp, PlayerTriggeredReason, Playlist, PlaylistInitData, PlaylistJSON, PostProcessedResult, QueryCache, QueryCacheOptions, QueryCacheResolverContext, QueryExtractorSearch, QueryResolver, QueryType, QueueFilters, QueueRepeatMode, RawTrackData, RawTrackInit, ResourcePlayOptions, SearchOptions, SearchQueryType, SearchResult, SearchResultData, StreamDispatcher, TimeData, Track, TrackJSON, TrackResolvable, TrackSource, Util, VoiceConnectConfig, VoiceEvents, VoiceReceiverNode, VoiceReceiverOptions, VoiceUtils, createFFmpegStream, useHistory, usePlayer, useQueue, version };
package/dist/index.js CHANGED
@@ -77,6 +77,7 @@ __export(src_exports, {
77
77
  Playlist: () => Playlist,
78
78
  Q_BUTTERWORTH: () => import_equalizer3.Q_BUTTERWORTH,
79
79
  QueryCache: () => QueryCache,
80
+ QueryResolver: () => QueryResolver,
80
81
  QueryType: () => QueryType,
81
82
  QueueRepeatMode: () => QueueRepeatMode,
82
83
  SearchResult: () => SearchResult,
@@ -87,6 +88,9 @@ __export(src_exports, {
87
88
  VoiceUtils: () => VoiceUtils,
88
89
  VolumeTransformer: () => import_equalizer3.VolumeTransformer,
89
90
  createFFmpegStream: () => createFFmpegStream,
91
+ useHistory: () => useHistory,
92
+ usePlayer: () => usePlayer,
93
+ useQueue: () => useQueue,
90
94
  version: () => version
91
95
  });
92
96
  module.exports = __toCommonJS(src_exports);
@@ -487,6 +491,12 @@ var Playlist = class {
487
491
  *[Symbol.iterator]() {
488
492
  yield* this.tracks;
489
493
  }
494
+ get estimatedDuration() {
495
+ return this.tracks.reduce((p, c) => p + c.durationMS, 0);
496
+ }
497
+ get durationFormatted() {
498
+ return Util.buildTimeCode(Util.parseMS(this.estimatedDuration));
499
+ }
490
500
  toJSON(withTracks = true) {
491
501
  const payload = {
492
502
  id: this.id,
@@ -525,6 +535,12 @@ var GuildQueueHistory = class {
525
535
  get disabled() {
526
536
  return this.queue.options.disableHistory;
527
537
  }
538
+ get size() {
539
+ return this.tracks.size;
540
+ }
541
+ getSize() {
542
+ return this.size;
543
+ }
528
544
  isEmpty() {
529
545
  return this.tracks.size < 1;
530
546
  }
@@ -544,14 +560,14 @@ var GuildQueueHistory = class {
544
560
  }
545
561
  this.queue.node.skip();
546
562
  }
547
- async previous() {
563
+ async previous(preserveCurrent = true) {
548
564
  const track = this.tracks.dispatch();
549
565
  if (!track) {
550
566
  throw new Error("No previous track in the queue");
551
567
  }
552
568
  const current = this.currentTrack;
553
569
  await this.queue.node.play(track, { queue: false });
554
- if (current)
570
+ if (current && preserveCurrent)
555
571
  this.queue.node.insert(current, 0);
556
572
  }
557
573
  back() {
@@ -809,6 +825,7 @@ var GuildQueuePlayerNode = class {
809
825
  if (!foundTrack)
810
826
  return null;
811
827
  this.queue.tracks.removeOne((t) => t.id === foundTrack.id);
828
+ this.queue.player.events.emit("audioTrackRemove", this.queue, foundTrack);
812
829
  return foundTrack;
813
830
  }
814
831
  jump(track) {
@@ -835,15 +852,20 @@ var GuildQueuePlayerNode = class {
835
852
  const removed = this.remove(idx);
836
853
  if (!removed)
837
854
  return false;
855
+ const toRemove = this.queue.tracks.store.filter((_, i) => i <= idx);
838
856
  this.queue.tracks.store.splice(0, idx, removed);
857
+ this.queue.player.events.emit("audioTracksRemove", this.queue, toRemove);
839
858
  return this.skip();
840
859
  }
841
860
  insert(track, index = 0) {
842
861
  if (!(track instanceof Track))
843
862
  throw new Error("invalid track");
844
863
  this.queue.tracks.store.splice(index, 0, track);
864
+ this.queue.player.events.emit("audioTrackAdd", this.queue, track);
845
865
  }
846
866
  stop(force = false) {
867
+ this.queue.tracks.clear();
868
+ this.queue.history.clear();
847
869
  if (!this.queue.dispatcher)
848
870
  return false;
849
871
  this.queue.dispatcher.end();
@@ -879,7 +901,7 @@ var GuildQueuePlayerNode = class {
879
901
  );
880
902
  if (res && options.queue) {
881
903
  this.queue.debug("Requested option requires to queue the track, adding the given track to queue instead...");
882
- return this.queue.tracks.add(res);
904
+ return this.queue.addTrack(res);
883
905
  }
884
906
  const track = res || this.queue.tracks.dispatch();
885
907
  if (!track) {
@@ -908,7 +930,7 @@ var GuildQueuePlayerNode = class {
908
930
  this.queue.player.events.emit("playerSkip", this.queue, track);
909
931
  this.queue.player.events.emit("playerError", this.queue, error, track);
910
932
  this.queue.initializing = false;
911
- this.play(this.queue.tracks.dispatch());
933
+ this.play(this.queue.tracks.dispatch(), { queue: false });
912
934
  return;
913
935
  }
914
936
  throw error;
@@ -1303,7 +1325,7 @@ var GuildQueueStatistics = class {
1303
1325
  memoryUsage: process.memoryUsage(),
1304
1326
  versions: {
1305
1327
  node: process.version,
1306
- player: "6.0.0-dev.4"
1328
+ player: "6.0.0-dev.5"
1307
1329
  }
1308
1330
  };
1309
1331
  }
@@ -1365,6 +1387,12 @@ var GuildQueue = class {
1365
1387
  }
1366
1388
  this.debug(`GuildQueue initialized for guild ${this.options.guild.name} (ID: ${this.options.guild.id})`);
1367
1389
  }
1390
+ get estimatedDuration() {
1391
+ return this.tracks.store.reduce((a, c) => a + c.durationMS, 0);
1392
+ }
1393
+ get durationFormatted() {
1394
+ return Util.buildTimeCode(Util.parseMS(this.estimatedDuration));
1395
+ }
1368
1396
  get voiceReceiver() {
1369
1397
  return this.dispatcher?.receiver ?? null;
1370
1398
  }
@@ -1424,6 +1452,16 @@ var GuildQueue = class {
1424
1452
  setRepeatMode(mode) {
1425
1453
  this.repeatMode = mode;
1426
1454
  }
1455
+ get size() {
1456
+ return this.tracks.size;
1457
+ }
1458
+ getSize() {
1459
+ return this.size;
1460
+ }
1461
+ clear() {
1462
+ this.tracks.clear();
1463
+ this.history.clear();
1464
+ }
1427
1465
  isEmpty() {
1428
1466
  return this.tracks.size < 1;
1429
1467
  }
@@ -1435,7 +1473,6 @@ var GuildQueue = class {
1435
1473
  this.tracks.add(toAdd);
1436
1474
  const isMulti = Array.isArray(toAdd);
1437
1475
  if (isMulti) {
1438
- this.player.events.emit("audioTrackAdd", this, toAdd[0]);
1439
1476
  this.player.events.emit("audioTracksAdd", this, toAdd);
1440
1477
  } else {
1441
1478
  this.player.events.emit("audioTrackAdd", this, toAdd);
@@ -1784,6 +1821,30 @@ var SearchResult = class {
1784
1821
  track.extractor = this._data.extractor || null;
1785
1822
  });
1786
1823
  }
1824
+ setQueryType(type) {
1825
+ this._data.queryType = type;
1826
+ return this;
1827
+ }
1828
+ setRequestedBy(user) {
1829
+ this._data.requestedBy = user;
1830
+ return this;
1831
+ }
1832
+ setExtractor(extractor) {
1833
+ this._data.extractor = extractor;
1834
+ return this;
1835
+ }
1836
+ setTracks(tracks) {
1837
+ this._data.tracks = tracks;
1838
+ return this;
1839
+ }
1840
+ setQuery(query) {
1841
+ this._data.query = query;
1842
+ return this;
1843
+ }
1844
+ setPlaylist(playlist) {
1845
+ this._data.playlist = playlist;
1846
+ return this;
1847
+ }
1787
1848
  get query() {
1788
1849
  return this._data.query;
1789
1850
  }
@@ -1917,7 +1978,8 @@ var StreamDispatcher = class extends import_utils6.EventEmitter {
1917
1978
  await (0, import_voice4.entersState)(this.voiceConnection, import_voice4.VoiceConnectionStatus.Connecting, this.connectionTimeout);
1918
1979
  } catch {
1919
1980
  try {
1920
- this.voiceConnection.destroy();
1981
+ if (this.voiceConnection.state.status !== import_voice4.VoiceConnectionStatus.Destroyed)
1982
+ this.voiceConnection.destroy();
1921
1983
  } catch (err) {
1922
1984
  this.emit("error", err);
1923
1985
  }
@@ -1927,7 +1989,8 @@ var StreamDispatcher = class extends import_utils6.EventEmitter {
1927
1989
  this.voiceConnection.rejoin();
1928
1990
  } else {
1929
1991
  try {
1930
- this.voiceConnection.destroy();
1992
+ if (this.voiceConnection.state.status !== import_voice4.VoiceConnectionStatus.Destroyed)
1993
+ this.voiceConnection.destroy();
1931
1994
  } catch (err) {
1932
1995
  this.emit("error", err);
1933
1996
  }
@@ -1964,6 +2027,8 @@ var StreamDispatcher = class extends import_utils6.EventEmitter {
1964
2027
  });
1965
2028
  this.audioPlayer.on("debug", (m) => void this.emit("debug", m));
1966
2029
  this.audioPlayer.on("error", (error) => void this.emit("error", error));
2030
+ this.voiceConnection.on("debug", (m) => void this.emit("debug", m));
2031
+ this.voiceConnection.on("error", (error) => void this.emit("error", error));
1967
2032
  this.voiceConnection.subscribe(this.audioPlayer);
1968
2033
  }
1969
2034
  get paused() {
@@ -1984,6 +2049,21 @@ var StreamDispatcher = class extends import_utils6.EventEmitter {
1984
2049
  isIdle() {
1985
2050
  return this.audioPlayer.state.status === import_voice4.AudioPlayerStatus.Idle;
1986
2051
  }
2052
+ isDestroyed() {
2053
+ return this.voiceConnection.state.status === import_voice4.VoiceConnectionStatus.Destroyed;
2054
+ }
2055
+ isDisconnected() {
2056
+ return this.voiceConnection.state.status === import_voice4.VoiceConnectionStatus.Disconnected;
2057
+ }
2058
+ isReady() {
2059
+ return this.voiceConnection.state.status === import_voice4.VoiceConnectionStatus.Ready;
2060
+ }
2061
+ isSignalling() {
2062
+ return this.voiceConnection.state.status === import_voice4.VoiceConnectionStatus.Signalling;
2063
+ }
2064
+ isConnecting() {
2065
+ return this.voiceConnection.state.status === import_voice4.VoiceConnectionStatus.Connecting;
2066
+ }
1987
2067
  async createStream(src, ops) {
1988
2068
  if (!ops?.disableFilters)
1989
2069
  this.queue.debug("Initiating DSP filters pipeline...");
@@ -2043,12 +2123,16 @@ var StreamDispatcher = class extends import_utils6.EventEmitter {
2043
2123
  try {
2044
2124
  if (this.audioPlayer)
2045
2125
  this.audioPlayer.stop(true);
2046
- this.voiceConnection.destroy();
2126
+ if (this.voiceConnection.state.status !== import_voice4.VoiceConnectionStatus.Destroyed)
2127
+ this.voiceConnection.destroy();
2047
2128
  } catch {
2048
2129
  }
2049
2130
  }
2050
2131
  end() {
2051
- this.audioPlayer.stop();
2132
+ try {
2133
+ this.audioPlayer.stop();
2134
+ } catch {
2135
+ }
2052
2136
  }
2053
2137
  pause(interpolateSilence) {
2054
2138
  const success = this.audioPlayer.pause(interpolateSilence);
@@ -2123,8 +2207,12 @@ var VoiceUtils = class {
2123
2207
  }
2124
2208
  disconnect(connection) {
2125
2209
  if (connection instanceof StreamDispatcher)
2126
- return connection.voiceConnection.destroy();
2127
- return connection.destroy();
2210
+ connection = connection.voiceConnection;
2211
+ try {
2212
+ if (connection.state.status !== import_voice5.VoiceConnectionStatus.Destroyed)
2213
+ return connection.destroy();
2214
+ } catch {
2215
+ }
2128
2216
  }
2129
2217
  getConnection(guild) {
2130
2218
  return this.cache.get(guild) || (0, import_voice5.getVoiceConnection)(guild);
@@ -2133,7 +2221,6 @@ var VoiceUtils = class {
2133
2221
  __name(VoiceUtils, "VoiceUtils");
2134
2222
 
2135
2223
  // src/utils/QueryCache.ts
2136
- var import_fuse = __toESM(require("fuse.js"));
2137
2224
  var DEFAULT_EXPIRY_TIMEOUT = 18e6;
2138
2225
  var _defaultCache;
2139
2226
  var QueryCache = class {
@@ -2143,11 +2230,6 @@ var QueryCache = class {
2143
2230
  this.player = player;
2144
2231
  this.options = options;
2145
2232
  __privateAdd(this, _defaultCache, /* @__PURE__ */ new Map());
2146
- this.fuse = new import_fuse.default([], {
2147
- keys: [
2148
- "url"
2149
- ]
2150
- });
2151
2233
  this.timer = setInterval(this.cleanup.bind(this), this.checkInterval).unref();
2152
2234
  }
2153
2235
  get checkInterval() {
@@ -2174,10 +2256,8 @@ var QueryCache = class {
2174
2256
  });
2175
2257
  }
2176
2258
  async resolve(context) {
2177
- const cacheData = await this.getData();
2178
- this.fuse.setCollection(cacheData.map((m) => m.data));
2179
- const result = this.fuse.search(context.query);
2180
- if (!result.length)
2259
+ const result = __privateGet(this, _defaultCache).get(context.query);
2260
+ if (!result)
2181
2261
  return new SearchResult(this.player, {
2182
2262
  query: context.query,
2183
2263
  requestedBy: context.requestedBy,
@@ -2185,7 +2265,7 @@ var QueryCache = class {
2185
2265
  });
2186
2266
  return new SearchResult(this.player, {
2187
2267
  query: context.query,
2188
- tracks: result.map((m) => m.item),
2268
+ tracks: [result.data],
2189
2269
  playlist: null,
2190
2270
  queryType: context.queryType,
2191
2271
  requestedBy: context.requestedBy
@@ -2243,6 +2323,8 @@ var kSingleton = Symbol("InstanceDiscordPlayerSingleton");
2243
2323
  var _lastLatency, _voiceStateUpdateListener, _lagMonitorTimeout, _lagMonitorInterval;
2244
2324
  var _Player = class extends PlayerEventsEmitter {
2245
2325
  constructor(client, options = {}) {
2326
+ if (!options.ignoreInstance && kSingleton in _Player)
2327
+ return _Player[kSingleton];
2246
2328
  super(["error"]);
2247
2329
  __privateAdd(this, _lastLatency, -1);
2248
2330
  __privateAdd(this, _voiceStateUpdateListener, this.handleVoiceState.bind(this));
@@ -2294,20 +2376,23 @@ ${this.scanDeps()}`);
2294
2376
  }, this.options.lagMonitor).unref());
2295
2377
  }
2296
2378
  addPlayer(this);
2297
- }
2298
- debug(m) {
2299
- return this.emit("debug", m);
2300
- }
2301
- static singleton(client, options = {}) {
2302
2379
  if (!(kSingleton in _Player)) {
2303
2380
  Object.defineProperty(_Player, kSingleton, {
2304
- value: new _Player(client, options),
2381
+ value: this,
2305
2382
  writable: true,
2306
2383
  configurable: true,
2307
2384
  enumerable: false
2308
2385
  });
2309
2386
  }
2310
- return _Player[kSingleton];
2387
+ }
2388
+ debug(m) {
2389
+ return this.emit("debug", m);
2390
+ }
2391
+ static singleton(client, options = {}) {
2392
+ return new _Player(client, {
2393
+ ...options,
2394
+ ignoreInstance: false
2395
+ });
2311
2396
  }
2312
2397
  static getAllPlayers() {
2313
2398
  return getPlayers();
@@ -2351,20 +2436,20 @@ ${this.scanDeps()}`);
2351
2436
  const wasHandled = this.events.emit("voiceStateUpdate", queue, oldState, newState);
2352
2437
  if (wasHandled && !this.options.lockVoiceStateHandler)
2353
2438
  return;
2354
- if (oldState.channelId && !newState.channelId && newState.member.id === newState.guild.members.me.id) {
2439
+ if (oldState.channelId && !newState.channelId && newState.member?.id === newState.guild.members.me?.id) {
2355
2440
  try {
2356
2441
  queue.delete();
2357
2442
  } catch {
2358
2443
  }
2359
2444
  return void this.events.emit("disconnect", queue);
2360
2445
  }
2361
- if (!oldState.channelId && newState.channelId && newState.member.id === newState.guild.members.me.id) {
2446
+ if (!oldState.channelId && newState.channelId && newState.member?.id === newState.guild.members.me?.id) {
2362
2447
  if (newState.serverMute != null && oldState.serverMute !== newState.serverMute) {
2363
2448
  queue.node.setPaused(newState.serverMute);
2364
2449
  } else if (newState.channel?.type === import_discord3.ChannelType.GuildStageVoice && newState.suppress != null && oldState.suppress !== newState.suppress) {
2365
2450
  queue.node.setPaused(newState.suppress);
2366
2451
  if (newState.suppress) {
2367
- newState.guild.members.me.voice.setRequestToSpeak(true).catch(Util.noop);
2452
+ newState.guild.members.me?.voice.setRequestToSpeak(true).catch(Util.noop);
2368
2453
  }
2369
2454
  }
2370
2455
  }
@@ -2391,8 +2476,8 @@ ${this.scanDeps()}`);
2391
2476
  }
2392
2477
  }
2393
2478
  if (oldState.channelId && newState.channelId && oldState.channelId !== newState.channelId) {
2394
- if (newState.member.id === newState.guild.members.me.id) {
2395
- if (queue.connection && newState.member.id === newState.guild.members.me.id)
2479
+ if (newState.member?.id === newState.guild.members.me?.id) {
2480
+ if (queue.connection && newState.member?.id === newState.guild.members.me?.id)
2396
2481
  queue.channel = newState.channel;
2397
2482
  const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);
2398
2483
  const channelEmpty = Util.isVoiceEmpty(queue.channel);
@@ -2461,12 +2546,13 @@ ${this.scanDeps()}`);
2461
2546
  const queue = this.nodes.create(vc.guild, options.nodeOptions);
2462
2547
  if (!queue.channel)
2463
2548
  await queue.connect(vc, options.connectionOptions);
2464
- if (!result.hasPlaylist()) {
2465
- await queue.node.play(result.tracks[0]);
2549
+ if (!result.playlist) {
2550
+ queue.addTrack(result.tracks[0]);
2466
2551
  } else {
2467
2552
  queue.addTrack(result.playlist);
2468
- await queue.node.play();
2469
2553
  }
2554
+ if (!queue.node.isPlaying())
2555
+ await queue.node.play();
2470
2556
  return {
2471
2557
  track: result.tracks[0],
2472
2558
  extractor: result.extractor,
@@ -2596,9 +2682,47 @@ _lagMonitorTimeout = new WeakMap();
2596
2682
  _lagMonitorInterval = new WeakMap();
2597
2683
  Player._singletonKey = kSingleton;
2598
2684
 
2685
+ // src/hooks/common.ts
2686
+ var getPlayer = /* @__PURE__ */ __name(() => {
2687
+ return getPlayers()[0];
2688
+ }, "getPlayer");
2689
+ var getQueue = /* @__PURE__ */ __name((node) => {
2690
+ const player = getPlayer();
2691
+ if (!player)
2692
+ return null;
2693
+ return player.nodes.resolve(node) || null;
2694
+ }, "getQueue");
2695
+
2696
+ // src/hooks/useHistory.ts
2697
+ function useHistory(node) {
2698
+ const queue = getQueue(node);
2699
+ if (!queue)
2700
+ return null;
2701
+ return queue.history;
2702
+ }
2703
+ __name(useHistory, "useHistory");
2704
+
2705
+ // src/hooks/usePlayer.ts
2706
+ function usePlayer(node) {
2707
+ const queue = getQueue(node);
2708
+ if (!queue)
2709
+ return null;
2710
+ return queue.node;
2711
+ }
2712
+ __name(usePlayer, "usePlayer");
2713
+
2714
+ // src/hooks/useQueue.ts
2715
+ function useQueue(node) {
2716
+ const queue = getQueue(node);
2717
+ if (!queue)
2718
+ return null;
2719
+ return queue;
2720
+ }
2721
+ __name(useQueue, "useQueue");
2722
+
2599
2723
  // src/index.ts
2600
2724
  var import_equalizer3 = require("@discord-player/equalizer");
2601
- var version = "6.0.0-dev.4";
2725
+ var version = "6.0.0-dev.5";
2602
2726
  if (!import_discord4.version.startsWith("14")) {
2603
2727
  process.emitWarning(`Discord.js v${import_discord4.version} is incompatible with Discord Player v${version}! Please use >=v14.x of Discord.js`);
2604
2728
  }
@@ -2632,6 +2756,7 @@ if (!import_discord4.version.startsWith("14")) {
2632
2756
  Playlist,
2633
2757
  Q_BUTTERWORTH,
2634
2758
  QueryCache,
2759
+ QueryResolver,
2635
2760
  QueryType,
2636
2761
  QueueRepeatMode,
2637
2762
  SearchResult,
@@ -2642,6 +2767,9 @@ if (!import_discord4.version.startsWith("14")) {
2642
2767
  VoiceUtils,
2643
2768
  VolumeTransformer,
2644
2769
  createFFmpegStream,
2770
+ useHistory,
2771
+ usePlayer,
2772
+ useQueue,
2645
2773
  version
2646
2774
  });
2647
2775
  //# sourceMappingURL=index.js.map