discord-player 7.0.0-dev.1 → 7.0.0-dev.3

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
@@ -86,28 +86,6 @@ $ npm install --save ffmpeg-binaries
86
86
 
87
87
  > Use `FFMPEG_PATH` environment variable to load ffmpeg from custom path.
88
88
 
89
- #### Streaming Library
90
-
91
- **The following method is deprecated and will be removed in the future. Please switch to [discord-player-youtubei](https://npmjs.com/discord-player-youtubei).**
92
-
93
- **Not recommended**:
94
-
95
- YouTube streaming is not supported without installing one of the following package. If you want to add support for YouTube playback, you need to install a streaming library. This step is not needed if you do not plan on using youtube source.
96
-
97
- ```bash
98
- $ npm install --save youtube-ext
99
- # or
100
- $ npm install --save play-dl
101
- # or
102
- $ npm install --save @distube/ytdl-core
103
- # or
104
- $ npm install --save yt-stream
105
- # or
106
- $ npm install --save ytdl-core
107
- ```
108
-
109
- Once you have completed these installations, let's proceed with writing a simple music bot.
110
-
111
89
  ### Setup
112
90
 
113
91
  Let's create a main player instance. This instance handles and keeps track of all the queues and its components.
@@ -147,13 +125,31 @@ const { Player, createErisCompat } = require('discord-player');
147
125
  const player = new Player(createErisCompat(client));
148
126
  ```
149
127
 
128
+ Before you add the command, make sure to provide the context to the commands if you wish to use discord-player's hooks (like `useMainPlayer`).
129
+
130
+ ### Before
131
+
132
+ ```js index.js
133
+ // execute the command
134
+ await command.execute(interaction);
135
+ ```
136
+
137
+ ### After
138
+
139
+ ```js index.js
140
+ // execute the command
141
+ await player.context.provide({ guild: interaction.guild }, () => command.execute(interaction));
142
+ ```
143
+
144
+ This allows discord-player to automatically know the current guild and the queue, resulting in cleaner code and seamless integration. This eradicates the need to pass the player instance to the command or use hacks like `client.player = player`.
145
+
150
146
  Let's move on to the command part. You can define the command as per your requirements. We will only focus on the command part:
151
147
 
152
148
  ```js play.js
153
149
  const { useMainPlayer } = require('discord-player');
154
150
 
155
151
  export async function execute(interaction) {
156
- const player = useMainPlayer();
152
+ const player = useMainPlayer(); // get player instance
157
153
  const channel = interaction.member.voice.channel;
158
154
  if (!channel) return interaction.reply('You are not connected to a voice channel!'); // make sure we have a voice channel
159
155
  const query = interaction.options.getString('query', true); // we need input/query to play
package/dist/index.d.ts CHANGED
@@ -7,12 +7,10 @@ import { EqualizerBand, BiquadFilters, PCMFilters, FiltersChain } from '@discord
7
7
  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';
8
8
  import * as stream from 'stream';
9
9
  import { Readable, Duplex } from 'stream';
10
- import * as _discord_player_extractor from '@discord-player/extractor';
11
- import { BridgeProvider } from '@discord-player/extractor';
12
10
  import { RequestOptions } from 'http';
13
11
  import { StreamType, AudioPlayerError, AudioResource, VoiceConnection, AudioPlayer, AudioPlayerStatus } from 'discord-voip';
14
12
  export { AudioPlayer, CreateAudioPlayerOptions, JoinConfig, JoinVoiceChannelOptions, createAudioPlayer, getVoiceConnection, getVoiceConnections, joinVoiceChannel } from 'discord-voip';
15
- import { downloadOptions } from 'ytdl-core';
13
+ import { BridgeProvider } from '@discord-player/extractor';
16
14
  import { FFmpegLib } from '@discord-player/ffmpeg';
17
15
  export * from '@discord-player/ffmpeg';
18
16
 
@@ -1808,27 +1806,19 @@ declare function useContext<T = unsafe>(context: Context<T>): T | undefined;
1808
1806
  * @param node guild queue node resolvable
1809
1807
  */
1810
1808
  declare function useHistory<Meta = unknown>(): GuildQueueHistory<Meta> | null;
1811
- declare function useHistory<Meta = unknown>(node: NodeResolvable): GuildQueueHistory<Meta> | null;
1812
1809
 
1813
1810
  /**
1814
1811
  * Fetch guild queue player node
1815
1812
  * @param node Guild queue node resolvable
1816
1813
  */
1817
1814
  declare function usePlayer<Meta = unknown>(): GuildQueuePlayerNode<Meta> | null;
1818
- declare function usePlayer<Meta = unknown>(node: NodeResolvable): GuildQueuePlayerNode<Meta> | null;
1819
1815
 
1820
1816
  /**
1821
- * Fetch guild queue
1822
- * @param node Guild queue node resolvable
1817
+ * Fetch guild queue.
1818
+ * @param node Guild queue node resolvable. Defaults to inferred guild from context.
1823
1819
  */
1824
1820
  declare function useQueue<Meta = unknown>(): GuildQueue<Meta> | null;
1825
- declare function useQueue<Meta = unknown>(node: NodeResolvable): GuildQueue<Meta> | null;
1826
1821
 
1827
- /**
1828
- * Fetch main player instance
1829
- * @deprecated
1830
- */
1831
- declare function useMasterPlayer(): Player;
1832
1822
  /**
1833
1823
  * Fetch main player instance
1834
1824
  */
@@ -1841,17 +1831,12 @@ type MetadataDispatch<T> = readonly [() => T, (metadata: T | SetterFN$1<T, T>) =
1841
1831
  * @param node Guild queue node resolvable
1842
1832
  */
1843
1833
  declare function useMetadata<T = unknown>(): MetadataDispatch<T>;
1844
- declare function useMetadata<T = unknown>(node: NodeResolvable): MetadataDispatch<T>;
1845
1834
 
1846
1835
  interface TimelineDispatcherOptions {
1847
1836
  ignoreFilters: boolean;
1837
+ node: NodeResolvable;
1848
1838
  }
1849
- /**
1850
- * Fetch or manipulate current track
1851
- * @param node Guild queue node resolvable
1852
- * @param options Options for timeline dispatcher
1853
- */
1854
- declare function useTimeline(node?: NodeResolvable, options?: Partial<TimelineDispatcherOptions>): {
1839
+ interface GuildQueueTimeline {
1855
1840
  readonly timestamp: PlayerTimestamp;
1856
1841
  readonly volume: number;
1857
1842
  readonly paused: boolean;
@@ -1860,7 +1845,12 @@ declare function useTimeline(node?: NodeResolvable, options?: Partial<TimelineDi
1860
1845
  resume(): boolean;
1861
1846
  setVolume(vol: number): boolean;
1862
1847
  setPosition(time: number): Promise<boolean>;
1863
- } | null;
1848
+ }
1849
+ /**
1850
+ * Fetch or manipulate current track
1851
+ * @param options Options for timeline dispatcher
1852
+ */
1853
+ declare function useTimeline(): GuildQueueTimeline | null;
1864
1854
 
1865
1855
  /**
1866
1856
  * Global onAfterCreateStream handler
@@ -1881,27 +1871,7 @@ type VolumeDispatch = readonly [() => number, (volume: number | SetterFN) => boo
1881
1871
  * @param node Guild queue node resolvable
1882
1872
  */
1883
1873
  declare function useVolume(): VolumeDispatch;
1884
- declare function useVolume(node: NodeResolvable): VolumeDispatch;
1885
-
1886
- declare const instances: Collection<string, Player>;
1887
-
1888
- declare const getPlayer: () => Player | null;
1889
- interface HooksCtx {
1890
- guild: Guild;
1891
- }
1892
- declare const getQueue: <T = unknown>(node: NodeResolvable) => GuildQueue<T> | null;
1893
- interface HookDeclarationContext {
1894
- getQueue: typeof getQueue;
1895
- getPlayer: typeof getPlayer;
1896
- instances: typeof instances;
1897
- }
1898
- type HookDeclaration<T extends (...args: any[]) => any> = (context: HookDeclarationContext) => T;
1899
- declare function createHook<T extends HookDeclaration<(...args: any[]) => any>>(hook: T): ReturnType<T>;
1900
1874
 
1901
- declare const knownExtractorKeys: readonly ["SpotifyExtractor", "AppleMusicExtractor", "SoundCloudExtractor", "YouTubeExtractor", "VimeoExtractor", "ReverbnationExtractor", "AttachmentExtractor"];
1902
- type ExtractorLoaderOptionDict = {
1903
- [K in (typeof knownExtractorKeys)[number]]?: ConstructorParameters<typeof _discord_player_extractor[K]>[1];
1904
- };
1905
1875
  interface ExtractorSession {
1906
1876
  id: string;
1907
1877
  attemptedExtractors: Set<string>;
@@ -1955,13 +1925,14 @@ declare class ExtractorExecutionContext extends PlayerEventsEmitter<ExtractorExe
1955
1925
  * Get the current execution context
1956
1926
  */
1957
1927
  getContext(): ExtractorSession | null;
1928
+ loadDefault(): Promise<void>;
1958
1929
  /**
1959
- * Load default extractors from `@discord-player/extractor`
1930
+ * Load a bundle of extractors.
1931
+ * @example import { DefaultExtractors } from '@discord-player/extractor';
1932
+ *
1933
+ * await player.extractors.loadMulti(DefaultExtractors);
1960
1934
  */
1961
- loadDefault(filter?: (ext: (typeof knownExtractorKeys)[number]) => boolean | null, options?: ExtractorLoaderOptionDict): Promise<{
1962
- success: boolean;
1963
- error: Error;
1964
- } | {
1935
+ loadMulti<O extends object, T extends (typeof BaseExtractor<O>)[], R extends Record<T[number]['identifier'], ConstructorParameters<T[number]>[1]>>(bundle: T, options?: R): Promise<{
1965
1936
  success: boolean;
1966
1937
  error: null;
1967
1938
  }>;
@@ -2128,10 +2099,6 @@ declare class BaseExtractor<T extends object = object> {
2128
2099
  * @param message The debug message
2129
2100
  */
2130
2101
  debug(message: string): boolean;
2131
- /**
2132
- * IP rotator instance, if available
2133
- */
2134
- get routePlanner(): IPRotator | null;
2135
2102
  /**
2136
2103
  * A flag to indicate `Demuxable` stream support for `opus`/`ogg/opus`/`webm/opus` formats.
2137
2104
  */
@@ -2310,42 +2277,8 @@ declare class VoiceUtils {
2310
2277
  getConnection(guild: Snowflake, group?: string): VoiceConnection | undefined;
2311
2278
  }
2312
2279
 
2313
- declare class IPBlock {
2314
- block: string;
2315
- usage: number;
2316
- readonly cidr: string;
2317
- readonly cidrSize: number;
2318
- constructor(block: string);
2319
- consume(): void;
2320
- }
2321
- interface IPRotationConfig {
2322
- /**
2323
- * IP blocks to use
2324
- */
2325
- blocks: string[];
2326
- /**
2327
- * IPs to exclude
2328
- */
2329
- exclude?: string[];
2330
- /**
2331
- * Max retries to find an IP that is not excluded
2332
- */
2333
- maxRetries?: number;
2334
- }
2335
- declare class IPRotator {
2336
- #private;
2337
- config: IPRotationConfig;
2338
- blocks: IPBlock[];
2339
- failures: Map<string, number>;
2340
- MAX_NEXT_RETRIES: number;
2341
- constructor(config: IPRotationConfig);
2342
- getIP(): {
2343
- ip: string;
2344
- family: 4 | 6;
2345
- };
2346
- isFailedOrExcluded(ip: string): boolean;
2347
- addFailed(ip: string): void;
2348
- static getRandomIP(address: string, start?: number, end?: number): string;
2280
+ interface HooksCtx {
2281
+ guild: Guild;
2349
2282
  }
2350
2283
 
2351
2284
  interface PlayerNodeInitializationResult<T = unknown> {
@@ -2369,7 +2302,6 @@ declare class Player extends PlayerEventsEmitter<PlayerEvents> {
2369
2302
  * The version of discord-player
2370
2303
  */
2371
2304
  static readonly version: string;
2372
- static _singletonKey: symbol;
2373
2305
  /**
2374
2306
  * The unique identifier of this player instance
2375
2307
  */
@@ -2398,10 +2330,6 @@ declare class Player extends PlayerEventsEmitter<PlayerEvents> {
2398
2330
  * The player events channel
2399
2331
  */
2400
2332
  events: PlayerEventsEmitter<GuildQueueEvents<any>>;
2401
- /**
2402
- * The route planner
2403
- */
2404
- routePlanner: IPRotator | null;
2405
2333
  /**
2406
2334
  * The player version
2407
2335
  */
@@ -2426,26 +2354,12 @@ declare class Player extends PlayerEventsEmitter<PlayerEvents> {
2426
2354
  */
2427
2355
  onVoiceStateUpdate(handler: VoiceStateHandler): void;
2428
2356
  debug(m: string): boolean;
2429
- /**
2430
- * Creates discord-player singleton instance.
2431
- * @param client The client that instantiated player
2432
- * @param options Player initializer options
2433
- */
2434
- static singleton(client: Client, options?: Omit<PlayerInitOptions, 'ignoreInstance'>): Player;
2435
2357
  /**
2436
2358
  * Creates new discord-player instance.
2437
2359
  * @param client The client that instantiated player
2438
2360
  * @param options Player initializer options
2439
2361
  */
2440
- static create(client: Client, options?: Omit<PlayerInitOptions, 'ignoreInstance'>): Player;
2441
- /**
2442
- * Get all active master player instances
2443
- */
2444
- static getAllPlayers(): Player[];
2445
- /**
2446
- * Clear all master player instances
2447
- */
2448
- static clearAllPlayers(): void;
2362
+ static create(client: Client, options?: PlayerInitOptions): Player;
2449
2363
  /**
2450
2364
  * The current query cache provider in use
2451
2365
  */
@@ -2469,7 +2383,6 @@ declare class Player extends PlayerEventsEmitter<PlayerEvents> {
2469
2383
  *
2470
2384
  * // outputs something like
2471
2385
  * // {
2472
- * // instances: number,
2473
2386
  * // queuesCount: number,
2474
2387
  * // queryCacheEnabled: boolean,
2475
2388
  * // queues: [
@@ -2482,7 +2395,6 @@ declare class Player extends PlayerEventsEmitter<PlayerEvents> {
2482
2395
  * ```
2483
2396
  */
2484
2397
  generateStatistics(): {
2485
- instances: number;
2486
2398
  queuesCount: number;
2487
2399
  queryCacheEnabled: boolean;
2488
2400
  queues: GuildQueueStatisticsMetadata[];
@@ -2639,7 +2551,7 @@ declare class GuildNodeManager<Meta = unknown> {
2639
2551
  * Resolve queue
2640
2552
  * @param node Queue resolvable
2641
2553
  */
2642
- resolve<T = Meta>(node: NodeResolvable): GuildQueue<unknown> | undefined;
2554
+ resolve<T = Meta>(node: NodeResolvable): GuildQueue<T> | undefined;
2643
2555
  /**
2644
2556
  * Resolve queue id
2645
2557
  * @param node Queue resolvable
@@ -3094,10 +3006,6 @@ interface PlaylistJSON {
3094
3006
  tracks: TrackJSON[];
3095
3007
  }
3096
3008
  interface PlayerInitOptions {
3097
- /**
3098
- * The options passed to `ytdl-core`.
3099
- */
3100
- ytdlOptions?: downloadOptions;
3101
3009
  /**
3102
3010
  * The voice connection timeout
3103
3011
  */
@@ -3122,10 +3030,6 @@ interface PlayerInitOptions {
3122
3030
  * Query cache provider
3123
3031
  */
3124
3032
  queryCache?: QueryCacheProvider<any> | null;
3125
- /**
3126
- * Ignore player instance
3127
- */
3128
- ignoreInstance?: boolean;
3129
3033
  /**
3130
3034
  * Use legacy version of ffmpeg
3131
3035
  */
@@ -3134,10 +3038,6 @@ interface PlayerInitOptions {
3134
3038
  * Set bridge provider
3135
3039
  */
3136
3040
  bridgeProvider?: BridgeProvider;
3137
- /**
3138
- * IP rotator config
3139
- */
3140
- ipconfig?: IPRotationConfig;
3141
3041
  /**
3142
3042
  * Skip ffmpeg process when possible
3143
3043
  */
@@ -3150,6 +3050,10 @@ interface PlayerInitOptions {
3150
3050
  * Configure ffmpeg path
3151
3051
  */
3152
3052
  ffmpegPath?: string;
3053
+ /**
3054
+ * Whether to override the fallback context. Defaults to `true`.
3055
+ */
3056
+ overrideFallbackContext?: boolean;
3153
3057
  }
3154
3058
 
3155
3059
  declare class AudioFilters {
@@ -3351,6 +3255,7 @@ interface DependenciesReport {
3351
3255
  'libsodium-wrappers': MaybeNull<string>;
3352
3256
  'sodium-javascript': MaybeNull<string>;
3353
3257
  '@stablelib/xchacha20poly1305': MaybeNull<string>;
3258
+ '@nobel/ciphers': MaybeNull<string>;
3354
3259
  };
3355
3260
  ffmpeg: FFmpegReport;
3356
3261
  }
@@ -3391,4 +3296,4 @@ declare const DependencyReportGenerator: {
3391
3296
 
3392
3297
  declare const version: string;
3393
3298
 
3394
- export { AFilterGraph, AsyncQueue, AsyncQueueAcquisitionOptions, AsyncQueueEntry, AsyncQueueExceptionHandler, AudioFilters, BaseExtractor, Context, ContextReceiver, CreateStreamOps, DependenciesReport, DependencyReportGenerator, DiscordPlayerQueryResultCache, Encodable, EqualizerConfigurationPreset, ExtractorExecutionContext, ExtractorExecutionEvents, ExtractorExecutionFN, ExtractorExecutionResult, ExtractorInfo, ExtractorLoaderOptionDict, ExtractorResolvable, ExtractorSearchContext, ExtractorSession, ExtractorStreamable, FFMPEG_ARGS_PIPED, FFMPEG_ARGS_STRING, FFMPEG_SRATE_REGEX, FFmpegFilterer, FFmpegReport, FFmpegStreamOptions, FilterGraph, FiltersName, GuildNodeCreateOptions, GuildNodeInit, GuildNodeManager, GuildQueue, GuildQueueAFiltersCache, GuildQueueAudioFilters, GuildQueueEvent, GuildQueueEvents, GuildQueueHistory, GuildQueuePlayerNode, GuildQueueStatistics, GuildQueueStatisticsMetadata, HookDeclaration, HookDeclarationContext, IPBlock, IPRotationConfig, IPRotator, LrcGetParams, LrcGetResult, LrcLib, LrcSearchParams, LrcSearchResult, MaybeNull, MetadataDispatch, NextFunction, NodeResolvable, OnAfterCreateStreamHandler, OnBeforeCreateStreamHandler, PackageJSON, PlayOptions, Player, PlayerEvent, PlayerEvents, PlayerEventsEmitter, PlayerInitOptions, PlayerNodeInitializationResult, PlayerNodeInitializerOptions, PlayerProgressbarOptions, PlayerSearchResult, PlayerTimestamp, PlayerTriggeredReason, Playlist, PlaylistInitData, PlaylistJSON, PostProcessedResult, QueryCache, QueryCacheOptions, QueryCacheProvider, QueryCacheResolverContext, QueryExtractorSearch, QueryResolver, QueryType, QueueFilters, QueueRepeatMode, RawTrackData, RequestEntity, ResolvedQuery, ResourcePlayOptions, Runtime, RuntimeType, SearchOptions, SearchQueryType, SearchResult, SearchResultData, SequentialBucket, SerializedPlaylist, SerializedTrack, SerializedType, SetterFN$1 as SetterFN, SkipOptions, StreamConfig, StreamDispatcher, TimeData, TimelineDispatcherOptions, Track, TrackJSON, TrackLike, TrackResolvable, TrackSkipReason, TrackSource, TypeUtil, Util, VALIDATE_QUEUE_CAP, VoiceConnectConfig, VoiceEvents, VoiceStateHandler, VoiceUtils, WithMetadata, createContext, createErisCompat, createFFmpegStream, createHook, decode, deserialize, encode, isErisProxy, onAfterCreateStream, onBeforeCreateStream, serialize, tryIntoThumbnailString, useContext, useHistory, useMainPlayer, useMasterPlayer, useMetadata, usePlayer, useQueue, useTimeline, useVolume, version };
3299
+ export { AFilterGraph, AsyncQueue, AsyncQueueAcquisitionOptions, AsyncQueueEntry, AsyncQueueExceptionHandler, AudioFilters, BaseExtractor, Context, ContextReceiver, CreateStreamOps, DependenciesReport, DependencyReportGenerator, DiscordPlayerQueryResultCache, Encodable, EqualizerConfigurationPreset, ExtractorExecutionContext, ExtractorExecutionEvents, ExtractorExecutionFN, ExtractorExecutionResult, ExtractorInfo, ExtractorResolvable, ExtractorSearchContext, ExtractorSession, ExtractorStreamable, FFMPEG_ARGS_PIPED, FFMPEG_ARGS_STRING, FFMPEG_SRATE_REGEX, FFmpegFilterer, FFmpegReport, FFmpegStreamOptions, FilterGraph, FiltersName, GuildNodeCreateOptions, GuildNodeInit, GuildNodeManager, GuildQueue, GuildQueueAFiltersCache, GuildQueueAudioFilters, GuildQueueEvent, GuildQueueEvents, GuildQueueHistory, GuildQueuePlayerNode, GuildQueueStatistics, GuildQueueStatisticsMetadata, GuildQueueTimeline, LrcGetParams, LrcGetResult, LrcLib, LrcSearchParams, LrcSearchResult, MaybeNull, MetadataDispatch, NextFunction, NodeResolvable, OnAfterCreateStreamHandler, OnBeforeCreateStreamHandler, PackageJSON, PlayOptions, Player, PlayerEvent, PlayerEvents, PlayerEventsEmitter, PlayerInitOptions, PlayerNodeInitializationResult, PlayerNodeInitializerOptions, PlayerProgressbarOptions, PlayerSearchResult, PlayerTimestamp, PlayerTriggeredReason, Playlist, PlaylistInitData, PlaylistJSON, PostProcessedResult, QueryCache, QueryCacheOptions, QueryCacheProvider, QueryCacheResolverContext, QueryExtractorSearch, QueryResolver, QueryType, QueueFilters, QueueRepeatMode, RawTrackData, RequestEntity, ResolvedQuery, ResourcePlayOptions, Runtime, RuntimeType, SearchOptions, SearchQueryType, SearchResult, SearchResultData, SequentialBucket, SerializedPlaylist, SerializedTrack, SerializedType, SetterFN$1 as SetterFN, SkipOptions, StreamConfig, StreamDispatcher, TimeData, TimelineDispatcherOptions, Track, TrackJSON, TrackLike, TrackResolvable, TrackSkipReason, TrackSource, TypeUtil, Util, VALIDATE_QUEUE_CAP, VoiceConnectConfig, VoiceEvents, VoiceStateHandler, VoiceUtils, WithMetadata, createContext, createErisCompat, createFFmpegStream, decode, deserialize, encode, isErisProxy, onAfterCreateStream, onBeforeCreateStream, serialize, tryIntoThumbnailString, useContext, useHistory, useMainPlayer, useMetadata, usePlayer, useQueue, useTimeline, useVolume, version };