@scarlett-player/playlist 1.9.0 → 1.11.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
@@ -304,7 +304,7 @@ function injectStyles() {
304
304
  }
305
305
 
306
306
  // src/version.ts
307
- var PKG_VERSION = true ? "1.9.0" : "0.0.0-dev";
307
+ var PKG_VERSION = true ? "1.11.0" : "0.0.0-dev";
308
308
 
309
309
  // src/index.ts
310
310
  var DEFAULT_CONFIG = {
@@ -428,18 +428,24 @@ function createPlaylistPlugin(config) {
428
428
  api?.logger.warn("Failed to persist playlist", e);
429
429
  }
430
430
  };
431
+ const isTrack = (t) => typeof t === "object" && t !== null && typeof t.src === "string";
431
432
  const loadPersistedPlaylist = () => {
432
433
  if (!mergedConfig.persist) return;
434
+ if (mergedConfig.tracks !== void 0) return;
433
435
  try {
434
436
  const data = localStorage.getItem(mergedConfig.persistKey);
435
- if (data) {
436
- const parsed = JSON.parse(data);
437
- tracks = parsed.tracks || [];
438
- currentIndex = parsed.currentIndex ?? -1;
439
- shuffle = parsed.shuffle ?? false;
440
- repeat = parsed.repeat ?? "none";
441
- shuffleOrder = parsed.shuffleOrder || [];
442
- }
437
+ if (!data) return;
438
+ const parsed = JSON.parse(data);
439
+ const restored = Array.isArray(parsed.tracks) ? parsed.tracks.filter(isTrack) : [];
440
+ if (restored.length === 0) return;
441
+ tracks = restored;
442
+ const index = Number.isInteger(parsed.currentIndex) ? parsed.currentIndex : -1;
443
+ currentIndex = index >= 0 ? Math.min(index, tracks.length - 1) : -1;
444
+ shuffle = parsed.shuffle === true;
445
+ repeat = parsed.repeat === "one" || parsed.repeat === "all" ? parsed.repeat : "none";
446
+ shuffleOrder = Array.isArray(parsed.shuffleOrder) ? parsed.shuffleOrder.filter(
447
+ (n) => typeof n === "number" && n >= 0 && n < tracks.length
448
+ ) : [];
443
449
  } catch (e) {
444
450
  api?.logger.warn("Failed to load persisted playlist", e);
445
451
  }
@@ -449,7 +455,7 @@ function createPlaylistPlugin(config) {
449
455
  api?.emit("playlist:change", { track, index: currentIndex });
450
456
  persistPlaylist();
451
457
  };
452
- const setCurrentTrack = (index) => {
458
+ const setCurrentTrack = (index, options = {}) => {
453
459
  if (index < 0 || index >= tracks.length) {
454
460
  api?.logger.warn("Invalid track index", { index });
455
461
  return;
@@ -462,7 +468,7 @@ function createPlaylistPlugin(config) {
462
468
  api?.setState("mediaType", track.type || "audio");
463
469
  emitChange();
464
470
  if (mergedConfig.autoLoad !== false && track.src) {
465
- api?.emit("media:load-request", { src: track.src, autoplay: true });
471
+ api?.emit("media:load-request", { src: track.src, autoplay: options.autoplay ?? true });
466
472
  }
467
473
  };
468
474
  const plugin = {
@@ -476,7 +482,7 @@ function createPlaylistPlugin(config) {
476
482
  api = pluginApi;
477
483
  api.logger.info("Playlist plugin initialized");
478
484
  loadPersistedPlaylist();
479
- if (shuffle && tracks.length > 0) {
485
+ if (shuffle && tracks.length > 0 && shuffleOrder.length !== tracks.length) {
480
486
  generateShuffleOrder();
481
487
  }
482
488
  let advanceTimeout = null;
@@ -484,11 +490,13 @@ function createPlaylistPlugin(config) {
484
490
  if (!mergedConfig.autoAdvance) return;
485
491
  const nextIdx = getNextIndex();
486
492
  if (nextIdx >= 0) {
493
+ const wasPlaying = !api?.getState("paused");
487
494
  const advance = () => {
488
495
  api?.logger.debug("Auto-advancing to next track", { nextIdx });
489
- setCurrentTrack(nextIdx);
496
+ setCurrentTrack(nextIdx, { autoplay: wasPlaying });
490
497
  };
491
498
  if (mergedConfig.advanceDelay) {
499
+ if (advanceTimeout) clearTimeout(advanceTimeout);
492
500
  advanceTimeout = setTimeout(advance, mergedConfig.advanceDelay);
493
501
  } else {
494
502
  advance();
package/dist/index.js CHANGED
@@ -266,7 +266,7 @@ function injectStyles() {
266
266
  }
267
267
 
268
268
  // src/version.ts
269
- var PKG_VERSION = true ? "1.9.0" : "0.0.0-dev";
269
+ var PKG_VERSION = true ? "1.11.0" : "0.0.0-dev";
270
270
 
271
271
  // src/index.ts
272
272
  var DEFAULT_CONFIG = {
@@ -390,18 +390,24 @@ function createPlaylistPlugin(config) {
390
390
  api?.logger.warn("Failed to persist playlist", e);
391
391
  }
392
392
  };
393
+ const isTrack = (t) => typeof t === "object" && t !== null && typeof t.src === "string";
393
394
  const loadPersistedPlaylist = () => {
394
395
  if (!mergedConfig.persist) return;
396
+ if (mergedConfig.tracks !== void 0) return;
395
397
  try {
396
398
  const data = localStorage.getItem(mergedConfig.persistKey);
397
- if (data) {
398
- const parsed = JSON.parse(data);
399
- tracks = parsed.tracks || [];
400
- currentIndex = parsed.currentIndex ?? -1;
401
- shuffle = parsed.shuffle ?? false;
402
- repeat = parsed.repeat ?? "none";
403
- shuffleOrder = parsed.shuffleOrder || [];
404
- }
399
+ if (!data) return;
400
+ const parsed = JSON.parse(data);
401
+ const restored = Array.isArray(parsed.tracks) ? parsed.tracks.filter(isTrack) : [];
402
+ if (restored.length === 0) return;
403
+ tracks = restored;
404
+ const index = Number.isInteger(parsed.currentIndex) ? parsed.currentIndex : -1;
405
+ currentIndex = index >= 0 ? Math.min(index, tracks.length - 1) : -1;
406
+ shuffle = parsed.shuffle === true;
407
+ repeat = parsed.repeat === "one" || parsed.repeat === "all" ? parsed.repeat : "none";
408
+ shuffleOrder = Array.isArray(parsed.shuffleOrder) ? parsed.shuffleOrder.filter(
409
+ (n) => typeof n === "number" && n >= 0 && n < tracks.length
410
+ ) : [];
405
411
  } catch (e) {
406
412
  api?.logger.warn("Failed to load persisted playlist", e);
407
413
  }
@@ -411,7 +417,7 @@ function createPlaylistPlugin(config) {
411
417
  api?.emit("playlist:change", { track, index: currentIndex });
412
418
  persistPlaylist();
413
419
  };
414
- const setCurrentTrack = (index) => {
420
+ const setCurrentTrack = (index, options = {}) => {
415
421
  if (index < 0 || index >= tracks.length) {
416
422
  api?.logger.warn("Invalid track index", { index });
417
423
  return;
@@ -424,7 +430,7 @@ function createPlaylistPlugin(config) {
424
430
  api?.setState("mediaType", track.type || "audio");
425
431
  emitChange();
426
432
  if (mergedConfig.autoLoad !== false && track.src) {
427
- api?.emit("media:load-request", { src: track.src, autoplay: true });
433
+ api?.emit("media:load-request", { src: track.src, autoplay: options.autoplay ?? true });
428
434
  }
429
435
  };
430
436
  const plugin = {
@@ -438,7 +444,7 @@ function createPlaylistPlugin(config) {
438
444
  api = pluginApi;
439
445
  api.logger.info("Playlist plugin initialized");
440
446
  loadPersistedPlaylist();
441
- if (shuffle && tracks.length > 0) {
447
+ if (shuffle && tracks.length > 0 && shuffleOrder.length !== tracks.length) {
442
448
  generateShuffleOrder();
443
449
  }
444
450
  let advanceTimeout = null;
@@ -446,11 +452,13 @@ function createPlaylistPlugin(config) {
446
452
  if (!mergedConfig.autoAdvance) return;
447
453
  const nextIdx = getNextIndex();
448
454
  if (nextIdx >= 0) {
455
+ const wasPlaying = !api?.getState("paused");
449
456
  const advance = () => {
450
457
  api?.logger.debug("Auto-advancing to next track", { nextIdx });
451
- setCurrentTrack(nextIdx);
458
+ setCurrentTrack(nextIdx, { autoplay: wasPlaying });
452
459
  };
453
460
  if (mergedConfig.advanceDelay) {
461
+ if (advanceTimeout) clearTimeout(advanceTimeout);
454
462
  advanceTimeout = setTimeout(advance, mergedConfig.advanceDelay);
455
463
  } else {
456
464
  advance();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scarlett-player/playlist",
3
- "version": "1.9.0",
3
+ "version": "1.11.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,16 +22,16 @@
22
22
  "dist"
23
23
  ],
24
24
  "peerDependencies": {
25
- "@scarlett-player/core": "^1.8.0",
26
- "@scarlett-player/ui": "^1.8.0"
25
+ "@scarlett-player/core": "^1.9.0",
26
+ "@scarlett-player/ui": "^1.9.0"
27
27
  },
28
28
  "devDependencies": {
29
29
  "tsup": "^8.0.0",
30
30
  "typescript": "^5.3.0",
31
31
  "vitest": "^1.6.0",
32
32
  "jsdom": "^24.0.0",
33
- "@scarlett-player/core": "1.9.0",
34
- "@scarlett-player/ui": "1.9.0"
33
+ "@scarlett-player/core": "1.11.0",
34
+ "@scarlett-player/ui": "1.11.0"
35
35
  },
36
36
  "keywords": [
37
37
  "video",