streamify-audio 2.1.10 → 2.1.12
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/docs/discord/player.md +24 -1
- package/index.d.ts +8 -1
- package/package.json +1 -1
- package/src/discord/Player.js +22 -7
package/docs/discord/player.md
CHANGED
|
@@ -14,7 +14,7 @@ const player = manager.get(guildId);
|
|
|
14
14
|
|
|
15
15
|
## Playback Methods
|
|
16
16
|
|
|
17
|
-
### play(track)
|
|
17
|
+
### play(track, options?)
|
|
18
18
|
|
|
19
19
|
Plays a track immediately. If something is playing, adds to queue and skips.
|
|
20
20
|
|
|
@@ -23,6 +23,29 @@ const result = await manager.search('never gonna give you up');
|
|
|
23
23
|
await player.play(result.tracks[0]);
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
+
**Options:**
|
|
27
|
+
- `startPosition` - Start playback at a specific position in milliseconds
|
|
28
|
+
- `volume` - Set volume before playing (0-200)
|
|
29
|
+
- `filters` - Apply filters before playing
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
// Start playing at 30 seconds
|
|
33
|
+
await player.play(track, { startPosition: 30000 });
|
|
34
|
+
|
|
35
|
+
// Start with specific volume
|
|
36
|
+
await player.play(track, { volume: 50 });
|
|
37
|
+
|
|
38
|
+
// Start with filters applied
|
|
39
|
+
await player.play(track, { filters: { bass: 10, nightcore: true } });
|
|
40
|
+
|
|
41
|
+
// Combine options (useful for session restoration)
|
|
42
|
+
await player.play(track, {
|
|
43
|
+
startPosition: savedPositionMs,
|
|
44
|
+
volume: savedVolume,
|
|
45
|
+
filters: savedFilters
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
26
49
|
### pause()
|
|
27
50
|
|
|
28
51
|
Pauses playback and destroys the stream to save resources.
|
package/index.d.ts
CHANGED
|
@@ -237,6 +237,13 @@ declare module 'streamify-audio' {
|
|
|
237
237
|
on(event: 'playerDestroy', listener: (player: Player) => void): this;
|
|
238
238
|
}
|
|
239
239
|
|
|
240
|
+
export interface PlayOptions {
|
|
241
|
+
startPosition?: number;
|
|
242
|
+
seek?: number;
|
|
243
|
+
volume?: number;
|
|
244
|
+
filters?: Filters;
|
|
245
|
+
}
|
|
246
|
+
|
|
240
247
|
export class Player extends EventEmitter {
|
|
241
248
|
constructor(manager: Manager, options: any);
|
|
242
249
|
|
|
@@ -261,7 +268,7 @@ declare module 'streamify-audio' {
|
|
|
261
268
|
disconnect(): boolean;
|
|
262
269
|
destroy(): void;
|
|
263
270
|
|
|
264
|
-
play(track: Track): Promise<void>;
|
|
271
|
+
play(track: Track, options?: PlayOptions): Promise<void>;
|
|
265
272
|
pause(destroyStream?: boolean): boolean;
|
|
266
273
|
resume(): Promise<boolean>;
|
|
267
274
|
skip(): Promise<Track | null>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "streamify-audio",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.12",
|
|
4
4
|
"description": "Dual-mode audio library: HTTP streaming proxy + Discord player (Lavalink alternative). Supports YouTube, Spotify, SoundCloud with audio filters.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
package/src/discord/Player.js
CHANGED
|
@@ -252,7 +252,7 @@ class Player extends EventEmitter {
|
|
|
252
252
|
});
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
-
async play(track) {
|
|
255
|
+
async play(track, options = {}) {
|
|
256
256
|
if (this._destroyed) {
|
|
257
257
|
throw new Error('Player has been destroyed');
|
|
258
258
|
}
|
|
@@ -261,19 +261,34 @@ class Player extends EventEmitter {
|
|
|
261
261
|
await this.connect();
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
+
const playOptions = {
|
|
265
|
+
startPosition: options.startPosition || options.seek || 0,
|
|
266
|
+
volume: options.volume,
|
|
267
|
+
filters: options.filters
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
if (options.volume !== undefined) {
|
|
271
|
+
this._volume = Math.max(0, Math.min(200, options.volume));
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (options.filters) {
|
|
275
|
+
this._filters = { ...this._filters, ...options.filters };
|
|
276
|
+
}
|
|
277
|
+
|
|
264
278
|
if (this.queue.current) {
|
|
265
279
|
this.queue.add(track, 0);
|
|
266
280
|
return this.skip();
|
|
267
281
|
}
|
|
268
282
|
|
|
269
283
|
this.queue.setCurrent(track);
|
|
270
|
-
return this._playTrack(track);
|
|
284
|
+
return this._playTrack(track, playOptions.startPosition);
|
|
271
285
|
}
|
|
272
286
|
|
|
273
|
-
async _playTrack(track) {
|
|
287
|
+
async _playTrack(track, startPosition = 0) {
|
|
274
288
|
if (!track) return;
|
|
275
289
|
|
|
276
|
-
|
|
290
|
+
const seekInfo = startPosition > 0 ? ` @ ${Math.floor(startPosition / 1000)}s` : '';
|
|
291
|
+
log.info('PLAYER', `Playing: ${track.title} (${track.id})${seekInfo}`);
|
|
277
292
|
this.emit('trackStart', track);
|
|
278
293
|
|
|
279
294
|
try {
|
|
@@ -282,7 +297,7 @@ class Player extends EventEmitter {
|
|
|
282
297
|
volume: this._volume
|
|
283
298
|
};
|
|
284
299
|
|
|
285
|
-
if (this._prefetchedTrack?.id === track.id && this._prefetchedStream) {
|
|
300
|
+
if (startPosition === 0 && this._prefetchedTrack?.id === track.id && this._prefetchedStream) {
|
|
286
301
|
log.info('PLAYER', `Using prefetched stream for ${track.id}`);
|
|
287
302
|
this.stream = this._prefetchedStream;
|
|
288
303
|
this._prefetchedStream = null;
|
|
@@ -292,12 +307,12 @@ class Player extends EventEmitter {
|
|
|
292
307
|
this.stream = createStream(track, filtersWithVolume, this.config);
|
|
293
308
|
}
|
|
294
309
|
|
|
295
|
-
const resource = await this.stream.create();
|
|
310
|
+
const resource = await this.stream.create(startPosition);
|
|
296
311
|
|
|
297
312
|
this.audioPlayer.play(resource);
|
|
298
313
|
this._playing = true;
|
|
299
314
|
this._paused = false;
|
|
300
|
-
this._positionMs =
|
|
315
|
+
this._positionMs = startPosition;
|
|
301
316
|
this._positionTimestamp = Date.now();
|
|
302
317
|
|
|
303
318
|
this._prefetchNext();
|