discord-player 6.4.0 → 6.6.0-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Discord Player
2
2
 
3
- Discord Player is a powerful framework for JavaScript and TypeScript, built on top of **[@discord.js/voice](https://npm.im/@discordjs/voice)** library.
3
+ Discord Player is a powerful framework for JavaScript and TypeScript, built on top of **[@discordjs/voice](https://npm.im/@discordjs/voice)** library.
4
4
  It provides easy set of customizable tools to develop Discord Music bots.
5
5
 
6
6
  [![downloadsBadge](https://img.shields.io/npm/dt/discord-player?style=for-the-badge)](https://npmjs.com/discord-player)
@@ -73,6 +73,8 @@ $ yarn add ytdl-core
73
73
  $ yarn add play-dl
74
74
  # or
75
75
  $ yarn add @distube/ytdl-core
76
+ # or
77
+ $ yarn add yt-stream
76
78
  ```
77
79
 
78
80
  Done with all these? Let's write a simple music bot then.
package/dist/index.d.ts CHANGED
@@ -1,17 +1,16 @@
1
1
  import { ListenerSignature, DefaultListener, EventEmitter, Collection, Queue, QueueStrategy } from '@discord-player/utils';
2
2
  import * as discord_js from 'discord.js';
3
3
  import { User, GuildVoiceChannelResolvable, VoiceChannel, StageChannel, UserResolvable, Guild, VoiceState, VoiceBasedChannel, Snowflake, Client, GuildResolvable } from 'discord.js';
4
- import * as stream from 'stream';
5
- import { Readable, Duplex, DuplexOptions } from 'stream';
4
+ import { Readable, Duplex } from 'stream';
6
5
  import { RequestOptions } from 'http';
7
6
  import * as _discord_player_equalizer from '@discord-player/equalizer';
8
- import { PCMFilters, EqualizerBand, BiquadFilters, FiltersChain } from '@discord-player/equalizer';
7
+ import { EqualizerBand, BiquadFilters, PCMFilters, FiltersChain } from '@discord-player/equalizer';
9
8
  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
9
  import * as _discordjs_voice from '@discordjs/voice';
11
- import { AudioPlayerError, AudioResource, VoiceConnection, AudioPlayer, AudioPlayerStatus, StreamType, EndBehaviorType } from '@discordjs/voice';
10
+ import { StreamType, AudioPlayerError, AudioResource, VoiceConnection, AudioPlayer, AudioPlayerStatus, EndBehaviorType } from '@discordjs/voice';
12
11
  export { AudioPlayer, CreateAudioPlayerOptions, createAudioPlayer } from '@discordjs/voice';
13
12
  import { downloadOptions } from 'ytdl-core';
14
- import childProcess from 'child_process';
13
+ export * from '@discord-player/ffmpeg';
15
14
 
16
15
  declare class PlayerEventsEmitter<L extends ListenerSignature<L> = DefaultListener> extends EventEmitter<L> {
17
16
  requiredEvents: Array<keyof L>;
@@ -267,15 +266,15 @@ declare class Track<T = unknown> {
267
266
  /**
268
267
  * Request metadata for this track
269
268
  */
270
- requestMetadata(): Promise<T>;
269
+ requestMetadata(): Promise<T | null>;
271
270
  /**
272
271
  * Set metadata for this track
273
272
  */
274
- setMetadata(m: T): void;
273
+ setMetadata(m: T | null): void;
275
274
  /**
276
275
  * Metadata of this track
277
276
  */
278
- get metadata(): T | undefined;
277
+ get metadata(): T | null;
279
278
  /**
280
279
  * If this track has metadata
281
280
  */
@@ -340,12 +339,11 @@ interface VoiceEvents {
340
339
  declare class StreamDispatcher extends EventEmitter<VoiceEvents> {
341
340
  queue: GuildQueue;
342
341
  readonly connectionTimeout: number;
343
- readonly voiceConnection: VoiceConnection;
344
- readonly audioPlayer: AudioPlayer;
342
+ voiceConnection: VoiceConnection;
343
+ audioPlayer: AudioPlayer;
345
344
  receiver: VoiceReceiverNode;
346
345
  channel: VoiceChannel | StageChannel;
347
346
  audioResource?: AudioResource<Track> | null;
348
- private readyLock;
349
347
  dsp: FiltersChain;
350
348
  /**
351
349
  * Creates new connection object
@@ -529,7 +527,11 @@ declare class GuildQueueHistory<Meta = unknown> {
529
527
  /**
530
528
  * Alias to [GuildQueueHistory].previous()
531
529
  */
532
- back(): Promise<void>;
530
+ back(preserveCurrent?: boolean): Promise<void>;
531
+ /**
532
+ * Resize history store
533
+ */
534
+ resize(): void;
533
535
  }
534
536
 
535
537
  interface AsyncQueueAcquisitionOptions {
@@ -616,6 +618,10 @@ interface PlayerTimestamp {
616
618
  };
617
619
  progress: number;
618
620
  }
621
+ interface StreamConfig {
622
+ dispatcherConfig: CreateStreamOps;
623
+ playerConfig: ResourcePlayOptions;
624
+ }
619
625
  declare class GuildQueuePlayerNode<Meta = unknown> {
620
626
  #private;
621
627
  queue: GuildQueue<Meta>;
@@ -665,6 +671,10 @@ declare class GuildQueuePlayerNode<Meta = unknown> {
665
671
  * Estimated total duration of the player
666
672
  */
667
673
  get estimatedDuration(): number;
674
+ /**
675
+ * Total duration of the current audio track
676
+ */
677
+ get totalDuration(): number;
668
678
  /**
669
679
  * Get stream progress
670
680
  * @param ignoreFilters Ignore filters
@@ -815,6 +825,22 @@ declare class FFmpegFilterer<Meta = unknown> {
815
825
  #private;
816
826
  af: GuildQueueAudioFilters<Meta>;
817
827
  constructor(af: GuildQueueAudioFilters<Meta>);
828
+ /**
829
+ * Set input args for FFmpeg
830
+ */
831
+ setInputArgs(args: string[]): void;
832
+ /**
833
+ * Get input args
834
+ */
835
+ get inputArgs(): string[];
836
+ /**
837
+ * Get encoder args
838
+ */
839
+ get encoderArgs(): string[];
840
+ /**
841
+ * Get final ffmpeg args
842
+ */
843
+ get args(): string[];
818
844
  /**
819
845
  * Create ffmpeg stream
820
846
  * @param source The stream source
@@ -982,6 +1008,8 @@ interface GuildNodeInit<Meta = unknown> {
982
1008
  bufferingTimeout: number;
983
1009
  noEmitInsert: boolean;
984
1010
  maxSize?: number;
1011
+ maxHistorySize?: number;
1012
+ preferBridgedMetadata: boolean;
985
1013
  }
986
1014
  interface VoiceConnectConfig {
987
1015
  deaf?: boolean;
@@ -995,100 +1023,120 @@ interface PostProcessedResult {
995
1023
  type OnBeforeCreateStreamHandler = (track: Track, queryType: SearchQueryType, queue: GuildQueue) => Promise<Readable | null>;
996
1024
  type OnAfterCreateStreamHandler = (stream: Readable, queue: GuildQueue) => Promise<PostProcessedResult | null>;
997
1025
  type PlayerTriggeredReason = 'filters' | 'normal';
998
- declare enum GuildQueueEvent {
1026
+ declare const GuildQueueEvent: {
999
1027
  /**
1000
1028
  * Emitted when audio track is added to the queue
1001
1029
  */
1002
- audioTrackAdd = "audioTrackadd",
1030
+ readonly audioTrackAdd: "audioTrackAdd";
1003
1031
  /**
1004
1032
  * Emitted when audio tracks were added to the queue
1005
1033
  */
1006
- audioTracksAdd = "audioTracksAdd",
1034
+ readonly audioTracksAdd: "audioTracksAdd";
1007
1035
  /**
1008
1036
  * Emitted when audio track is removed from the queue
1009
1037
  */
1010
- audioTrackRemove = "audioTrackRemove",
1038
+ readonly audioTrackRemove: "audioTrackRemove";
1011
1039
  /**
1012
1040
  * Emitted when audio tracks are removed from the queue
1013
1041
  */
1014
- audioTracksRemove = "audioTracksRemove",
1042
+ readonly audioTracksRemove: "audioTracksRemove";
1015
1043
  /**
1016
1044
  * Emitted when a connection is created
1017
1045
  */
1018
- connection = "connection",
1046
+ readonly connection: "connection";
1047
+ /**
1048
+ * Emitted when a voice connection is destroyed
1049
+ */
1050
+ readonly connectionDestroyed: "connectionDestroyed";
1019
1051
  /**
1020
1052
  * Emitted when the bot is disconnected from the channel
1021
1053
  */
1022
- disconnect = "disconnect",
1054
+ readonly disconnect: "disconnect";
1023
1055
  /**
1024
1056
  * Emitted when the queue sends a debug info
1025
1057
  */
1026
- debug = "debug",
1058
+ readonly debug: "debug";
1027
1059
  /**
1028
1060
  * Emitted when the queue encounters error
1029
1061
  */
1030
- error = "error",
1062
+ readonly error: "error";
1031
1063
  /**
1032
1064
  * Emitted when the voice channel is empty
1033
1065
  */
1034
- emptyChannel = "emptyChannel",
1066
+ readonly emptyChannel: "emptyChannel";
1035
1067
  /**
1036
1068
  * Emitted when the queue is empty
1037
1069
  */
1038
- emptyQueue = "emptyQueue",
1070
+ readonly emptyQueue: "emptyQueue";
1039
1071
  /**
1040
1072
  * Emitted when the audio player starts streaming audio track
1041
1073
  */
1042
- playerStart = "playerStart",
1074
+ readonly playerStart: "playerStart";
1043
1075
  /**
1044
1076
  * Emitted when the audio player errors while streaming audio track
1045
1077
  */
1046
- playerError = "playerError",
1078
+ readonly playerError: "playerError";
1047
1079
  /**
1048
1080
  * Emitted when the audio player finishes streaming audio track
1049
1081
  */
1050
- playerFinish = "playerFinish",
1082
+ readonly playerFinish: "playerFinish";
1051
1083
  /**
1052
1084
  * Emitted when the audio player skips current track
1053
1085
  */
1054
- playerSkip = "playerSkip",
1086
+ readonly playerSkip: "playerSkip";
1055
1087
  /**
1056
1088
  * Emitted when the audio player is triggered
1057
1089
  */
1058
- playerTrigger = "playerTrigger",
1090
+ readonly playerTrigger: "playerTrigger";
1059
1091
  /**
1060
1092
  * Emitted when the voice state is updated. Consuming this event may disable default voice state update handler if `Player.isVoiceStateHandlerLocked()` returns `false`.
1061
1093
  */
1062
- voiceStateUpdate = "voiceStateUpdate",
1094
+ readonly voiceStateUpdate: "voiceStateUpdate";
1063
1095
  /**
1064
1096
  * Emitted when volume is updated
1065
1097
  */
1066
- volumeChange = "volumeChange",
1098
+ readonly volumeChange: "volumeChange";
1067
1099
  /**
1068
1100
  * Emitted when player is paused
1069
1101
  */
1070
- playerPause = "playerPause",
1102
+ readonly playerPause: "playerPause";
1071
1103
  /**
1072
1104
  * Emitted when player is resumed
1073
1105
  */
1074
- playerResume = "playerResume",
1106
+ readonly playerResume: "playerResume";
1075
1107
  /**
1076
1108
  * Biquad Filters Update
1077
1109
  */
1078
- biquadFiltersUpdate = "biquadFiltersUpdate",
1110
+ readonly biquadFiltersUpdate: "biquadFiltersUpdate";
1079
1111
  /**
1080
1112
  * Equalizer Update
1081
1113
  */
1082
- equalizerUpdate = "equalizerUpdate",
1114
+ readonly equalizerUpdate: "equalizerUpdate";
1083
1115
  /**
1084
1116
  * DSP update
1085
1117
  */
1086
- dspUpdate = "dspUpdate",
1118
+ readonly dspUpdate: "dspUpdate";
1087
1119
  /**
1088
1120
  * Audio Filters Update
1089
1121
  */
1090
- audioFiltersUpdate = "audioFiltersUpdate"
1091
- }
1122
+ readonly audioFiltersUpdate: "audioFiltersUpdate";
1123
+ /**
1124
+ * Audio player will play next track
1125
+ */
1126
+ readonly willPlayTrack: "willPlayTrack";
1127
+ /**
1128
+ * Emitted when a voice channel is repopulated
1129
+ */
1130
+ readonly channelPopulate: "channelPopulate";
1131
+ /**
1132
+ * Emitted when a queue is successfully created
1133
+ */
1134
+ readonly queueCreate: "queueCreate";
1135
+ /**
1136
+ * Emitted when a queue is deleted
1137
+ */
1138
+ readonly queueDelete: "queueDelete";
1139
+ };
1092
1140
  interface GuildQueueEvents<Meta = unknown> {
1093
1141
  /**
1094
1142
  * Emitted when audio track is added to the queue
@@ -1119,6 +1167,11 @@ interface GuildQueueEvents<Meta = unknown> {
1119
1167
  * @param queue The queue where this event occurred
1120
1168
  */
1121
1169
  connection: (queue: GuildQueue<Meta>) => unknown;
1170
+ /**
1171
+ * Emitted when a connection is destroyed
1172
+ * @param queue The queue where this event occurred
1173
+ */
1174
+ connectionDestroyed: (queue: GuildQueue<Meta>) => unknown;
1122
1175
  /**
1123
1176
  * Emitted when the bot is disconnected from the channel
1124
1177
  * @param queue The queue where this event occurred
@@ -1229,6 +1282,30 @@ interface GuildQueueEvents<Meta = unknown> {
1229
1282
  * @param newFilters New filters
1230
1283
  */
1231
1284
  audioFiltersUpdate: (queue: GuildQueue<Meta>, oldFilters: FiltersName[], newFilters: FiltersName[]) => unknown;
1285
+ /**
1286
+ * Emitted before streaming an audio track. This event can be used to modify stream config before playing a track.
1287
+ * Listening to this event will pause the execution of audio player until `done()` is invoked.
1288
+ * @param queue The queue where this event occurred
1289
+ * @param track The track that will be streamed
1290
+ * @param config Configurations for streaming
1291
+ * @param done Done callback
1292
+ */
1293
+ willPlayTrack: (queue: GuildQueue<Meta>, track: Track<unknown>, config: StreamConfig, done: () => void) => unknown;
1294
+ /**
1295
+ * Emitted when a voice channel is populated
1296
+ * @param queue The queue where this event occurred
1297
+ */
1298
+ channelPopulate: (queue: GuildQueue<Meta>) => unknown;
1299
+ /**
1300
+ * Emitted when a queue is successfully created
1301
+ * @param queue The queue where this event occurred
1302
+ */
1303
+ queueCreate: (queue: GuildQueue<Meta>) => unknown;
1304
+ /**
1305
+ * Emitted when a queue is successfully deleted
1306
+ * @param queue The queue where this event occurred
1307
+ */
1308
+ queueDelete: (queue: GuildQueue<Meta>) => unknown;
1232
1309
  }
1233
1310
  declare class GuildQueue<Meta = unknown> {
1234
1311
  #private;
@@ -1329,6 +1406,24 @@ declare class GuildQueue<Meta = unknown> {
1329
1406
  * The size of this queue
1330
1407
  */
1331
1408
  getSize(): number;
1409
+ /**
1410
+ * Max history size of this queue
1411
+ */
1412
+ get maxHistorySize(): number;
1413
+ /**
1414
+ * Max history size of this queue
1415
+ */
1416
+ getMaxHistorySize(): number;
1417
+ /**
1418
+ * Set max history size for this queue
1419
+ * @param size The size to set
1420
+ */
1421
+ setMaxHistorySize(size: number): void;
1422
+ /**
1423
+ * Set max size for this queue
1424
+ * @param size The size to set
1425
+ */
1426
+ setMaxSize(size: number): void;
1332
1427
  /**
1333
1428
  * Clear this queue
1334
1429
  */
@@ -1420,6 +1515,12 @@ declare class GuildQueue<Meta = unknown> {
1420
1515
  * @param options Player node initialization options
1421
1516
  */
1422
1517
  play(track: TrackLike, options?: PlayerNodeInitializerOptions<Meta>): Promise<PlayerNodeInitializationResult<Meta>>;
1518
+ /**
1519
+ * Emit an event on this queue
1520
+ * @param event The event to emit
1521
+ * @param args The args for the event
1522
+ */
1523
+ emit<K extends keyof GuildQueueEvents<Meta>>(event: K, ...args: Parameters<GuildQueueEvents<Meta>[K]>): boolean;
1423
1524
  }
1424
1525
 
1425
1526
  interface GuildQueueStatisticsMetadata {
@@ -1608,6 +1709,7 @@ interface PlayerNodeInitializerOptions<T> extends SearchOptions {
1608
1709
  audioPlayerOptions?: ResourcePlayOptions;
1609
1710
  afterSearch?: (result: SearchResult) => Promise<SearchResult>;
1610
1711
  }
1712
+ type VoiceStateHandler = (player: Player, queue: GuildQueue, oldVoiceState: VoiceState, newVoiceState: VoiceState) => Awaited<void>;
1611
1713
  declare class Player extends PlayerEventsEmitter<PlayerEvents> {
1612
1714
  #private;
1613
1715
  static readonly version: string;
@@ -1625,6 +1727,11 @@ declare class Player extends PlayerEventsEmitter<PlayerEvents> {
1625
1727
  * @param {PlayerInitOptions} [options] The player init options
1626
1728
  */
1627
1729
  constructor(client: Client, options?: PlayerInitOptions);
1730
+ /**
1731
+ * Override default voice state update handler
1732
+ * @param handler The handler callback
1733
+ */
1734
+ onVoiceStateUpdate(handler: VoiceStateHandler): void;
1628
1735
  debug(m: string): boolean;
1629
1736
  /**
1630
1737
  * Creates discord-player singleton instance.
@@ -1789,6 +1896,9 @@ interface GuildNodeCreateOptions<T = unknown> {
1789
1896
  defaultFFmpegFilters?: FiltersName[];
1790
1897
  bufferingTimeout?: number;
1791
1898
  noEmitInsert?: boolean;
1899
+ maxSize?: number;
1900
+ maxHistorySize?: number;
1901
+ preferBridgedMetadata?: boolean;
1792
1902
  }
1793
1903
  type NodeResolvable = GuildQueue | GuildResolvable;
1794
1904
  declare class GuildNodeManager<Meta = unknown> {
@@ -2286,6 +2396,7 @@ declare class QueryResolver {
2286
2396
  appleMusicSongRegex: RegExp;
2287
2397
  soundcloudTrackRegex: RegExp;
2288
2398
  soundcloudPlaylistRegex: RegExp;
2399
+ youtubePlaylistRegex: RegExp;
2289
2400
  };
2290
2401
  /**
2291
2402
  * Resolves the given search query
@@ -2302,93 +2413,49 @@ declare class QueryResolver {
2302
2413
  static validateURL(q: string): boolean;
2303
2414
  }
2304
2415
 
2305
- type Callback<Args extends Array<unknown>> = (...args: Args) => unknown;
2306
- interface FFmpegInfo {
2307
- command: string | null;
2308
- metadata: string | null;
2309
- version: string | null;
2310
- isStatic: boolean;
2311
- }
2312
- interface FFmpegOptions extends DuplexOptions {
2313
- args?: string[];
2314
- shell?: boolean;
2315
- }
2316
- declare class FFmpeg extends Duplex {
2317
- /**
2318
- * FFmpeg version regex
2319
- */
2320
- static VersionRegex: RegExp;
2321
- /**
2322
- * Spawns ffmpeg process
2323
- * @param options Spawn options
2324
- */
2325
- static spawn({ args, shell }?: {
2326
- args?: string[] | undefined;
2327
- shell?: boolean | undefined;
2328
- }): childProcess.ChildProcessWithoutNullStreams;
2329
- /**
2330
- * Check if ffmpeg is available
2331
- */
2332
- static isAvailable(): boolean;
2333
- /**
2334
- * Safe locate ffmpeg
2335
- * @param force if it should relocate the command
2336
- */
2337
- static locateSafe(force?: boolean): FFmpegInfo | null | undefined;
2338
- /**
2339
- * Locate ffmpeg command. Throws error if ffmpeg is not found.
2340
- * @param force Forcefully reload
2341
- */
2342
- static locate(force?: boolean): FFmpegInfo | undefined;
2343
- /**
2344
- * Current FFmpeg process
2345
- */
2346
- process: childProcess.ChildProcessWithoutNullStreams;
2347
- /**
2348
- * Create FFmpeg duplex stream
2349
- * @param options Options to initialize ffmpeg
2350
- * @example ```typescript
2351
- * const ffmpeg = new FFmpeg({
2352
- * args: [
2353
- * '-analyzeduration', '0',
2354
- * '-loglevel', '0',
2355
- * '-f', 's16le',
2356
- * '-ar', '48000',
2357
- * '-ac', '2',
2358
- * '-af', 'bass=g=10,acompressor'
2359
- * ]
2360
- * });
2361
- *
2362
- * const pcm = input.pipe(ffmpeg);
2363
- *
2364
- * pcm.pipe(fs.createWriteStream('./audio.pcm'));
2365
- * ```
2366
- */
2367
- constructor(options?: FFmpegOptions);
2368
- get _reader(): stream.Readable;
2369
- get _writer(): stream.Writable;
2370
- private _copy;
2371
- _destroy(err: Error | null, cb: Callback<[Error | null]>): unknown;
2372
- _final(cb: Callback<[]>): void;
2373
- private _cleanup;
2374
- toString(): string;
2375
- }
2376
- declare const findFFmpeg: typeof FFmpeg.locate;
2377
-
2416
+ /**
2417
+ * Fetch guild queue history
2418
+ * @param node guild queue node resolvable
2419
+ */
2378
2420
  declare function useHistory<Meta = unknown>(node: NodeResolvable): GuildQueueHistory<Meta> | null;
2379
2421
 
2422
+ /**
2423
+ * Fetch guild queue player node
2424
+ * @param node Guild queue node resolvable
2425
+ */
2380
2426
  declare function usePlayer<Meta = unknown>(node: NodeResolvable): GuildQueuePlayerNode<Meta> | null;
2381
2427
 
2428
+ /**
2429
+ * Fetch guild queue
2430
+ * @param node Guild queue node resolvable
2431
+ */
2382
2432
  declare function useQueue<Meta = unknown>(node: NodeResolvable): GuildQueue<Meta> | null;
2383
2433
 
2384
- declare function useMasterPlayer(): Player | null;
2434
+ /**
2435
+ * Fetch main player instance
2436
+ * @deprecated
2437
+ */
2438
+ declare function useMasterPlayer(): Player | null;
2439
+ /**
2440
+ * Fetch main player instance
2441
+ */
2442
+ declare function useMainPlayer(): Player | null;
2385
2443
 
2386
- type SetterFN<T, P> = (previous: P) => T;
2387
- declare function useMetadata<T = unknown>(node: NodeResolvable): readonly [() => T, (metadata: T | SetterFN<T, T>) => void];
2444
+ type SetterFN$1<T, P> = (previous: P) => T;
2445
+ /**
2446
+ * Fetch or manipulate guild queue metadata
2447
+ * @param node Guild queue node resolvable
2448
+ */
2449
+ declare function useMetadata<T = unknown>(node: NodeResolvable): readonly [() => T, (metadata: T | SetterFN$1<T, T>) => void];
2388
2450
 
2389
2451
  interface TimelineDispatcherOptions {
2390
2452
  ignoreFilters: boolean;
2391
2453
  }
2454
+ /**
2455
+ * Fetch or manipulate current track
2456
+ * @param node Guild queue node resolvable
2457
+ * @param options Options for timeline dispatcher
2458
+ */
2392
2459
  declare function useTimeline(node: NodeResolvable, options?: Partial<TimelineDispatcherOptions>): {
2393
2460
  readonly timestamp: PlayerTimestamp;
2394
2461
  readonly volume: number;
@@ -2400,10 +2467,37 @@ declare function useTimeline(node: NodeResolvable, options?: Partial<TimelineDis
2400
2467
  setPosition(time: number): Promise<boolean>;
2401
2468
  } | null;
2402
2469
 
2470
+ /**
2471
+ * Global onAfterCreateStream handler
2472
+ * @param handler The handler callback
2473
+ */
2403
2474
  declare function onAfterCreateStream(handler: OnAfterCreateStreamHandler): void;
2404
2475
 
2476
+ /**
2477
+ * Global onBeforeCreateStream handler
2478
+ * @param handler The handler callback
2479
+ */
2405
2480
  declare function onBeforeCreateStream(handler: OnBeforeCreateStreamHandler): void;
2406
2481
 
2482
+ type SetterFN = (previous: number) => number;
2483
+ /**
2484
+ * Fetch or manipulate player volume
2485
+ * @param node Guild queue node resolvable
2486
+ */
2487
+ declare function useVolume(node: NodeResolvable): readonly [() => number, (volume: number | SetterFN) => boolean | undefined];
2488
+
2489
+ declare const instances: Collection<string, Player>;
2490
+
2491
+ declare const getPlayer: () => Player | null;
2492
+ declare const getQueue: <T = unknown>(node: NodeResolvable) => GuildQueue<T> | null;
2493
+ interface HookDeclarationContext {
2494
+ getQueue: typeof getQueue;
2495
+ getPlayer: typeof getPlayer;
2496
+ instances: typeof instances;
2497
+ }
2498
+ type HookDeclaration<T extends (...args: any[]) => any> = (context: HookDeclarationContext) => T;
2499
+ declare function createHook<T extends HookDeclaration<(...args: any[]) => any>>(hook: T): ReturnType<T>;
2500
+
2407
2501
  declare const version: string;
2408
2502
 
2409
- export { AFilterGraph, AsyncQueue, AsyncQueueAcquisitionOptions, AsyncQueueEntry, AudioFilters, BaseExtractor, DiscordPlayerQueryResultCache, EqualizerConfigurationPreset, ExtractorExecutionContext, ExtractorExecutionEvents, ExtractorExecutionFN, ExtractorExecutionResult, ExtractorInfo, ExtractorSearchContext, FFMPEG_ARGS_PIPED, FFMPEG_ARGS_STRING, FFMPEG_SRATE_REGEX, FFmpeg, FFmpegFilterer, FFmpegInfo, FFmpegOptions, FFmpegStreamOptions, FilterGraph, FiltersName, GuildNodeCreateOptions, GuildNodeInit, GuildNodeManager, GuildQueue, GuildQueueAFiltersCache, GuildQueueAudioFilters, GuildQueueEvent, GuildQueueEvents, GuildQueueHistory, GuildQueuePlayerNode, NextFunction, NodeResolvable, OnAfterCreateStreamHandler, OnBeforeCreateStreamHandler, PlayOptions, Player, PlayerEvent, PlayerEvents, PlayerEventsEmitter, PlayerInitOptions, PlayerNodeInitializationResult, PlayerNodeInitializerOptions, 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, TimelineDispatcherOptions, Track, TrackJSON, TrackLike, TrackResolvable, TrackSource, TypeUtil, Util, VALIDATE_QUEUE_CAP, VoiceConnectConfig, VoiceEvents, VoiceReceiverNode, VoiceReceiverOptions, VoiceUtils, WithMetadata, createFFmpegStream, findFFmpeg, onAfterCreateStream, onBeforeCreateStream, useHistory, useMasterPlayer, useMetadata, usePlayer, useQueue, useTimeline, version };
2503
+ export { AFilterGraph, AsyncQueue, AsyncQueueAcquisitionOptions, AsyncQueueEntry, AudioFilters, BaseExtractor, CreateStreamOps, DiscordPlayerQueryResultCache, EqualizerConfigurationPreset, ExtractorExecutionContext, ExtractorExecutionEvents, ExtractorExecutionFN, ExtractorExecutionResult, ExtractorInfo, ExtractorSearchContext, FFMPEG_ARGS_PIPED, FFMPEG_ARGS_STRING, FFMPEG_SRATE_REGEX, FFmpegFilterer, FFmpegStreamOptions, FilterGraph, FiltersName, GuildNodeCreateOptions, GuildNodeInit, GuildNodeManager, GuildQueue, GuildQueueAFiltersCache, GuildQueueAudioFilters, GuildQueueEvent, GuildQueueEvents, GuildQueueHistory, GuildQueuePlayerNode, HookDeclaration, HookDeclarationContext, NextFunction, NodeResolvable, OnAfterCreateStreamHandler, OnBeforeCreateStreamHandler, PlayOptions, Player, PlayerEvent, PlayerEvents, PlayerEventsEmitter, PlayerInitOptions, PlayerNodeInitializationResult, PlayerNodeInitializerOptions, PlayerProgressbarOptions, PlayerSearchResult, PlayerTimestamp, PlayerTriggeredReason, Playlist, PlaylistInitData, PlaylistJSON, PostProcessedResult, QueryCache, QueryCacheOptions, QueryCacheResolverContext, QueryExtractorSearch, QueryResolver, QueryType, QueueFilters, QueueRepeatMode, RawTrackData, RawTrackInit, ResourcePlayOptions, SearchOptions, SearchQueryType, SearchResult, SearchResultData, StreamConfig, StreamDispatcher, TimeData, TimelineDispatcherOptions, Track, TrackJSON, TrackLike, TrackResolvable, TrackSource, TypeUtil, Util, VALIDATE_QUEUE_CAP, VoiceConnectConfig, VoiceEvents, VoiceReceiverNode, VoiceReceiverOptions, VoiceStateHandler, VoiceUtils, WithMetadata, createFFmpegStream, createHook, onAfterCreateStream, onBeforeCreateStream, useHistory, useMainPlayer, useMasterPlayer, useMetadata, usePlayer, useQueue, useTimeline, useVolume, version };