@scarlett-player/playlist 0.5.2 → 1.0.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/dist/index.cjs CHANGED
@@ -30,7 +30,9 @@ var DEFAULT_CONFIG = {
30
30
  persist: false,
31
31
  persistKey: "scarlett-playlist",
32
32
  shuffle: false,
33
- repeat: "none"
33
+ repeat: "none",
34
+ autoLoad: true,
35
+ advanceDelay: 0
34
36
  };
35
37
  function generateId() {
36
38
  return `track-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
@@ -174,6 +176,9 @@ function createPlaylistPlugin(config) {
174
176
  }
175
177
  api?.setState("mediaType", track.type || "audio");
176
178
  emitChange();
179
+ if (mergedConfig.autoLoad !== false && track.src) {
180
+ api?.emit("media:load-request", { src: track.src, autoplay: true });
181
+ }
177
182
  };
178
183
  const plugin = {
179
184
  id: "playlist",
@@ -188,12 +193,20 @@ function createPlaylistPlugin(config) {
188
193
  if (shuffle && tracks.length > 0) {
189
194
  generateShuffleOrder();
190
195
  }
196
+ let advanceTimeout = null;
191
197
  const unsubEnded = api.on("playback:ended", () => {
192
198
  if (!mergedConfig.autoAdvance) return;
193
199
  const nextIdx = getNextIndex();
194
200
  if (nextIdx >= 0) {
195
- api?.logger.debug("Auto-advancing to next track", { nextIdx });
196
- setCurrentTrack(nextIdx);
201
+ const advance = () => {
202
+ api?.logger.debug("Auto-advancing to next track", { nextIdx });
203
+ setCurrentTrack(nextIdx);
204
+ };
205
+ if (mergedConfig.advanceDelay) {
206
+ advanceTimeout = setTimeout(advance, mergedConfig.advanceDelay);
207
+ } else {
208
+ advance();
209
+ }
197
210
  } else {
198
211
  api?.logger.info("Playlist ended");
199
212
  api?.emit("playlist:ended", void 0);
@@ -201,6 +214,10 @@ function createPlaylistPlugin(config) {
201
214
  });
202
215
  api.onDestroy(() => {
203
216
  unsubEnded();
217
+ if (advanceTimeout) {
218
+ clearTimeout(advanceTimeout);
219
+ advanceTimeout = null;
220
+ }
204
221
  persistPlaylist();
205
222
  });
206
223
  },
package/dist/index.d.cts CHANGED
@@ -28,6 +28,8 @@ interface PlaylistTrack {
28
28
  mimeType?: string;
29
29
  /** Additional metadata */
30
30
  metadata?: Record<string, unknown>;
31
+ /** Allow additional properties for extensibility */
32
+ [key: string]: unknown;
31
33
  }
32
34
  /**
33
35
  * Repeat mode
@@ -72,6 +74,10 @@ interface PlaylistPluginConfig {
72
74
  shuffle?: boolean;
73
75
  /** Initial repeat mode */
74
76
  repeat?: RepeatMode;
77
+ /** Emit media:load-request on track change so core player loads automatically (default: true) */
78
+ autoLoad?: boolean;
79
+ /** Milliseconds to wait before auto-advancing to next track (default: 0) */
80
+ advanceDelay?: number;
75
81
  /** Index signature for PluginConfig compatibility */
76
82
  [key: string]: unknown;
77
83
  }
package/dist/index.d.ts CHANGED
@@ -28,6 +28,8 @@ interface PlaylistTrack {
28
28
  mimeType?: string;
29
29
  /** Additional metadata */
30
30
  metadata?: Record<string, unknown>;
31
+ /** Allow additional properties for extensibility */
32
+ [key: string]: unknown;
31
33
  }
32
34
  /**
33
35
  * Repeat mode
@@ -72,6 +74,10 @@ interface PlaylistPluginConfig {
72
74
  shuffle?: boolean;
73
75
  /** Initial repeat mode */
74
76
  repeat?: RepeatMode;
77
+ /** Emit media:load-request on track change so core player loads automatically (default: true) */
78
+ autoLoad?: boolean;
79
+ /** Milliseconds to wait before auto-advancing to next track (default: 0) */
80
+ advanceDelay?: number;
75
81
  /** Index signature for PluginConfig compatibility */
76
82
  [key: string]: unknown;
77
83
  }
package/dist/index.js CHANGED
@@ -5,7 +5,9 @@ var DEFAULT_CONFIG = {
5
5
  persist: false,
6
6
  persistKey: "scarlett-playlist",
7
7
  shuffle: false,
8
- repeat: "none"
8
+ repeat: "none",
9
+ autoLoad: true,
10
+ advanceDelay: 0
9
11
  };
10
12
  function generateId() {
11
13
  return `track-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
@@ -149,6 +151,9 @@ function createPlaylistPlugin(config) {
149
151
  }
150
152
  api?.setState("mediaType", track.type || "audio");
151
153
  emitChange();
154
+ if (mergedConfig.autoLoad !== false && track.src) {
155
+ api?.emit("media:load-request", { src: track.src, autoplay: true });
156
+ }
152
157
  };
153
158
  const plugin = {
154
159
  id: "playlist",
@@ -163,12 +168,20 @@ function createPlaylistPlugin(config) {
163
168
  if (shuffle && tracks.length > 0) {
164
169
  generateShuffleOrder();
165
170
  }
171
+ let advanceTimeout = null;
166
172
  const unsubEnded = api.on("playback:ended", () => {
167
173
  if (!mergedConfig.autoAdvance) return;
168
174
  const nextIdx = getNextIndex();
169
175
  if (nextIdx >= 0) {
170
- api?.logger.debug("Auto-advancing to next track", { nextIdx });
171
- setCurrentTrack(nextIdx);
176
+ const advance = () => {
177
+ api?.logger.debug("Auto-advancing to next track", { nextIdx });
178
+ setCurrentTrack(nextIdx);
179
+ };
180
+ if (mergedConfig.advanceDelay) {
181
+ advanceTimeout = setTimeout(advance, mergedConfig.advanceDelay);
182
+ } else {
183
+ advance();
184
+ }
172
185
  } else {
173
186
  api?.logger.info("Playlist ended");
174
187
  api?.emit("playlist:ended", void 0);
@@ -176,6 +189,10 @@ function createPlaylistPlugin(config) {
176
189
  });
177
190
  api.onDestroy(() => {
178
191
  unsubEnded();
192
+ if (advanceTimeout) {
193
+ clearTimeout(advanceTimeout);
194
+ advanceTimeout = null;
195
+ }
179
196
  persistPlaylist();
180
197
  });
181
198
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scarlett-player/playlist",
3
- "version": "0.5.2",
3
+ "version": "1.0.0",
4
4
  "description": "Playlist Plugin for Scarlett Player - Queue management, shuffle, repeat, and gapless playback",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -22,14 +22,14 @@
22
22
  "dist"
23
23
  ],
24
24
  "peerDependencies": {
25
- "@scarlett-player/core": "^0.5.2"
25
+ "@scarlett-player/core": "^1.0.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "tsup": "^8.0.0",
29
29
  "typescript": "^5.3.0",
30
30
  "vitest": "^1.6.0",
31
31
  "jsdom": "^24.0.0",
32
- "@scarlett-player/core": "0.5.2"
32
+ "@scarlett-player/core": "1.0.0"
33
33
  },
34
34
  "keywords": [
35
35
  "video",