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.
@@ -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.10",
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",
@@ -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
- log.info('PLAYER', `Playing: ${track.title} (${track.id})`);
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 = 0;
315
+ this._positionMs = startPosition;
301
316
  this._positionTimestamp = Date.now();
302
317
 
303
318
  this._prefetchNext();