ziplayer 0.1.3 → 0.1.5
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 +212 -212
- package/dist/plugins/SoundCloudPlugin.d.ts +22 -0
- package/dist/plugins/SoundCloudPlugin.d.ts.map +1 -0
- package/dist/plugins/SoundCloudPlugin.js +171 -0
- package/dist/plugins/SoundCloudPlugin.js.map +1 -0
- package/dist/plugins/SpotifyPlugin.d.ts +26 -0
- package/dist/plugins/SpotifyPlugin.d.ts.map +1 -0
- package/dist/plugins/SpotifyPlugin.js +183 -0
- package/dist/plugins/SpotifyPlugin.js.map +1 -0
- package/dist/plugins/YouTubePlugin.d.ts +25 -0
- package/dist/plugins/YouTubePlugin.d.ts.map +1 -0
- package/dist/plugins/YouTubePlugin.js +314 -0
- package/dist/plugins/YouTubePlugin.js.map +1 -0
- package/dist/structures/Player.d.ts +61 -70
- package/dist/structures/Player.d.ts.map +1 -1
- package/dist/structures/Player.js +332 -355
- package/dist/structures/Player.js.map +1 -1
- package/dist/structures/PlayerManager.d.ts +5 -1
- package/dist/structures/PlayerManager.d.ts.map +1 -1
- package/dist/structures/PlayerManager.js.map +1 -1
- package/dist/types/index.d.ts +58 -16
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +45 -45
- package/src/extensions/BaseExtension.ts +35 -35
- package/src/extensions/index.ts +32 -32
- package/src/index.ts +16 -16
- package/src/plugins/BasePlugin.ts +26 -26
- package/src/plugins/index.ts +32 -32
- package/src/structures/Player.ts +1693 -1747
- package/src/structures/PlayerManager.ts +416 -411
- package/src/structures/Queue.ts +354 -354
- package/src/types/index.ts +510 -470
- package/src/utils/timeout.ts +10 -10
- package/tsconfig.json +23 -23
|
@@ -1,8 +1,9 @@
|
|
|
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 { Readable } from "stream";
|
|
4
5
|
import { BaseExtension } from "../extensions";
|
|
5
|
-
import { Track, PlayerOptions, PlayerEvents, SourcePlugin, SearchResult, ProgressBarOptions, LoopMode } from "../types";
|
|
6
|
+
import { Track, PlayerOptions, PlayerEvents, SourcePlugin, SearchResult, ProgressBarOptions, LoopMode, SaveOptions } from "../types";
|
|
6
7
|
import { Queue } from "./Queue";
|
|
7
8
|
import { PluginManager } from "../plugins";
|
|
8
9
|
import type { PlayerManager } from "./PlayerManager";
|
|
@@ -64,12 +65,10 @@ export declare class Player extends EventEmitter {
|
|
|
64
65
|
private skipLoop;
|
|
65
66
|
private extensions;
|
|
66
67
|
private extensionContext;
|
|
67
|
-
private pluginCache;
|
|
68
|
-
private readonly PLUGIN_CACHE_TTL;
|
|
69
|
-
private pluginCacheTimestamps;
|
|
70
68
|
private searchCache;
|
|
71
69
|
private readonly SEARCH_CACHE_TTL;
|
|
72
70
|
private searchCacheTimestamps;
|
|
71
|
+
private ttsPlayer;
|
|
73
72
|
/**
|
|
74
73
|
* Attach an extension to the player
|
|
75
74
|
*
|
|
@@ -100,13 +99,12 @@ export declare class Player extends EventEmitter {
|
|
|
100
99
|
private runAfterPlayHooks;
|
|
101
100
|
private extensionsProvideSearch;
|
|
102
101
|
private extensionsProvideStream;
|
|
102
|
+
private getStreamFromPlugin;
|
|
103
|
+
private Audioresource;
|
|
103
104
|
/**
|
|
104
105
|
* Start playing a specific track immediately, replacing the current resource.
|
|
105
106
|
*/
|
|
106
107
|
private startTrack;
|
|
107
|
-
private ttsPlayer;
|
|
108
|
-
private ttsQueue;
|
|
109
|
-
private ttsActive;
|
|
110
108
|
private clearLeaveTimeout;
|
|
111
109
|
private debug;
|
|
112
110
|
constructor(guildId: string, options: PlayerOptions | undefined, manager: PlayerManager);
|
|
@@ -135,17 +133,20 @@ export declare class Player extends EventEmitter {
|
|
|
135
133
|
*/
|
|
136
134
|
search(query: string, requestedBy: string): Promise<SearchResult>;
|
|
137
135
|
/**
|
|
138
|
-
* Play a track
|
|
136
|
+
* Play a track, search query, search result, or play from queue
|
|
139
137
|
*
|
|
140
|
-
* @param {string | Track} query - Track URL, search query, or
|
|
138
|
+
* @param {string | Track | SearchResult | null} query - Track URL, search query, Track object, SearchResult, or null for play
|
|
141
139
|
* @param {string} requestedBy - User ID who requested the track
|
|
142
140
|
* @returns {Promise<boolean>} True if playback started successfully
|
|
143
141
|
* @example
|
|
144
|
-
* await player.play("Never Gonna Give You Up", userId);
|
|
145
|
-
* await player.play("https://youtube.com/watch?v=dQw4w9WgXcQ", userId);
|
|
146
|
-
* await player.play("tts: Hello everyone!", userId);
|
|
142
|
+
* await player.play("Never Gonna Give You Up", userId); // Search query
|
|
143
|
+
* await player.play("https://youtube.com/watch?v=dQw4w9WgXcQ", userId); // Direct URL
|
|
144
|
+
* await player.play("tts: Hello everyone!", userId); // Text-to-Speech
|
|
145
|
+
* await player.play(trackObject, userId); // Track object
|
|
146
|
+
* await player.play(searchResult, userId); // SearchResult object
|
|
147
|
+
* await player.play(null); // play from queue
|
|
147
148
|
*/
|
|
148
|
-
play(query: string | Track, requestedBy?: string): Promise<boolean>;
|
|
149
|
+
play(query: string | Track | SearchResult | null, requestedBy?: string): Promise<boolean>;
|
|
149
150
|
/**
|
|
150
151
|
* Interrupt current music with a TTS track. Pauses music, swaps the
|
|
151
152
|
* subscription to a dedicated TTS player, plays TTS, then resumes.
|
|
@@ -156,42 +157,6 @@ export declare class Player extends EventEmitter {
|
|
|
156
157
|
* await player.interruptWithTTSTrack(track);
|
|
157
158
|
*/
|
|
158
159
|
interruptWithTTSTrack(track: Track): Promise<void>;
|
|
159
|
-
/**
|
|
160
|
-
* Play queued TTS items sequentially
|
|
161
|
-
*
|
|
162
|
-
* @returns {Promise<void>}
|
|
163
|
-
* @example
|
|
164
|
-
* await player.playNextTTS();
|
|
165
|
-
*/
|
|
166
|
-
private playNextTTS;
|
|
167
|
-
/**
|
|
168
|
-
* Get cached plugin or find and cache a new one
|
|
169
|
-
* @param track The track to find plugin for
|
|
170
|
-
* @returns The matching plugin or null if not found
|
|
171
|
-
*/
|
|
172
|
-
private getCachedPlugin;
|
|
173
|
-
/**
|
|
174
|
-
* Clear expired cache entries
|
|
175
|
-
*/
|
|
176
|
-
private clearExpiredCache;
|
|
177
|
-
/**
|
|
178
|
-
* Clear all plugin cache entries
|
|
179
|
-
* @example
|
|
180
|
-
* player.clearPluginCache();
|
|
181
|
-
*/
|
|
182
|
-
clearPluginCache(): void;
|
|
183
|
-
/**
|
|
184
|
-
* Get plugin cache statistics
|
|
185
|
-
* @returns Cache statistics
|
|
186
|
-
* @example
|
|
187
|
-
* const stats = player.getPluginCacheStats();
|
|
188
|
-
* console.log(`Cache size: ${stats.size}, Hit rate: ${stats.hitRate}%`);
|
|
189
|
-
*/
|
|
190
|
-
getPluginCacheStats(): {
|
|
191
|
-
size: number;
|
|
192
|
-
hitRate: number;
|
|
193
|
-
expiredEntries: number;
|
|
194
|
-
};
|
|
195
160
|
/**
|
|
196
161
|
* Get cached search result or null if not found/expired
|
|
197
162
|
* @param query The search query
|
|
@@ -214,18 +179,6 @@ export declare class Player extends EventEmitter {
|
|
|
214
179
|
* player.clearSearchCache();
|
|
215
180
|
*/
|
|
216
181
|
clearSearchCache(): void;
|
|
217
|
-
/**
|
|
218
|
-
* Get search cache statistics
|
|
219
|
-
* @returns Search cache statistics
|
|
220
|
-
* @example
|
|
221
|
-
* const stats = player.getSearchCacheStats();
|
|
222
|
-
* console.log(`Search cache size: ${stats.size}, Expired: ${stats.expiredEntries}`);
|
|
223
|
-
*/
|
|
224
|
-
getSearchCacheStats(): {
|
|
225
|
-
size: number;
|
|
226
|
-
expiredEntries: number;
|
|
227
|
-
queries: string[];
|
|
228
|
-
};
|
|
229
182
|
/**
|
|
230
183
|
* Debug method to check for duplicate search calls
|
|
231
184
|
* @param query The search query to check
|
|
@@ -237,8 +190,6 @@ export declare class Player extends EventEmitter {
|
|
|
237
190
|
pluginCount: number;
|
|
238
191
|
ttsFiltered: boolean;
|
|
239
192
|
};
|
|
240
|
-
/** Build AudioResource for a given track using the plugin pipeline */
|
|
241
|
-
private resourceFromTrack;
|
|
242
193
|
private generateWillNext;
|
|
243
194
|
private playNext;
|
|
244
195
|
/**
|
|
@@ -269,14 +220,16 @@ export declare class Player extends EventEmitter {
|
|
|
269
220
|
*/
|
|
270
221
|
stop(): boolean;
|
|
271
222
|
/**
|
|
272
|
-
* Skip to the next track
|
|
223
|
+
* Skip to the next track or skip to a specific index
|
|
273
224
|
*
|
|
225
|
+
* @param {number} index - Optional index to skip to (0 = next track)
|
|
274
226
|
* @returns {boolean} True if skipped successfully
|
|
275
227
|
* @example
|
|
276
|
-
* const skipped = player.skip();
|
|
228
|
+
* const skipped = player.skip(); // Skip to next track
|
|
229
|
+
* const skippedToIndex = player.skip(2); // Skip to track at index 2
|
|
277
230
|
* console.log(`Skipped: ${skipped}`);
|
|
278
231
|
*/
|
|
279
|
-
skip(): boolean;
|
|
232
|
+
skip(index?: number): boolean;
|
|
280
233
|
/**
|
|
281
234
|
* Go back to the previous track in history and play it.
|
|
282
235
|
*
|
|
@@ -287,15 +240,20 @@ export declare class Player extends EventEmitter {
|
|
|
287
240
|
*/
|
|
288
241
|
previous(): Promise<boolean>;
|
|
289
242
|
/**
|
|
290
|
-
* Loop the current track
|
|
243
|
+
* Loop the current track or queue
|
|
291
244
|
*
|
|
292
|
-
* @param {LoopMode} mode - The loop mode to set
|
|
245
|
+
* @param {LoopMode | number} mode - The loop mode to set ("off", "track", "queue") or number (0=off, 1=track, 2=queue)
|
|
293
246
|
* @returns {LoopMode} The loop mode
|
|
294
247
|
* @example
|
|
295
|
-
* const loopMode = player.loop("track");
|
|
248
|
+
* const loopMode = player.loop("track"); // Loop current track
|
|
249
|
+
* const loopQueue = player.loop("queue"); // Loop entire queue
|
|
250
|
+
* const loopTrack = player.loop(1); // Loop current track (same as "track")
|
|
251
|
+
* const loopQueueNum = player.loop(2); // Loop entire queue (same as "queue")
|
|
252
|
+
* const noLoop = player.loop("off"); // No loop
|
|
253
|
+
* const noLoopNum = player.loop(0); // No loop (same as "off")
|
|
296
254
|
* console.log(`Loop mode: ${loopMode}`);
|
|
297
255
|
*/
|
|
298
|
-
loop(mode?: LoopMode): LoopMode;
|
|
256
|
+
loop(mode?: LoopMode | number): LoopMode;
|
|
299
257
|
/**
|
|
300
258
|
* Set the auto-play mode
|
|
301
259
|
*
|
|
@@ -462,5 +420,38 @@ export declare class Player extends EventEmitter {
|
|
|
462
420
|
* console.log(`Related tracks: ${relatedTracks?.length}`);
|
|
463
421
|
*/
|
|
464
422
|
get relatedTracks(): Track[] | null;
|
|
423
|
+
/**
|
|
424
|
+
* Save a track's stream to a file and return a Readable stream
|
|
425
|
+
*
|
|
426
|
+
* @param {Track} track - The track to save
|
|
427
|
+
* @param {SaveOptions | string} options - Save options or filename string (for backward compatibility)
|
|
428
|
+
* @returns {Promise<Readable>} A Readable stream containing the audio data
|
|
429
|
+
* @example
|
|
430
|
+
* // Save current track to file
|
|
431
|
+
* const track = player.currentTrack;
|
|
432
|
+
* if (track) {
|
|
433
|
+
* const stream = await player.save(track);
|
|
434
|
+
*
|
|
435
|
+
* // Use fs to write the stream to file
|
|
436
|
+
* const fs = require('fs');
|
|
437
|
+
* const writeStream = fs.createWriteStream('saved-song.mp3');
|
|
438
|
+
* stream.pipe(writeStream);
|
|
439
|
+
*
|
|
440
|
+
* writeStream.on('finish', () => {
|
|
441
|
+
* console.log('File saved successfully!');
|
|
442
|
+
* });
|
|
443
|
+
* }
|
|
444
|
+
*
|
|
445
|
+
* // Save any track by URL
|
|
446
|
+
* const searchResult = await player.search("Never Gonna Give You Up", userId);
|
|
447
|
+
* if (searchResult.tracks.length > 0) {
|
|
448
|
+
* const stream = await player.save(searchResult.tracks[0]);
|
|
449
|
+
* // Handle the stream...
|
|
450
|
+
* }
|
|
451
|
+
*
|
|
452
|
+
* // Backward compatibility - filename as string
|
|
453
|
+
* const stream = await player.save(track, "my-song.mp3");
|
|
454
|
+
*/
|
|
455
|
+
save(track: Track, options?: SaveOptions | string): Promise<Readable>;
|
|
465
456
|
}
|
|
466
457
|
//# 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;
|
|
1
|
+
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../../src/structures/Player.ts"],"names":[],"mappings":"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"}
|