ziplayer 0.0.9 → 0.1.0
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 +61 -30
- package/dist/extensions/BaseExtension.d.ts +9 -3
- package/dist/extensions/BaseExtension.d.ts.map +1 -1
- package/dist/extensions/BaseExtension.js.map +1 -1
- package/dist/structures/Player.d.ts +294 -2
- package/dist/structures/Player.d.ts.map +1 -1
- package/dist/structures/Player.js +586 -88
- package/dist/structures/Player.js.map +1 -1
- package/dist/structures/PlayerManager.d.ts +166 -2
- package/dist/structures/PlayerManager.d.ts.map +1 -1
- package/dist/structures/PlayerManager.js +182 -8
- package/dist/structures/PlayerManager.js.map +1 -1
- package/dist/structures/Queue.d.ts +193 -2
- package/dist/structures/Queue.d.ts.map +1 -1
- package/dist/structures/Queue.js +193 -2
- package/dist/structures/Queue.js.map +1 -1
- package/dist/types/index.d.ts +327 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/timeout.d.ts +9 -0
- package/dist/utils/timeout.d.ts.map +1 -0
- package/dist/utils/timeout.js +14 -0
- package/dist/utils/timeout.js.map +1 -0
- package/package.json +1 -1
- package/src/extensions/BaseExtension.ts +35 -10
- package/src/structures/Player.ts +615 -90
- package/src/structures/PlayerManager.ts +189 -8
- package/src/structures/Queue.ts +196 -2
- package/src/types/index.ts +343 -4
- package/src/utils/timeout.ts +10 -0
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
|
-
|
|
124
|
+
### Player Lifecycle Overview
|
|
124
125
|
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
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
|
-
|
|
163
|
+
### Lavalink Process
|
|
155
164
|
|
|
156
|
-
|
|
157
|
-
|
|
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,
|
|
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":";;;
|
|
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,38 @@ 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
|
+
/**
|
|
68
|
+
* Attach an extension to the player
|
|
69
|
+
*
|
|
70
|
+
* @param {BaseExtension} extension - The extension to attach
|
|
71
|
+
* @example
|
|
72
|
+
* player.attachExtension(new MyExtension());
|
|
73
|
+
*/
|
|
74
|
+
attachExtension(extension: BaseExtension): void;
|
|
75
|
+
/**
|
|
76
|
+
* Detach an extension from the player
|
|
77
|
+
*
|
|
78
|
+
* @param {BaseExtension} extension - The extension to detach
|
|
79
|
+
* @example
|
|
80
|
+
* player.detachExtension(new MyExtension());
|
|
81
|
+
*/
|
|
82
|
+
detachExtension(extension: BaseExtension): void;
|
|
83
|
+
/**
|
|
84
|
+
* Get all extensions attached to the player
|
|
85
|
+
*
|
|
86
|
+
* @returns {readonly BaseExtension[]} All attached extensions
|
|
87
|
+
* @example
|
|
88
|
+
* const extensions = player.getExtensions();
|
|
89
|
+
* console.log(`Extensions: ${extensions.length}`);
|
|
90
|
+
*/
|
|
91
|
+
getExtensions(): readonly BaseExtension[];
|
|
92
|
+
private invokeExtensionLifecycle;
|
|
93
|
+
private runBeforePlayHooks;
|
|
94
|
+
private runAfterPlayHooks;
|
|
95
|
+
private extensionsProvideSearch;
|
|
96
|
+
private extensionsProvideStream;
|
|
28
97
|
/**
|
|
29
98
|
* Start playing a specific track immediately, replacing the current resource.
|
|
30
99
|
*/
|
|
@@ -33,63 +102,286 @@ export declare class Player extends EventEmitter {
|
|
|
33
102
|
private ttsQueue;
|
|
34
103
|
private ttsActive;
|
|
35
104
|
private clearLeaveTimeout;
|
|
36
|
-
private withTimeout;
|
|
37
105
|
private debug;
|
|
38
106
|
constructor(guildId: string, options: PlayerOptions | undefined, manager: PlayerManager);
|
|
39
107
|
private setupEventListeners;
|
|
40
108
|
private ensureTTSPlayer;
|
|
41
109
|
addPlugin(plugin: SourcePlugin): void;
|
|
42
110
|
removePlugin(name: string): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Connect to a voice channel
|
|
113
|
+
*
|
|
114
|
+
* @param {VoiceChannel} channel - Discord voice channel
|
|
115
|
+
* @returns {Promise<VoiceConnection>} The voice connection
|
|
116
|
+
* @example
|
|
117
|
+
* await player.connect(voiceChannel);
|
|
118
|
+
*/
|
|
43
119
|
connect(channel: VoiceChannel): Promise<VoiceConnection>;
|
|
120
|
+
/**
|
|
121
|
+
* Search for tracks using the player's extensions and plugins
|
|
122
|
+
*
|
|
123
|
+
* @param {string} query - The query to search for
|
|
124
|
+
* @param {string} requestedBy - The user ID who requested the search
|
|
125
|
+
* @returns {Promise<SearchResult>} The search result
|
|
126
|
+
* @example
|
|
127
|
+
* const result = await player.search("Never Gonna Give You Up", userId);
|
|
128
|
+
* console.log(`Search result: ${result.tracks.length} tracks`);
|
|
129
|
+
*/
|
|
44
130
|
search(query: string, requestedBy: string): Promise<SearchResult>;
|
|
131
|
+
/**
|
|
132
|
+
* Play a track or search query
|
|
133
|
+
*
|
|
134
|
+
* @param {string | Track} query - Track URL, search query, or Track object
|
|
135
|
+
* @param {string} requestedBy - User ID who requested the track
|
|
136
|
+
* @returns {Promise<boolean>} True if playback started successfully
|
|
137
|
+
* @example
|
|
138
|
+
* await player.play("Never Gonna Give You Up", userId);
|
|
139
|
+
* await player.play("https://youtube.com/watch?v=dQw4w9WgXcQ", userId);
|
|
140
|
+
* await player.play("tts: Hello everyone!", userId);
|
|
141
|
+
*/
|
|
45
142
|
play(query: string | Track, requestedBy?: string): Promise<boolean>;
|
|
46
143
|
/**
|
|
47
144
|
* Interrupt current music with a TTS track. Pauses music, swaps the
|
|
48
145
|
* subscription to a dedicated TTS player, plays TTS, then resumes.
|
|
146
|
+
*
|
|
147
|
+
* @param {Track} track - The track to interrupt with
|
|
148
|
+
* @returns {Promise<void>}
|
|
149
|
+
* @example
|
|
150
|
+
* await player.interruptWithTTSTrack(track);
|
|
49
151
|
*/
|
|
50
152
|
interruptWithTTSTrack(track: Track): Promise<void>;
|
|
51
|
-
/**
|
|
153
|
+
/**
|
|
154
|
+
* Play queued TTS items sequentially
|
|
155
|
+
*
|
|
156
|
+
* @returns {Promise<void>}
|
|
157
|
+
* @example
|
|
158
|
+
* await player.playNextTTS();
|
|
159
|
+
*/
|
|
52
160
|
private playNextTTS;
|
|
53
161
|
/** Build AudioResource for a given track using the plugin pipeline */
|
|
54
162
|
private resourceFromTrack;
|
|
55
163
|
private generateWillNext;
|
|
56
164
|
private playNext;
|
|
165
|
+
/**
|
|
166
|
+
* Pause the current track
|
|
167
|
+
*
|
|
168
|
+
* @returns {boolean} True if paused successfully
|
|
169
|
+
* @example
|
|
170
|
+
* const paused = player.pause();
|
|
171
|
+
* console.log(`Paused: ${paused}`);
|
|
172
|
+
*/
|
|
57
173
|
pause(): boolean;
|
|
174
|
+
/**
|
|
175
|
+
* Resume the current track
|
|
176
|
+
*
|
|
177
|
+
* @returns {boolean} True if resumed successfully
|
|
178
|
+
* @example
|
|
179
|
+
* const resumed = player.resume();
|
|
180
|
+
* console.log(`Resumed: ${resumed}`);
|
|
181
|
+
*/
|
|
58
182
|
resume(): boolean;
|
|
183
|
+
/**
|
|
184
|
+
* Stop the current track
|
|
185
|
+
*
|
|
186
|
+
* @returns {boolean} True if stopped successfully
|
|
187
|
+
* @example
|
|
188
|
+
* const stopped = player.stop();
|
|
189
|
+
* console.log(`Stopped: ${stopped}`);
|
|
190
|
+
*/
|
|
59
191
|
stop(): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Skip to the next track
|
|
194
|
+
*
|
|
195
|
+
* @returns {boolean} True if skipped successfully
|
|
196
|
+
* @example
|
|
197
|
+
* const skipped = player.skip();
|
|
198
|
+
* console.log(`Skipped: ${skipped}`);
|
|
199
|
+
*/
|
|
60
200
|
skip(): boolean;
|
|
61
201
|
/**
|
|
62
202
|
* Go back to the previous track in history and play it.
|
|
203
|
+
*
|
|
204
|
+
* @returns {Promise<boolean>} True if previous track was played successfully
|
|
205
|
+
* @example
|
|
206
|
+
* const previous = await player.previous();
|
|
207
|
+
* console.log(`Previous: ${previous}`);
|
|
63
208
|
*/
|
|
64
209
|
previous(): Promise<boolean>;
|
|
210
|
+
/**
|
|
211
|
+
* Loop the current track
|
|
212
|
+
*
|
|
213
|
+
* @param {LoopMode} mode - The loop mode to set
|
|
214
|
+
* @returns {LoopMode} The loop mode
|
|
215
|
+
* @example
|
|
216
|
+
* const loopMode = player.loop("track");
|
|
217
|
+
* console.log(`Loop mode: ${loopMode}`);
|
|
218
|
+
*/
|
|
65
219
|
loop(mode?: LoopMode): LoopMode;
|
|
220
|
+
/**
|
|
221
|
+
* Set the auto-play mode
|
|
222
|
+
*
|
|
223
|
+
* @param {boolean} mode - The auto-play mode to set
|
|
224
|
+
* @returns {boolean} The auto-play mode
|
|
225
|
+
* @example
|
|
226
|
+
* const autoPlayMode = player.autoPlay(true);
|
|
227
|
+
* console.log(`Auto-play mode: ${autoPlayMode}`);
|
|
228
|
+
*/
|
|
66
229
|
autoPlay(mode?: boolean): boolean;
|
|
230
|
+
/**
|
|
231
|
+
* Set the volume of the current track
|
|
232
|
+
*
|
|
233
|
+
* @param {number} volume - The volume to set
|
|
234
|
+
* @returns {boolean} True if volume was set successfully
|
|
235
|
+
* @example
|
|
236
|
+
* const volumeSet = player.setVolume(50);
|
|
237
|
+
* console.log(`Volume set: ${volumeSet}`);
|
|
238
|
+
*/
|
|
67
239
|
setVolume(volume: number): boolean;
|
|
240
|
+
/**
|
|
241
|
+
* Shuffle the queue
|
|
242
|
+
*
|
|
243
|
+
* @returns {void}
|
|
244
|
+
* @example
|
|
245
|
+
* player.shuffle();
|
|
246
|
+
*/
|
|
68
247
|
shuffle(): void;
|
|
248
|
+
/**
|
|
249
|
+
* Clear the queue
|
|
250
|
+
*
|
|
251
|
+
* @returns {void}
|
|
252
|
+
* @example
|
|
253
|
+
* player.clearQueue();
|
|
254
|
+
*/
|
|
69
255
|
clearQueue(): void;
|
|
70
256
|
/**
|
|
71
257
|
* Insert a track or list of tracks into the upcoming queue at a specific position (0 = play after current).
|
|
72
258
|
* - If `query` is a string, performs a search and inserts resulting tracks (playlist supported).
|
|
73
259
|
* - If a Track or Track[] is provided, inserts directly.
|
|
74
260
|
* Does not auto-start playback; it only modifies the queue.
|
|
261
|
+
*
|
|
262
|
+
* @param {string | Track | Track[]} query - The track or tracks to insert
|
|
263
|
+
* @param {number} index - The index to insert the tracks at
|
|
264
|
+
* @param {string} requestedBy - The user ID who requested the insert
|
|
265
|
+
* @returns {Promise<boolean>} True if the tracks were inserted successfully
|
|
266
|
+
* @example
|
|
267
|
+
* const inserted = await player.insert("Song Name", 0, userId);
|
|
268
|
+
* console.log(`Inserted: ${inserted}`);
|
|
75
269
|
*/
|
|
76
270
|
insert(query: string | Track | Track[], index: number, requestedBy?: string): Promise<boolean>;
|
|
271
|
+
/**
|
|
272
|
+
* Remove a track from the queue
|
|
273
|
+
*
|
|
274
|
+
* @param {number} index - The index of the track to remove
|
|
275
|
+
* @returns {Track | null} The removed track or null
|
|
276
|
+
* @example
|
|
277
|
+
* const removed = player.remove(0);
|
|
278
|
+
* console.log(`Removed: ${removed?.title}`);
|
|
279
|
+
*/
|
|
77
280
|
remove(index: number): Track | null;
|
|
281
|
+
/**
|
|
282
|
+
* Get the progress bar of the current track
|
|
283
|
+
*
|
|
284
|
+
* @param {ProgressBarOptions} options - The options for the progress bar
|
|
285
|
+
* @returns {string} The progress bar
|
|
286
|
+
* @example
|
|
287
|
+
* const progressBar = player.getProgressBar();
|
|
288
|
+
* console.log(`Progress bar: ${progressBar}`);
|
|
289
|
+
*/
|
|
78
290
|
getProgressBar(options?: ProgressBarOptions): string;
|
|
291
|
+
/**
|
|
292
|
+
* Get the time of the current track
|
|
293
|
+
*
|
|
294
|
+
* @returns {Object} The time of the current track
|
|
295
|
+
* @example
|
|
296
|
+
* const time = player.getTime();
|
|
297
|
+
* console.log(`Time: ${time.current}`);
|
|
298
|
+
*/
|
|
79
299
|
getTime(): {
|
|
80
300
|
current: number;
|
|
81
301
|
total: number;
|
|
82
302
|
format: string;
|
|
83
303
|
};
|
|
304
|
+
/**
|
|
305
|
+
* Format the time in the format of HH:MM:SS
|
|
306
|
+
*
|
|
307
|
+
* @param {number} ms - The time in milliseconds
|
|
308
|
+
* @returns {string} The formatted time
|
|
309
|
+
* @example
|
|
310
|
+
* const formattedTime = player.formatTime(1000);
|
|
311
|
+
* console.log(`Formatted time: ${formattedTime}`);
|
|
312
|
+
*/
|
|
84
313
|
formatTime(ms: number): string;
|
|
85
314
|
private scheduleLeave;
|
|
315
|
+
/**
|
|
316
|
+
* Destroy the player
|
|
317
|
+
*
|
|
318
|
+
* @returns {void}
|
|
319
|
+
* @example
|
|
320
|
+
* player.destroy();
|
|
321
|
+
*/
|
|
86
322
|
destroy(): void;
|
|
323
|
+
/**
|
|
324
|
+
* Get the size of the queue
|
|
325
|
+
*
|
|
326
|
+
* @returns {number} The size of the queue
|
|
327
|
+
* @example
|
|
328
|
+
* const queueSize = player.queueSize;
|
|
329
|
+
* console.log(`Queue size: ${queueSize}`);
|
|
330
|
+
*/
|
|
87
331
|
get queueSize(): number;
|
|
332
|
+
/**
|
|
333
|
+
* Get the current track
|
|
334
|
+
*
|
|
335
|
+
* @returns {Track | null} The current track or null
|
|
336
|
+
* @example
|
|
337
|
+
* const currentTrack = player.currentTrack;
|
|
338
|
+
* console.log(`Current track: ${currentTrack?.title}`);
|
|
339
|
+
*/
|
|
88
340
|
get currentTrack(): Track | null;
|
|
341
|
+
/**
|
|
342
|
+
* Get the previous track
|
|
343
|
+
*
|
|
344
|
+
* @returns {Track | null} The previous track or null
|
|
345
|
+
* @example
|
|
346
|
+
* const previousTrack = player.previousTrack;
|
|
347
|
+
* console.log(`Previous track: ${previousTrack?.title}`);
|
|
348
|
+
*/
|
|
89
349
|
get previousTrack(): Track | null;
|
|
350
|
+
/**
|
|
351
|
+
* Get the upcoming tracks
|
|
352
|
+
*
|
|
353
|
+
* @returns {Track[]} The upcoming tracks
|
|
354
|
+
* @example
|
|
355
|
+
* const upcomingTracks = player.upcomingTracks;
|
|
356
|
+
* console.log(`Upcoming tracks: ${upcomingTracks.length}`);
|
|
357
|
+
*/
|
|
90
358
|
get upcomingTracks(): Track[];
|
|
359
|
+
/**
|
|
360
|
+
* Get the previous tracks
|
|
361
|
+
*
|
|
362
|
+
* @returns {Track[]} The previous tracks
|
|
363
|
+
* @example
|
|
364
|
+
* const previousTracks = player.previousTracks;
|
|
365
|
+
* console.log(`Previous tracks: ${previousTracks.length}`);
|
|
366
|
+
*/
|
|
91
367
|
get previousTracks(): Track[];
|
|
368
|
+
/**
|
|
369
|
+
* Get the available plugins
|
|
370
|
+
*
|
|
371
|
+
* @returns {string[]} The available plugins
|
|
372
|
+
* @example
|
|
373
|
+
* const availablePlugins = player.availablePlugins;
|
|
374
|
+
* console.log(`Available plugins: ${availablePlugins.length}`);
|
|
375
|
+
*/
|
|
92
376
|
get availablePlugins(): string[];
|
|
377
|
+
/**
|
|
378
|
+
* Get the related tracks
|
|
379
|
+
*
|
|
380
|
+
* @returns {Track[] | null} The related tracks or null
|
|
381
|
+
* @example
|
|
382
|
+
* const relatedTracks = player.relatedTracks;
|
|
383
|
+
* console.log(`Related tracks: ${relatedTracks?.length}`);
|
|
384
|
+
*/
|
|
93
385
|
get relatedTracks(): Track[] | null;
|
|
94
386
|
}
|
|
95
387
|
//# sourceMappingURL=Player.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../../src/structures/Player.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAKN,eAAe,EACf,WAAW,IAAI,kBAAkB,EAMjC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../../src/structures/Player.ts"],"names":[],"mappings":"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"}
|