ziplayer 0.2.6 → 0.2.7-dev.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/AI-Guide.md +956 -0
- package/README.md +259 -196
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +97 -61
- package/dist/plugins/index.js.map +1 -1
- package/dist/structures/Player.d.ts.map +1 -1
- package/dist/structures/Player.js +18 -3
- package/dist/structures/Player.js.map +1 -1
- package/package.json +46 -46
- package/src/extensions/BaseExtension.ts +35 -35
- package/src/extensions/index.ts +190 -190
- package/src/index.ts +16 -16
- package/src/plugins/BasePlugin.ts +27 -27
- package/src/plugins/index.ts +288 -236
- package/src/structures/FilterManager.ts +303 -303
- package/src/structures/Player.ts +1704 -1689
- package/src/structures/PlayerManager.ts +416 -416
- package/src/structures/Queue.ts +354 -354
- package/src/types/index.ts +373 -373
- package/src/utils/timeout.ts +10 -10
- package/tsconfig.json +22 -23
package/src/types/index.ts
CHANGED
|
@@ -1,373 +1,373 @@
|
|
|
1
|
-
import { Readable } from "stream";
|
|
2
|
-
import { Player } from "../structures/Player";
|
|
3
|
-
import type { PlayerManager } from "../structures/PlayerManager";
|
|
4
|
-
import type { AudioFilter } from "./fillter";
|
|
5
|
-
import type { SourcePluginLike } from "./plugin";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Represents a music track with metadata and streaming information.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* // Basic track from YouTube
|
|
12
|
-
* const track: Track = {
|
|
13
|
-
* id: "dQw4w9WgXcQ",
|
|
14
|
-
* title: "Never Gonna Give You Up",
|
|
15
|
-
* url: "https://youtube.com/watch?v=dQw4w9WgXcQ",
|
|
16
|
-
* duration: 212000,
|
|
17
|
-
* thumbnail: "https://img.youtube.com/vi/dQw4w9WgXcQ/maxresdefault.jpg",
|
|
18
|
-
* requestedBy: "123456789",
|
|
19
|
-
* source: "youtube",
|
|
20
|
-
* metadata: {
|
|
21
|
-
* artist: "Rick Astley",
|
|
22
|
-
* album: "Whenever You Need Somebody"
|
|
23
|
-
* }
|
|
24
|
-
* };
|
|
25
|
-
*
|
|
26
|
-
* // Track from SoundCloud
|
|
27
|
-
* const soundcloudTrack: Track = {
|
|
28
|
-
* id: "soundcloud-track-123",
|
|
29
|
-
* title: "Electronic Song",
|
|
30
|
-
* url: "https://soundcloud.com/artist/electronic-song",
|
|
31
|
-
* duration: 180000,
|
|
32
|
-
* requestedBy: "user456",
|
|
33
|
-
* source: "soundcloud",
|
|
34
|
-
* metadata: {
|
|
35
|
-
* artist: "Electronic Artist",
|
|
36
|
-
* genre: "Electronic"
|
|
37
|
-
* }
|
|
38
|
-
* };
|
|
39
|
-
*
|
|
40
|
-
* // TTS track
|
|
41
|
-
* const ttsTrack: Track = {
|
|
42
|
-
* id: "tts-" + Date.now(),
|
|
43
|
-
* title: "TTS: Hello everyone!",
|
|
44
|
-
* url: "tts: Hello everyone!",
|
|
45
|
-
* duration: 5000,
|
|
46
|
-
* requestedBy: "user789",
|
|
47
|
-
* source: "tts",
|
|
48
|
-
* metadata: {
|
|
49
|
-
* text: "Hello everyone!",
|
|
50
|
-
* language: "en"
|
|
51
|
-
* }
|
|
52
|
-
* };
|
|
53
|
-
*/
|
|
54
|
-
export interface Track {
|
|
55
|
-
id: string;
|
|
56
|
-
title: string;
|
|
57
|
-
url: string;
|
|
58
|
-
duration: number;
|
|
59
|
-
thumbnail?: string;
|
|
60
|
-
requestedBy: string;
|
|
61
|
-
source: string;
|
|
62
|
-
metadata?: Record<string, any>;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Contains search results from plugins, including tracks and optional playlist information.
|
|
67
|
-
*
|
|
68
|
-
* @example
|
|
69
|
-
* const result: SearchResult = {
|
|
70
|
-
* tracks: [
|
|
71
|
-
* {
|
|
72
|
-
* id: "track1",
|
|
73
|
-
* title: "Song 1",
|
|
74
|
-
* url: "https://example.com/track1",
|
|
75
|
-
* duration: 180000,
|
|
76
|
-
* requestedBy: "user123",
|
|
77
|
-
* source: "youtube"
|
|
78
|
-
* }
|
|
79
|
-
* ],
|
|
80
|
-
* playlist: {
|
|
81
|
-
* name: "My Playlist",
|
|
82
|
-
* url: "https://example.com/playlist",
|
|
83
|
-
* thumbnail: "https://example.com/thumb.jpg"
|
|
84
|
-
* }
|
|
85
|
-
* };
|
|
86
|
-
*/
|
|
87
|
-
export interface SearchResult {
|
|
88
|
-
tracks: Track[];
|
|
89
|
-
playlist?: {
|
|
90
|
-
name: string;
|
|
91
|
-
url: string;
|
|
92
|
-
thumbnail?: string;
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Contains streaming information for audio playback.
|
|
98
|
-
*
|
|
99
|
-
* @example
|
|
100
|
-
* const streamInfo: StreamInfo = {
|
|
101
|
-
* stream: audioStream,
|
|
102
|
-
* type: "webm/opus",
|
|
103
|
-
* metadata: {
|
|
104
|
-
* bitrate: 128000,
|
|
105
|
-
* sampleRate: 48000
|
|
106
|
-
* }
|
|
107
|
-
* };
|
|
108
|
-
*/
|
|
109
|
-
export interface StreamInfo {
|
|
110
|
-
stream: Readable;
|
|
111
|
-
type: "webm/opus" | "ogg/opus" | "arbitrary";
|
|
112
|
-
metadata?: Record<string, any>;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Configuration options for creating a new player instance.
|
|
117
|
-
*
|
|
118
|
-
* @example
|
|
119
|
-
* const options: PlayerOptions = {
|
|
120
|
-
* leaveOnEnd: true,
|
|
121
|
-
* leaveOnEmpty: true,
|
|
122
|
-
* leaveTimeout: 30000,
|
|
123
|
-
* volume: 0.5,
|
|
124
|
-
* quality: "high",
|
|
125
|
-
* selfDeaf: false,
|
|
126
|
-
* selfMute: false,
|
|
127
|
-
* extractorTimeout: 10000,
|
|
128
|
-
* tts: {
|
|
129
|
-
* createPlayer: true,
|
|
130
|
-
* interrupt: true,
|
|
131
|
-
* volume: 1.0,
|
|
132
|
-
* Max_Time_TTS: 30000
|
|
133
|
-
* }
|
|
134
|
-
* };
|
|
135
|
-
*/
|
|
136
|
-
export interface PlayerOptions {
|
|
137
|
-
leaveOnEnd?: boolean;
|
|
138
|
-
leaveOnEmpty?: boolean;
|
|
139
|
-
leaveTimeout?: number;
|
|
140
|
-
volume?: number;
|
|
141
|
-
quality?: "high" | "low";
|
|
142
|
-
selfDeaf?: boolean;
|
|
143
|
-
selfMute?: boolean;
|
|
144
|
-
/**
|
|
145
|
-
* Timeout in milliseconds for plugin operations (search, streaming, etc.)
|
|
146
|
-
* to prevent long-running tasks from blocking the player.
|
|
147
|
-
*/
|
|
148
|
-
extractorTimeout?: number;
|
|
149
|
-
userdata?: Record<string, any>;
|
|
150
|
-
/**
|
|
151
|
-
* Text-to-Speech settings. When enabled, the player can create a
|
|
152
|
-
* dedicated AudioPlayer to play TTS while pausing the music player
|
|
153
|
-
* then resume the music after TTS finishes.
|
|
154
|
-
*/
|
|
155
|
-
tts?: {
|
|
156
|
-
/** Create a dedicated tts AudioPlayer at construction time */
|
|
157
|
-
createPlayer?: boolean;
|
|
158
|
-
/** Pause music and swap subscription to play TTS */
|
|
159
|
-
interrupt?: boolean;
|
|
160
|
-
/** Default TTS volume multiplier 1 => 100% */
|
|
161
|
-
volume?: number;
|
|
162
|
-
/** Max time tts playback Duration */
|
|
163
|
-
Max_Time_TTS?: number;
|
|
164
|
-
};
|
|
165
|
-
/**
|
|
166
|
-
* Optional per-player extension selection. When provided, only these
|
|
167
|
-
* extensions will be activated for the created player.
|
|
168
|
-
* - Provide instances or constructors to use them explicitly
|
|
169
|
-
* - Or provide names (string) to select from manager-registered extensions
|
|
170
|
-
*/
|
|
171
|
-
extensions?: any[] | string[];
|
|
172
|
-
/**
|
|
173
|
-
* Audio filters configuration. When provided, these filters will be
|
|
174
|
-
* applied to all audio streams played by this player.
|
|
175
|
-
* - Provide filter names (string) to use predefined filters
|
|
176
|
-
* - Or provide AudioFilter objects for custom filters
|
|
177
|
-
* - Multiple filters can be combined
|
|
178
|
-
*/
|
|
179
|
-
filters?: (string | AudioFilter)[];
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export interface PlayerManagerOptions {
|
|
183
|
-
plugins?: SourcePluginLike[];
|
|
184
|
-
extensions?: any[];
|
|
185
|
-
/**
|
|
186
|
-
* Timeout in milliseconds for manager-level operations (e.g. search)
|
|
187
|
-
* when running without a Player instance.
|
|
188
|
-
*/
|
|
189
|
-
extractorTimeout?: number;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Options for the progress bar
|
|
194
|
-
*
|
|
195
|
-
* @example
|
|
196
|
-
* const options: ProgressBarOptions = {
|
|
197
|
-
* size: 10,
|
|
198
|
-
* barChar: "=",
|
|
199
|
-
* progressChar: ">"
|
|
200
|
-
* };
|
|
201
|
-
*/
|
|
202
|
-
export interface ProgressBarOptions {
|
|
203
|
-
size?: number;
|
|
204
|
-
barChar?: string;
|
|
205
|
-
progressChar?: string;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Options for saving tracks
|
|
210
|
-
*
|
|
211
|
-
* @example
|
|
212
|
-
* const options: SaveOptions = {
|
|
213
|
-
* filename: "my-song.mp3",
|
|
214
|
-
* quality: "high",
|
|
215
|
-
* timeout: 30000
|
|
216
|
-
* };
|
|
217
|
-
*/
|
|
218
|
-
export interface SaveOptions {
|
|
219
|
-
/** Optional filename for the saved file */
|
|
220
|
-
filename?: string;
|
|
221
|
-
/** Quality of the saved audio ("high" | "low") */
|
|
222
|
-
quality?: "high" | "low";
|
|
223
|
-
/** Timeout in milliseconds for the save operation */
|
|
224
|
-
timeout?: number;
|
|
225
|
-
/** Additional metadata to include */
|
|
226
|
-
metadata?: Record<string, any>;
|
|
227
|
-
/** Filter */
|
|
228
|
-
filter?: AudioFilter[];
|
|
229
|
-
/** Seek position in milliseconds to start saving from */
|
|
230
|
-
seek?: number;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
export type LoopMode = "off" | "track" | "queue";
|
|
234
|
-
|
|
235
|
-
export interface VoiceChannel {
|
|
236
|
-
id: string;
|
|
237
|
-
guildId: string;
|
|
238
|
-
type: any;
|
|
239
|
-
guild: any;
|
|
240
|
-
// Placeholder for VoiceConnection properties and methods
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Event types emitted by Player instances.
|
|
245
|
-
*
|
|
246
|
-
* @example
|
|
247
|
-
*
|
|
248
|
-
* manager.on("willPlay", (player, track) => {
|
|
249
|
-
* console.log(`Up next: ${track.title}`);
|
|
250
|
-
* });
|
|
251
|
-
*
|
|
252
|
-
* manager.on("trackEnd", (player, track) => {
|
|
253
|
-
* console.log(`Now playing: ${track.title}`);
|
|
254
|
-
* });
|
|
255
|
-
*
|
|
256
|
-
* manager.on("queueAdd", (player, track) => {
|
|
257
|
-
* console.log(`Queue added: ${track.title}`);
|
|
258
|
-
* });
|
|
259
|
-
*
|
|
260
|
-
* manager.on("queueAddList", (player, tracks) => {
|
|
261
|
-
* console.log(`Queue added: ${tracks.length} tracks`);
|
|
262
|
-
* });
|
|
263
|
-
*
|
|
264
|
-
* manager.on("queueRemove", (player, track, index) => {
|
|
265
|
-
* console.log(`Queue removed: ${track.title} at index ${index}`);
|
|
266
|
-
* });
|
|
267
|
-
*
|
|
268
|
-
* manager.on("playerPause", (player, track) => {
|
|
269
|
-
* console.log(`Player paused: ${track.title}`);
|
|
270
|
-
* });
|
|
271
|
-
*
|
|
272
|
-
* manager.on("playerResume", (player, track) => {
|
|
273
|
-
* console.log(`Player resumed: ${track.title}`);
|
|
274
|
-
* });
|
|
275
|
-
*
|
|
276
|
-
* manager.on("playerStop", (player) => {
|
|
277
|
-
* console.log("Player stopped");
|
|
278
|
-
* });
|
|
279
|
-
*
|
|
280
|
-
* manager.on("playerDestroy", (player) => {
|
|
281
|
-
* console.log("Player destroyed");
|
|
282
|
-
* });
|
|
283
|
-
*
|
|
284
|
-
* manager.on("ttsStart", (player, payload) => {
|
|
285
|
-
* console.log(`TTS started: ${payload.text}`);
|
|
286
|
-
* });
|
|
287
|
-
*
|
|
288
|
-
* manager.on("ttsEnd", (player) => {
|
|
289
|
-
* console.log("TTS ended");
|
|
290
|
-
* });
|
|
291
|
-
*
|
|
292
|
-
* manager.on("playerError", (player, error, track) => {
|
|
293
|
-
* console.log(`Player error: ${error.message}`);
|
|
294
|
-
* });
|
|
295
|
-
*
|
|
296
|
-
* manager.on("connectionError", (player, error) => {
|
|
297
|
-
* console.log(`Connection error: ${error.message}`);
|
|
298
|
-
* });
|
|
299
|
-
* manager.on("trackStart", (player, track) => {
|
|
300
|
-
* console.log(`Track started: ${track.title}`);
|
|
301
|
-
* });
|
|
302
|
-
*
|
|
303
|
-
* manager.on("volumeChange", (player, oldVolume, newVolume) => {
|
|
304
|
-
* console.log(`Volume changed: ${oldVolume} -> ${newVolume}`);
|
|
305
|
-
* });
|
|
306
|
-
*
|
|
307
|
-
* manager.on("queueEnd", (player) => {
|
|
308
|
-
* console.log("Queue finished");
|
|
309
|
-
* });
|
|
310
|
-
*
|
|
311
|
-
*/
|
|
312
|
-
export interface ManagerEvents {
|
|
313
|
-
debug: [message: string, ...args: any[]];
|
|
314
|
-
willPlay: [player: Player, track: Track, upcomingTracks: Track[]];
|
|
315
|
-
trackStart: [player: Player, track: Track];
|
|
316
|
-
trackEnd: [player: Player, track: Track];
|
|
317
|
-
queueEnd: [player: Player];
|
|
318
|
-
playerError: [player: Player, error: Error, track?: Track];
|
|
319
|
-
connectionError: [player: Player, error: Error];
|
|
320
|
-
volumeChange: [player: Player, oldVolume: number, newVolume: number];
|
|
321
|
-
queueAdd: [player: Player, track: Track];
|
|
322
|
-
queueAddList: [player: Player, tracks: Track[]];
|
|
323
|
-
queueRemove: [player: Player, track: Track, index: number];
|
|
324
|
-
playerPause: [player: Player, track: Track];
|
|
325
|
-
playerResume: [player: Player, track: Track];
|
|
326
|
-
playerStop: [player: Player];
|
|
327
|
-
playerDestroy: [player: Player];
|
|
328
|
-
ttsStart: [player: Player, payload: { text?: string; track?: Track }];
|
|
329
|
-
ttsEnd: [player: Player];
|
|
330
|
-
/** Emitted when audio filter is applied */
|
|
331
|
-
filterApplied: [player: Player, filter: AudioFilter];
|
|
332
|
-
/** Emitted when audio filter is removed */
|
|
333
|
-
filterRemoved: [player: Player, filter: AudioFilter];
|
|
334
|
-
/** Emitted when all filters are cleared */
|
|
335
|
-
filtersCleared: [player: Player];
|
|
336
|
-
//extension events
|
|
337
|
-
lyricsCreate: [player: Player, track: Track, lyrics: any];
|
|
338
|
-
lyricsChange: [player: Player, track: Track, lyrics: any];
|
|
339
|
-
voiceCreate: [player: Player, evt: any];
|
|
340
|
-
}
|
|
341
|
-
export interface PlayerEvents {
|
|
342
|
-
debug: [message: string, ...args: any[]];
|
|
343
|
-
willPlay: [track: Track, upcomingTracks: Track[]];
|
|
344
|
-
trackStart: [track: Track];
|
|
345
|
-
trackEnd: [track: Track];
|
|
346
|
-
queueEnd: [];
|
|
347
|
-
playerError: [error: Error, track?: Track];
|
|
348
|
-
connectionError: [error: Error];
|
|
349
|
-
volumeChange: [oldVolume: number, newVolume: number];
|
|
350
|
-
queueAdd: [track: Track];
|
|
351
|
-
queueAddList: [tracks: Track[]];
|
|
352
|
-
queueRemove: [track: Track, index: number];
|
|
353
|
-
playerPause: [track: Track];
|
|
354
|
-
playerResume: [track: Track];
|
|
355
|
-
playerStop: [];
|
|
356
|
-
playerDestroy: [];
|
|
357
|
-
/** Emitted when seeking to a position in current track */
|
|
358
|
-
seek: [payload: { track: Track; position: number }];
|
|
359
|
-
/** Emitted when TTS starts playing (interruption mode) */
|
|
360
|
-
ttsStart: [payload: { text?: string; track?: Track }];
|
|
361
|
-
/** Emitted when TTS finished (interruption mode) */
|
|
362
|
-
ttsEnd: [];
|
|
363
|
-
/** Emitted when audio filter is applied */
|
|
364
|
-
filterApplied: [filter: AudioFilter];
|
|
365
|
-
/** Emitted when audio filter is removed */
|
|
366
|
-
filterRemoved: [filter: AudioFilter];
|
|
367
|
-
/** Emitted when all filters are cleared */
|
|
368
|
-
filtersCleared: [];
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
export * from "./fillter";
|
|
372
|
-
export * from "./plugin";
|
|
373
|
-
export * from "./extension";
|
|
1
|
+
import { Readable } from "stream";
|
|
2
|
+
import { Player } from "../structures/Player";
|
|
3
|
+
import type { PlayerManager } from "../structures/PlayerManager";
|
|
4
|
+
import type { AudioFilter } from "./fillter";
|
|
5
|
+
import type { SourcePluginLike } from "./plugin";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Represents a music track with metadata and streaming information.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // Basic track from YouTube
|
|
12
|
+
* const track: Track = {
|
|
13
|
+
* id: "dQw4w9WgXcQ",
|
|
14
|
+
* title: "Never Gonna Give You Up",
|
|
15
|
+
* url: "https://youtube.com/watch?v=dQw4w9WgXcQ",
|
|
16
|
+
* duration: 212000,
|
|
17
|
+
* thumbnail: "https://img.youtube.com/vi/dQw4w9WgXcQ/maxresdefault.jpg",
|
|
18
|
+
* requestedBy: "123456789",
|
|
19
|
+
* source: "youtube",
|
|
20
|
+
* metadata: {
|
|
21
|
+
* artist: "Rick Astley",
|
|
22
|
+
* album: "Whenever You Need Somebody"
|
|
23
|
+
* }
|
|
24
|
+
* };
|
|
25
|
+
*
|
|
26
|
+
* // Track from SoundCloud
|
|
27
|
+
* const soundcloudTrack: Track = {
|
|
28
|
+
* id: "soundcloud-track-123",
|
|
29
|
+
* title: "Electronic Song",
|
|
30
|
+
* url: "https://soundcloud.com/artist/electronic-song",
|
|
31
|
+
* duration: 180000,
|
|
32
|
+
* requestedBy: "user456",
|
|
33
|
+
* source: "soundcloud",
|
|
34
|
+
* metadata: {
|
|
35
|
+
* artist: "Electronic Artist",
|
|
36
|
+
* genre: "Electronic"
|
|
37
|
+
* }
|
|
38
|
+
* };
|
|
39
|
+
*
|
|
40
|
+
* // TTS track
|
|
41
|
+
* const ttsTrack: Track = {
|
|
42
|
+
* id: "tts-" + Date.now(),
|
|
43
|
+
* title: "TTS: Hello everyone!",
|
|
44
|
+
* url: "tts: Hello everyone!",
|
|
45
|
+
* duration: 5000,
|
|
46
|
+
* requestedBy: "user789",
|
|
47
|
+
* source: "tts",
|
|
48
|
+
* metadata: {
|
|
49
|
+
* text: "Hello everyone!",
|
|
50
|
+
* language: "en"
|
|
51
|
+
* }
|
|
52
|
+
* };
|
|
53
|
+
*/
|
|
54
|
+
export interface Track {
|
|
55
|
+
id: string;
|
|
56
|
+
title: string;
|
|
57
|
+
url: string;
|
|
58
|
+
duration: number;
|
|
59
|
+
thumbnail?: string;
|
|
60
|
+
requestedBy: string;
|
|
61
|
+
source: string;
|
|
62
|
+
metadata?: Record<string, any>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Contains search results from plugins, including tracks and optional playlist information.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* const result: SearchResult = {
|
|
70
|
+
* tracks: [
|
|
71
|
+
* {
|
|
72
|
+
* id: "track1",
|
|
73
|
+
* title: "Song 1",
|
|
74
|
+
* url: "https://example.com/track1",
|
|
75
|
+
* duration: 180000,
|
|
76
|
+
* requestedBy: "user123",
|
|
77
|
+
* source: "youtube"
|
|
78
|
+
* }
|
|
79
|
+
* ],
|
|
80
|
+
* playlist: {
|
|
81
|
+
* name: "My Playlist",
|
|
82
|
+
* url: "https://example.com/playlist",
|
|
83
|
+
* thumbnail: "https://example.com/thumb.jpg"
|
|
84
|
+
* }
|
|
85
|
+
* };
|
|
86
|
+
*/
|
|
87
|
+
export interface SearchResult {
|
|
88
|
+
tracks: Track[];
|
|
89
|
+
playlist?: {
|
|
90
|
+
name: string;
|
|
91
|
+
url: string;
|
|
92
|
+
thumbnail?: string;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Contains streaming information for audio playback.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* const streamInfo: StreamInfo = {
|
|
101
|
+
* stream: audioStream,
|
|
102
|
+
* type: "webm/opus",
|
|
103
|
+
* metadata: {
|
|
104
|
+
* bitrate: 128000,
|
|
105
|
+
* sampleRate: 48000
|
|
106
|
+
* }
|
|
107
|
+
* };
|
|
108
|
+
*/
|
|
109
|
+
export interface StreamInfo {
|
|
110
|
+
stream: Readable;
|
|
111
|
+
type: "webm/opus" | "ogg/opus" | "arbitrary";
|
|
112
|
+
metadata?: Record<string, any>;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Configuration options for creating a new player instance.
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* const options: PlayerOptions = {
|
|
120
|
+
* leaveOnEnd: true,
|
|
121
|
+
* leaveOnEmpty: true,
|
|
122
|
+
* leaveTimeout: 30000,
|
|
123
|
+
* volume: 0.5,
|
|
124
|
+
* quality: "high",
|
|
125
|
+
* selfDeaf: false,
|
|
126
|
+
* selfMute: false,
|
|
127
|
+
* extractorTimeout: 10000,
|
|
128
|
+
* tts: {
|
|
129
|
+
* createPlayer: true,
|
|
130
|
+
* interrupt: true,
|
|
131
|
+
* volume: 1.0,
|
|
132
|
+
* Max_Time_TTS: 30000
|
|
133
|
+
* }
|
|
134
|
+
* };
|
|
135
|
+
*/
|
|
136
|
+
export interface PlayerOptions {
|
|
137
|
+
leaveOnEnd?: boolean;
|
|
138
|
+
leaveOnEmpty?: boolean;
|
|
139
|
+
leaveTimeout?: number;
|
|
140
|
+
volume?: number;
|
|
141
|
+
quality?: "high" | "low";
|
|
142
|
+
selfDeaf?: boolean;
|
|
143
|
+
selfMute?: boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Timeout in milliseconds for plugin operations (search, streaming, etc.)
|
|
146
|
+
* to prevent long-running tasks from blocking the player.
|
|
147
|
+
*/
|
|
148
|
+
extractorTimeout?: number;
|
|
149
|
+
userdata?: Record<string, any>;
|
|
150
|
+
/**
|
|
151
|
+
* Text-to-Speech settings. When enabled, the player can create a
|
|
152
|
+
* dedicated AudioPlayer to play TTS while pausing the music player
|
|
153
|
+
* then resume the music after TTS finishes.
|
|
154
|
+
*/
|
|
155
|
+
tts?: {
|
|
156
|
+
/** Create a dedicated tts AudioPlayer at construction time */
|
|
157
|
+
createPlayer?: boolean;
|
|
158
|
+
/** Pause music and swap subscription to play TTS */
|
|
159
|
+
interrupt?: boolean;
|
|
160
|
+
/** Default TTS volume multiplier 1 => 100% */
|
|
161
|
+
volume?: number;
|
|
162
|
+
/** Max time tts playback Duration */
|
|
163
|
+
Max_Time_TTS?: number;
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Optional per-player extension selection. When provided, only these
|
|
167
|
+
* extensions will be activated for the created player.
|
|
168
|
+
* - Provide instances or constructors to use them explicitly
|
|
169
|
+
* - Or provide names (string) to select from manager-registered extensions
|
|
170
|
+
*/
|
|
171
|
+
extensions?: any[] | string[];
|
|
172
|
+
/**
|
|
173
|
+
* Audio filters configuration. When provided, these filters will be
|
|
174
|
+
* applied to all audio streams played by this player.
|
|
175
|
+
* - Provide filter names (string) to use predefined filters
|
|
176
|
+
* - Or provide AudioFilter objects for custom filters
|
|
177
|
+
* - Multiple filters can be combined
|
|
178
|
+
*/
|
|
179
|
+
filters?: (string | AudioFilter)[];
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export interface PlayerManagerOptions {
|
|
183
|
+
plugins?: SourcePluginLike[];
|
|
184
|
+
extensions?: any[];
|
|
185
|
+
/**
|
|
186
|
+
* Timeout in milliseconds for manager-level operations (e.g. search)
|
|
187
|
+
* when running without a Player instance.
|
|
188
|
+
*/
|
|
189
|
+
extractorTimeout?: number;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Options for the progress bar
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* const options: ProgressBarOptions = {
|
|
197
|
+
* size: 10,
|
|
198
|
+
* barChar: "=",
|
|
199
|
+
* progressChar: ">"
|
|
200
|
+
* };
|
|
201
|
+
*/
|
|
202
|
+
export interface ProgressBarOptions {
|
|
203
|
+
size?: number;
|
|
204
|
+
barChar?: string;
|
|
205
|
+
progressChar?: string;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Options for saving tracks
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* const options: SaveOptions = {
|
|
213
|
+
* filename: "my-song.mp3",
|
|
214
|
+
* quality: "high",
|
|
215
|
+
* timeout: 30000
|
|
216
|
+
* };
|
|
217
|
+
*/
|
|
218
|
+
export interface SaveOptions {
|
|
219
|
+
/** Optional filename for the saved file */
|
|
220
|
+
filename?: string;
|
|
221
|
+
/** Quality of the saved audio ("high" | "low") */
|
|
222
|
+
quality?: "high" | "low";
|
|
223
|
+
/** Timeout in milliseconds for the save operation */
|
|
224
|
+
timeout?: number;
|
|
225
|
+
/** Additional metadata to include */
|
|
226
|
+
metadata?: Record<string, any>;
|
|
227
|
+
/** Filter */
|
|
228
|
+
filter?: AudioFilter[];
|
|
229
|
+
/** Seek position in milliseconds to start saving from */
|
|
230
|
+
seek?: number;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export type LoopMode = "off" | "track" | "queue";
|
|
234
|
+
|
|
235
|
+
export interface VoiceChannel {
|
|
236
|
+
id: string;
|
|
237
|
+
guildId: string;
|
|
238
|
+
type: any;
|
|
239
|
+
guild: any;
|
|
240
|
+
// Placeholder for VoiceConnection properties and methods
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Event types emitted by Player instances.
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
*
|
|
248
|
+
* manager.on("willPlay", (player, track) => {
|
|
249
|
+
* console.log(`Up next: ${track.title}`);
|
|
250
|
+
* });
|
|
251
|
+
*
|
|
252
|
+
* manager.on("trackEnd", (player, track) => {
|
|
253
|
+
* console.log(`Now playing: ${track.title}`);
|
|
254
|
+
* });
|
|
255
|
+
*
|
|
256
|
+
* manager.on("queueAdd", (player, track) => {
|
|
257
|
+
* console.log(`Queue added: ${track.title}`);
|
|
258
|
+
* });
|
|
259
|
+
*
|
|
260
|
+
* manager.on("queueAddList", (player, tracks) => {
|
|
261
|
+
* console.log(`Queue added: ${tracks.length} tracks`);
|
|
262
|
+
* });
|
|
263
|
+
*
|
|
264
|
+
* manager.on("queueRemove", (player, track, index) => {
|
|
265
|
+
* console.log(`Queue removed: ${track.title} at index ${index}`);
|
|
266
|
+
* });
|
|
267
|
+
*
|
|
268
|
+
* manager.on("playerPause", (player, track) => {
|
|
269
|
+
* console.log(`Player paused: ${track.title}`);
|
|
270
|
+
* });
|
|
271
|
+
*
|
|
272
|
+
* manager.on("playerResume", (player, track) => {
|
|
273
|
+
* console.log(`Player resumed: ${track.title}`);
|
|
274
|
+
* });
|
|
275
|
+
*
|
|
276
|
+
* manager.on("playerStop", (player) => {
|
|
277
|
+
* console.log("Player stopped");
|
|
278
|
+
* });
|
|
279
|
+
*
|
|
280
|
+
* manager.on("playerDestroy", (player) => {
|
|
281
|
+
* console.log("Player destroyed");
|
|
282
|
+
* });
|
|
283
|
+
*
|
|
284
|
+
* manager.on("ttsStart", (player, payload) => {
|
|
285
|
+
* console.log(`TTS started: ${payload.text}`);
|
|
286
|
+
* });
|
|
287
|
+
*
|
|
288
|
+
* manager.on("ttsEnd", (player) => {
|
|
289
|
+
* console.log("TTS ended");
|
|
290
|
+
* });
|
|
291
|
+
*
|
|
292
|
+
* manager.on("playerError", (player, error, track) => {
|
|
293
|
+
* console.log(`Player error: ${error.message}`);
|
|
294
|
+
* });
|
|
295
|
+
*
|
|
296
|
+
* manager.on("connectionError", (player, error) => {
|
|
297
|
+
* console.log(`Connection error: ${error.message}`);
|
|
298
|
+
* });
|
|
299
|
+
* manager.on("trackStart", (player, track) => {
|
|
300
|
+
* console.log(`Track started: ${track.title}`);
|
|
301
|
+
* });
|
|
302
|
+
*
|
|
303
|
+
* manager.on("volumeChange", (player, oldVolume, newVolume) => {
|
|
304
|
+
* console.log(`Volume changed: ${oldVolume} -> ${newVolume}`);
|
|
305
|
+
* });
|
|
306
|
+
*
|
|
307
|
+
* manager.on("queueEnd", (player) => {
|
|
308
|
+
* console.log("Queue finished");
|
|
309
|
+
* });
|
|
310
|
+
*
|
|
311
|
+
*/
|
|
312
|
+
export interface ManagerEvents {
|
|
313
|
+
debug: [message: string, ...args: any[]];
|
|
314
|
+
willPlay: [player: Player, track: Track, upcomingTracks: Track[]];
|
|
315
|
+
trackStart: [player: Player, track: Track];
|
|
316
|
+
trackEnd: [player: Player, track: Track];
|
|
317
|
+
queueEnd: [player: Player];
|
|
318
|
+
playerError: [player: Player, error: Error, track?: Track];
|
|
319
|
+
connectionError: [player: Player, error: Error];
|
|
320
|
+
volumeChange: [player: Player, oldVolume: number, newVolume: number];
|
|
321
|
+
queueAdd: [player: Player, track: Track];
|
|
322
|
+
queueAddList: [player: Player, tracks: Track[]];
|
|
323
|
+
queueRemove: [player: Player, track: Track, index: number];
|
|
324
|
+
playerPause: [player: Player, track: Track];
|
|
325
|
+
playerResume: [player: Player, track: Track];
|
|
326
|
+
playerStop: [player: Player];
|
|
327
|
+
playerDestroy: [player: Player];
|
|
328
|
+
ttsStart: [player: Player, payload: { text?: string; track?: Track }];
|
|
329
|
+
ttsEnd: [player: Player];
|
|
330
|
+
/** Emitted when audio filter is applied */
|
|
331
|
+
filterApplied: [player: Player, filter: AudioFilter];
|
|
332
|
+
/** Emitted when audio filter is removed */
|
|
333
|
+
filterRemoved: [player: Player, filter: AudioFilter];
|
|
334
|
+
/** Emitted when all filters are cleared */
|
|
335
|
+
filtersCleared: [player: Player];
|
|
336
|
+
//extension events
|
|
337
|
+
lyricsCreate: [player: Player, track: Track, lyrics: any];
|
|
338
|
+
lyricsChange: [player: Player, track: Track, lyrics: any];
|
|
339
|
+
voiceCreate: [player: Player, evt: any];
|
|
340
|
+
}
|
|
341
|
+
export interface PlayerEvents {
|
|
342
|
+
debug: [message: string, ...args: any[]];
|
|
343
|
+
willPlay: [track: Track, upcomingTracks: Track[]];
|
|
344
|
+
trackStart: [track: Track];
|
|
345
|
+
trackEnd: [track: Track];
|
|
346
|
+
queueEnd: [];
|
|
347
|
+
playerError: [error: Error, track?: Track];
|
|
348
|
+
connectionError: [error: Error];
|
|
349
|
+
volumeChange: [oldVolume: number, newVolume: number];
|
|
350
|
+
queueAdd: [track: Track];
|
|
351
|
+
queueAddList: [tracks: Track[]];
|
|
352
|
+
queueRemove: [track: Track, index: number];
|
|
353
|
+
playerPause: [track: Track];
|
|
354
|
+
playerResume: [track: Track];
|
|
355
|
+
playerStop: [];
|
|
356
|
+
playerDestroy: [];
|
|
357
|
+
/** Emitted when seeking to a position in current track */
|
|
358
|
+
seek: [payload: { track: Track; position: number }];
|
|
359
|
+
/** Emitted when TTS starts playing (interruption mode) */
|
|
360
|
+
ttsStart: [payload: { text?: string; track?: Track }];
|
|
361
|
+
/** Emitted when TTS finished (interruption mode) */
|
|
362
|
+
ttsEnd: [];
|
|
363
|
+
/** Emitted when audio filter is applied */
|
|
364
|
+
filterApplied: [filter: AudioFilter];
|
|
365
|
+
/** Emitted when audio filter is removed */
|
|
366
|
+
filterRemoved: [filter: AudioFilter];
|
|
367
|
+
/** Emitted when all filters are cleared */
|
|
368
|
+
filtersCleared: [];
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
export * from "./fillter";
|
|
372
|
+
export * from "./plugin";
|
|
373
|
+
export * from "./extension";
|