@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 +20 -3
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +20 -3
- package/package.json +3 -3
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
|
-
|
|
196
|
-
|
|
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
|
-
|
|
171
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
32
|
+
"@scarlett-player/core": "1.0.0"
|
|
33
33
|
},
|
|
34
34
|
"keywords": [
|
|
35
35
|
"video",
|