ziplayer 0.0.9 → 0.1.1

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
@@ -17,6 +17,7 @@ A modular Discord voice player with plugin system for @discordjs/voice.
17
17
  - 🔔 **Event-driven** - Rich event system for all player actions
18
18
  - 🎭 **Multi-guild support** - Manage players across multiple Discord servers
19
19
  - 🗃️ **User data** - Attach custom data to each player for later use
20
+ - 🔌 **Lavalink** - Support manage an external Lavalink JVM node
20
21
 
21
22
  ## Installation
22
23
 
@@ -120,41 +121,71 @@ Notes
120
121
  - For CPU-heavy TTS generation, consider offloading to `worker_threads` or a separate process and pass a stream/buffer to the
121
122
  plugin.
122
123
 
123
- ## Creating Custom Plugins
124
+ ### Player Lifecycle Overview
124
125
 
125
- ```typescript
126
- import { BasePlugin, Track, SearchResult, StreamInfo } from "ziplayer";
127
-
128
- export class MyPlugin extends BasePlugin {
129
- name = "myplugin";
130
- version = "1.0.0";
131
-
132
- canHandle(query: string): boolean {
133
- return query.includes("mysite.com");
134
- }
135
-
136
- async search(query: string, requestedBy: string): Promise<SearchResult> {
137
- // Implement search logic
138
- return {
139
- tracks: [
140
- /* ... */
141
- ],
142
- };
143
- }
144
-
145
- async getStream(track: Track): Promise<StreamInfo> {
146
- // Return audio stream
147
- return { stream, type: "arbitrary" };
148
- }
149
- }
126
+ ```
127
+ PlayerManager.create(guild, opts)
128
+
129
+
130
+ [Player constructor]
131
+ - setup event listeners
132
+ - freeze ExtensionContext { player, manager }
133
+ - register plugins
134
+
135
+
136
+ attachExtension(ext)
137
+ - set ext.player
138
+ - ext.onRegister?(context)
139
+ - ext.active?(...) → false ⇒ detach
140
+
141
+
142
+ player.play(query, by)
143
+ - runBeforePlayHooks → extensions may mutate query/tracks/start Lavalink
144
+ - resolve track list / queue updates / TTS interrupt check
145
+ - extensionsProvideStream → extension stream overrides plugin pipeline
146
+ - plugin.getStream / getFallback
147
+
148
+
149
+ Audio playback
150
+ - trackStart / queue events emitted
151
+ - runAfterPlayHooks with final outcome
152
+
153
+
154
+ player.destroy()
155
+ - stop audio/voice / clear queue & plugins
156
+ - ext.onDestroy?(context) for each attached extension
157
+ - emit playerDestroy & cleanup references
150
158
  ```
151
159
 
152
- ## Progress Bar
160
+ This diagram shows how custom extensions (voice, lyrics, Lavalink, etc.) integrate across the full player lifecycle and where
161
+ their hooks are invoked.
153
162
 
154
- Display the current playback progress with `getProgressBar`:
163
+ ### Lavalink Process
155
164
 
156
- ```typescript
157
- console.log(player.getProgressBar({ size: 30, barChar: "-", progressChar: "🔘" }));
165
+ Use `lavalinkExt` when you need ZiPlayer to manage an external Lavalink JVM node. The extension starts, stops, and optionally
166
+ restarts the Lavalink jar and forwards lifecycle events through the manager/player.
167
+
168
+ ```ts
169
+ import { PlayerManager } from "ziplayer";
170
+ import { lavalinkExt } from "@ziplayer/extension";
171
+
172
+ const lavalink = new lavalinkExt(null, {
173
+ nodes: [
174
+ {
175
+ identifier: "locallavalink",
176
+ password: "youshallnotpass",
177
+ host: "localhost",
178
+ port: 2333,
179
+ secure: false,
180
+ },
181
+ ],
182
+ client: client,
183
+ searchPrefix: "scsearch",
184
+ });
185
+
186
+ const manager = new PlayerManager({
187
+ extensions: ["lavalinkExt"],
188
+ });
158
189
  ```
159
190
 
160
191
  ## Events
@@ -1,9 +1,15 @@
1
- import { SourceExtension } from "../types";
2
- import { Player } from "../structures/Player";
1
+ import type { SourceExtension, ExtensionContext, SearchResult, ExtensionPlayRequest, ExtensionPlayResponse, ExtensionAfterPlayPayload, ExtensionStreamRequest, StreamInfo, ExtensionSearchRequest } from "../types";
2
+ import type { Player } from "../structures/Player";
3
3
  export declare abstract class BaseExtension implements SourceExtension {
4
4
  abstract name: string;
5
5
  abstract version: string;
6
6
  abstract player: Player | null;
7
- abstract active(alas: any): boolean;
7
+ abstract active(alas: any): boolean | Promise<boolean>;
8
+ onRegister?(context: ExtensionContext): void | Promise<void>;
9
+ onDestroy?(context: ExtensionContext): void | Promise<void>;
10
+ beforePlay?(context: ExtensionContext, payload: ExtensionPlayRequest): Promise<ExtensionPlayResponse | void> | ExtensionPlayResponse | void;
11
+ afterPlay?(context: ExtensionContext, payload: ExtensionAfterPlayPayload): Promise<void> | void;
12
+ provideSearch?(context: ExtensionContext, payload: ExtensionSearchRequest): Promise<SearchResult | null | undefined> | SearchResult | null | undefined;
13
+ provideStream?(context: ExtensionContext, payload: ExtensionStreamRequest): Promise<StreamInfo | null | undefined> | StreamInfo | null | undefined;
8
14
  }
9
15
  //# sourceMappingURL=BaseExtension.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseExtension.d.ts","sourceRoot":"","sources":["../../src/extensions/BaseExtension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAmC,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,8BAAsB,aAAc,YAAW,eAAe;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO;CACnC"}
1
+ {"version":3,"file":"BaseExtension.d.ts","sourceRoot":"","sources":["../../src/extensions/BaseExtension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EACtB,UAAU,EACV,sBAAsB,EACtB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,8BAAsB,aAAc,YAAW,eAAe;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEtD,UAAU,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5D,SAAS,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3D,UAAU,CAAC,CACV,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,oBAAoB,GAC3B,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,qBAAqB,GAAG,IAAI;IACvE,SAAS,CAAC,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAC/F,aAAa,CAAC,CACb,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,sBAAsB,GAC7B,OAAO,CAAC,YAAY,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,YAAY,GAAG,IAAI,GAAG,SAAS;IAC7E,aAAa,CAAC,CACb,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,sBAAsB,GAC7B,OAAO,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS;CACzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"BaseExtension.js","sourceRoot":"","sources":["../../src/extensions/BaseExtension.ts"],"names":[],"mappings":";;;AAGA,MAAsB,aAAa;CAMlC;AAND,sCAMC"}
1
+ {"version":3,"file":"BaseExtension.js","sourceRoot":"","sources":["../../src/extensions/BaseExtension.ts"],"names":[],"mappings":";;;AAaA,MAAsB,aAAa;CAqBlC;AArBD,sCAqBC"}
@@ -1,6 +1,7 @@
1
1
  import { EventEmitter } from "events";
2
2
  import { VoiceConnection, AudioPlayer as DiscordAudioPlayer } from "@discordjs/voice";
3
3
  import { VoiceChannel } from "discord.js";
4
+ import { BaseExtension } from "../extensions";
4
5
  import { Track, PlayerOptions, PlayerEvents, SourcePlugin, SearchResult, ProgressBarOptions, LoopMode } from "../types";
5
6
  import { Queue } from "./Queue";
6
7
  import { PluginManager } from "../plugins";
@@ -9,6 +10,42 @@ export declare interface Player {
9
10
  on<K extends keyof PlayerEvents>(event: K, listener: (...args: PlayerEvents[K]) => void): this;
10
11
  emit<K extends keyof PlayerEvents>(event: K, ...args: PlayerEvents[K]): boolean;
11
12
  }
13
+ /**
14
+ * Represents a music player for a specific Discord guild.
15
+ *
16
+ * @example
17
+ * // Create and configure player
18
+ * const player = await manager.create(guildId, {
19
+ * tts: { interrupt: true, volume: 1 },
20
+ * leaveOnEnd: true,
21
+ * leaveTimeout: 30000
22
+ * });
23
+ *
24
+ * // Connect to voice channel
25
+ * await player.connect(voiceChannel);
26
+ *
27
+ * // Play different types of content
28
+ * await player.play("Never Gonna Give You Up", userId); // Search query
29
+ * await player.play("https://youtube.com/watch?v=dQw4w9WgXcQ", userId); // Direct URL
30
+ * await player.play("tts: Hello everyone!", userId); // Text-to-Speech
31
+ *
32
+ * // Player controls
33
+ * player.pause(); // Pause current track
34
+ * player.resume(); // Resume paused track
35
+ * player.skip(); // Skip to next track
36
+ * player.stop(); // Stop and clear queue
37
+ * player.setVolume(0.5); // Set volume to 50%
38
+ *
39
+ * // Event handling
40
+ * player.on("trackStart", (player, track) => {
41
+ * console.log(`Now playing: ${track.title}`);
42
+ * });
43
+ *
44
+ * player.on("queueEnd", (player) => {
45
+ * console.log("Queue finished");
46
+ * });
47
+ *
48
+ */
12
49
  export declare class Player extends EventEmitter {
13
50
  readonly guildId: string;
14
51
  connection: VoiceConnection | null;
@@ -25,6 +62,41 @@ export declare class Player extends EventEmitter {
25
62
  private currentResource;
26
63
  private volumeInterval;
27
64
  private skipLoop;
65
+ private extensions;
66
+ private extensionContext;
67
+ private pluginCache;
68
+ private readonly PLUGIN_CACHE_TTL;
69
+ private pluginCacheTimestamps;
70
+ /**
71
+ * Attach an extension to the player
72
+ *
73
+ * @param {BaseExtension} extension - The extension to attach
74
+ * @example
75
+ * player.attachExtension(new MyExtension());
76
+ */
77
+ attachExtension(extension: BaseExtension): void;
78
+ /**
79
+ * Detach an extension from the player
80
+ *
81
+ * @param {BaseExtension} extension - The extension to detach
82
+ * @example
83
+ * player.detachExtension(new MyExtension());
84
+ */
85
+ detachExtension(extension: BaseExtension): void;
86
+ /**
87
+ * Get all extensions attached to the player
88
+ *
89
+ * @returns {readonly BaseExtension[]} All attached extensions
90
+ * @example
91
+ * const extensions = player.getExtensions();
92
+ * console.log(`Extensions: ${extensions.length}`);
93
+ */
94
+ getExtensions(): readonly BaseExtension[];
95
+ private invokeExtensionLifecycle;
96
+ private runBeforePlayHooks;
97
+ private runAfterPlayHooks;
98
+ private extensionsProvideSearch;
99
+ private extensionsProvideStream;
28
100
  /**
29
101
  * Start playing a specific track immediately, replacing the current resource.
30
102
  */
@@ -33,63 +105,314 @@ export declare class Player extends EventEmitter {
33
105
  private ttsQueue;
34
106
  private ttsActive;
35
107
  private clearLeaveTimeout;
36
- private withTimeout;
37
108
  private debug;
38
109
  constructor(guildId: string, options: PlayerOptions | undefined, manager: PlayerManager);
39
110
  private setupEventListeners;
40
111
  private ensureTTSPlayer;
41
112
  addPlugin(plugin: SourcePlugin): void;
42
113
  removePlugin(name: string): boolean;
114
+ /**
115
+ * Connect to a voice channel
116
+ *
117
+ * @param {VoiceChannel} channel - Discord voice channel
118
+ * @returns {Promise<VoiceConnection>} The voice connection
119
+ * @example
120
+ * await player.connect(voiceChannel);
121
+ */
43
122
  connect(channel: VoiceChannel): Promise<VoiceConnection>;
123
+ /**
124
+ * Search for tracks using the player's extensions and plugins
125
+ *
126
+ * @param {string} query - The query to search for
127
+ * @param {string} requestedBy - The user ID who requested the search
128
+ * @returns {Promise<SearchResult>} The search result
129
+ * @example
130
+ * const result = await player.search("Never Gonna Give You Up", userId);
131
+ * console.log(`Search result: ${result.tracks.length} tracks`);
132
+ */
44
133
  search(query: string, requestedBy: string): Promise<SearchResult>;
134
+ /**
135
+ * Play a track or search query
136
+ *
137
+ * @param {string | Track} query - Track URL, search query, or Track object
138
+ * @param {string} requestedBy - User ID who requested the track
139
+ * @returns {Promise<boolean>} True if playback started successfully
140
+ * @example
141
+ * await player.play("Never Gonna Give You Up", userId);
142
+ * await player.play("https://youtube.com/watch?v=dQw4w9WgXcQ", userId);
143
+ * await player.play("tts: Hello everyone!", userId);
144
+ */
45
145
  play(query: string | Track, requestedBy?: string): Promise<boolean>;
46
146
  /**
47
147
  * Interrupt current music with a TTS track. Pauses music, swaps the
48
148
  * subscription to a dedicated TTS player, plays TTS, then resumes.
149
+ *
150
+ * @param {Track} track - The track to interrupt with
151
+ * @returns {Promise<void>}
152
+ * @example
153
+ * await player.interruptWithTTSTrack(track);
49
154
  */
50
155
  interruptWithTTSTrack(track: Track): Promise<void>;
51
- /** Play queued TTS items sequentially */
156
+ /**
157
+ * Play queued TTS items sequentially
158
+ *
159
+ * @returns {Promise<void>}
160
+ * @example
161
+ * await player.playNextTTS();
162
+ */
52
163
  private playNextTTS;
164
+ /**
165
+ * Get cached plugin or find and cache a new one
166
+ * @param track The track to find plugin for
167
+ * @returns The matching plugin or null if not found
168
+ */
169
+ private getCachedPlugin;
170
+ /**
171
+ * Clear expired cache entries
172
+ */
173
+ private clearExpiredCache;
174
+ /**
175
+ * Clear all plugin cache entries
176
+ * @example
177
+ * player.clearPluginCache();
178
+ */
179
+ clearPluginCache(): void;
180
+ /**
181
+ * Get plugin cache statistics
182
+ * @returns Cache statistics
183
+ * @example
184
+ * const stats = player.getPluginCacheStats();
185
+ * console.log(`Cache size: ${stats.size}, Hit rate: ${stats.hitRate}%`);
186
+ */
187
+ getPluginCacheStats(): {
188
+ size: number;
189
+ hitRate: number;
190
+ expiredEntries: number;
191
+ };
53
192
  /** Build AudioResource for a given track using the plugin pipeline */
54
193
  private resourceFromTrack;
55
194
  private generateWillNext;
56
195
  private playNext;
196
+ /**
197
+ * Pause the current track
198
+ *
199
+ * @returns {boolean} True if paused successfully
200
+ * @example
201
+ * const paused = player.pause();
202
+ * console.log(`Paused: ${paused}`);
203
+ */
57
204
  pause(): boolean;
205
+ /**
206
+ * Resume the current track
207
+ *
208
+ * @returns {boolean} True if resumed successfully
209
+ * @example
210
+ * const resumed = player.resume();
211
+ * console.log(`Resumed: ${resumed}`);
212
+ */
58
213
  resume(): boolean;
214
+ /**
215
+ * Stop the current track
216
+ *
217
+ * @returns {boolean} True if stopped successfully
218
+ * @example
219
+ * const stopped = player.stop();
220
+ * console.log(`Stopped: ${stopped}`);
221
+ */
59
222
  stop(): boolean;
223
+ /**
224
+ * Skip to the next track
225
+ *
226
+ * @returns {boolean} True if skipped successfully
227
+ * @example
228
+ * const skipped = player.skip();
229
+ * console.log(`Skipped: ${skipped}`);
230
+ */
60
231
  skip(): boolean;
61
232
  /**
62
233
  * Go back to the previous track in history and play it.
234
+ *
235
+ * @returns {Promise<boolean>} True if previous track was played successfully
236
+ * @example
237
+ * const previous = await player.previous();
238
+ * console.log(`Previous: ${previous}`);
63
239
  */
64
240
  previous(): Promise<boolean>;
241
+ /**
242
+ * Loop the current track
243
+ *
244
+ * @param {LoopMode} mode - The loop mode to set
245
+ * @returns {LoopMode} The loop mode
246
+ * @example
247
+ * const loopMode = player.loop("track");
248
+ * console.log(`Loop mode: ${loopMode}`);
249
+ */
65
250
  loop(mode?: LoopMode): LoopMode;
251
+ /**
252
+ * Set the auto-play mode
253
+ *
254
+ * @param {boolean} mode - The auto-play mode to set
255
+ * @returns {boolean} The auto-play mode
256
+ * @example
257
+ * const autoPlayMode = player.autoPlay(true);
258
+ * console.log(`Auto-play mode: ${autoPlayMode}`);
259
+ */
66
260
  autoPlay(mode?: boolean): boolean;
261
+ /**
262
+ * Set the volume of the current track
263
+ *
264
+ * @param {number} volume - The volume to set
265
+ * @returns {boolean} True if volume was set successfully
266
+ * @example
267
+ * const volumeSet = player.setVolume(50);
268
+ * console.log(`Volume set: ${volumeSet}`);
269
+ */
67
270
  setVolume(volume: number): boolean;
271
+ /**
272
+ * Shuffle the queue
273
+ *
274
+ * @returns {void}
275
+ * @example
276
+ * player.shuffle();
277
+ */
68
278
  shuffle(): void;
279
+ /**
280
+ * Clear the queue
281
+ *
282
+ * @returns {void}
283
+ * @example
284
+ * player.clearQueue();
285
+ */
69
286
  clearQueue(): void;
70
287
  /**
71
288
  * Insert a track or list of tracks into the upcoming queue at a specific position (0 = play after current).
72
289
  * - If `query` is a string, performs a search and inserts resulting tracks (playlist supported).
73
290
  * - If a Track or Track[] is provided, inserts directly.
74
291
  * Does not auto-start playback; it only modifies the queue.
292
+ *
293
+ * @param {string | Track | Track[]} query - The track or tracks to insert
294
+ * @param {number} index - The index to insert the tracks at
295
+ * @param {string} requestedBy - The user ID who requested the insert
296
+ * @returns {Promise<boolean>} True if the tracks were inserted successfully
297
+ * @example
298
+ * const inserted = await player.insert("Song Name", 0, userId);
299
+ * console.log(`Inserted: ${inserted}`);
75
300
  */
76
301
  insert(query: string | Track | Track[], index: number, requestedBy?: string): Promise<boolean>;
302
+ /**
303
+ * Remove a track from the queue
304
+ *
305
+ * @param {number} index - The index of the track to remove
306
+ * @returns {Track | null} The removed track or null
307
+ * @example
308
+ * const removed = player.remove(0);
309
+ * console.log(`Removed: ${removed?.title}`);
310
+ */
77
311
  remove(index: number): Track | null;
312
+ /**
313
+ * Get the progress bar of the current track
314
+ *
315
+ * @param {ProgressBarOptions} options - The options for the progress bar
316
+ * @returns {string} The progress bar
317
+ * @example
318
+ * const progressBar = player.getProgressBar();
319
+ * console.log(`Progress bar: ${progressBar}`);
320
+ */
78
321
  getProgressBar(options?: ProgressBarOptions): string;
322
+ /**
323
+ * Get the time of the current track
324
+ *
325
+ * @returns {Object} The time of the current track
326
+ * @example
327
+ * const time = player.getTime();
328
+ * console.log(`Time: ${time.current}`);
329
+ */
79
330
  getTime(): {
80
331
  current: number;
81
332
  total: number;
82
333
  format: string;
83
334
  };
335
+ /**
336
+ * Format the time in the format of HH:MM:SS
337
+ *
338
+ * @param {number} ms - The time in milliseconds
339
+ * @returns {string} The formatted time
340
+ * @example
341
+ * const formattedTime = player.formatTime(1000);
342
+ * console.log(`Formatted time: ${formattedTime}`);
343
+ */
84
344
  formatTime(ms: number): string;
85
345
  private scheduleLeave;
346
+ /**
347
+ * Destroy the player
348
+ *
349
+ * @returns {void}
350
+ * @example
351
+ * player.destroy();
352
+ */
86
353
  destroy(): void;
354
+ /**
355
+ * Get the size of the queue
356
+ *
357
+ * @returns {number} The size of the queue
358
+ * @example
359
+ * const queueSize = player.queueSize;
360
+ * console.log(`Queue size: ${queueSize}`);
361
+ */
87
362
  get queueSize(): number;
363
+ /**
364
+ * Get the current track
365
+ *
366
+ * @returns {Track | null} The current track or null
367
+ * @example
368
+ * const currentTrack = player.currentTrack;
369
+ * console.log(`Current track: ${currentTrack?.title}`);
370
+ */
88
371
  get currentTrack(): Track | null;
372
+ /**
373
+ * Get the previous track
374
+ *
375
+ * @returns {Track | null} The previous track or null
376
+ * @example
377
+ * const previousTrack = player.previousTrack;
378
+ * console.log(`Previous track: ${previousTrack?.title}`);
379
+ */
89
380
  get previousTrack(): Track | null;
381
+ /**
382
+ * Get the upcoming tracks
383
+ *
384
+ * @returns {Track[]} The upcoming tracks
385
+ * @example
386
+ * const upcomingTracks = player.upcomingTracks;
387
+ * console.log(`Upcoming tracks: ${upcomingTracks.length}`);
388
+ */
90
389
  get upcomingTracks(): Track[];
390
+ /**
391
+ * Get the previous tracks
392
+ *
393
+ * @returns {Track[]} The previous tracks
394
+ * @example
395
+ * const previousTracks = player.previousTracks;
396
+ * console.log(`Previous tracks: ${previousTracks.length}`);
397
+ */
91
398
  get previousTracks(): Track[];
399
+ /**
400
+ * Get the available plugins
401
+ *
402
+ * @returns {string[]} The available plugins
403
+ * @example
404
+ * const availablePlugins = player.availablePlugins;
405
+ * console.log(`Available plugins: ${availablePlugins.length}`);
406
+ */
92
407
  get availablePlugins(): string[];
408
+ /**
409
+ * Get the related tracks
410
+ *
411
+ * @returns {Track[] | null} The related tracks or null
412
+ * @example
413
+ * const relatedTracks = player.relatedTracks;
414
+ * console.log(`Related tracks: ${relatedTracks?.length}`);
415
+ */
93
416
  get relatedTracks(): Track[] | null;
94
417
  }
95
418
  //# sourceMappingURL=Player.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../../src/structures/Player.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../../src/structures/Player.ts"],"names":[],"mappings":"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"}