tmg-media-player 0.0.11 → 0.0.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.
Files changed (90) hide show
  1. package/dist/assets/icons/movie-tape.png +0 -0
  2. package/dist/assets/icons/tmg-icon.jpeg +0 -0
  3. package/dist/{chunk-FI5SPLES.js → chunk-2H6X5VZG.js} +5 -5
  4. package/dist/chunk-2H6X5VZG.js.map +1 -0
  5. package/dist/{chunk-HUH25JG5.js → chunk-2HVBZADO.js} +38 -38
  6. package/dist/{chunk-RR5GXBNA.js → chunk-2OWLFV3A.js} +7 -7
  7. package/dist/{chunk-K7Z7Q6LQ.js → chunk-6SUR2P3T.js} +11 -6
  8. package/dist/chunk-6SUR2P3T.js.map +1 -0
  9. package/dist/{chunk-CWE4QKDK.js → chunk-APTMOXNH.js} +2 -2
  10. package/dist/{chunk-GSOXOST7.js → chunk-BKFXEFPY.js} +2 -2
  11. package/dist/{chunk-T4ABAVTZ.js → chunk-CGR2QBUD.js} +9 -6
  12. package/dist/chunk-CGR2QBUD.js.map +1 -0
  13. package/dist/{chunk-7W4SABYP.js → chunk-DDFE4KEG.js} +2 -2
  14. package/dist/chunk-DDFE4KEG.js.map +1 -0
  15. package/dist/{chunk-4MF2SLIL.js → chunk-IS4FCH6B.js} +54 -54
  16. package/dist/{chunk-UIK25CH6.js → chunk-K22NHK7L.js} +2 -2
  17. package/dist/chunk-K22NHK7L.js.map +1 -0
  18. package/dist/{chunk-4BBRAX3O.js → chunk-Q3GITFJK.js} +2 -2
  19. package/dist/{chunk-ONDVMF2G.js → chunk-S4NETCMQ.js} +32 -32
  20. package/dist/{chunk-3DUIEUZK.js → chunk-WWIT3BRG.js} +29 -29
  21. package/dist/{chunk-I5CLRE4T.js → chunk-YJX3ENZR.js} +76 -76
  22. package/dist/{chunk-RXQAQ4GB.js → chunk-YWNPOW3G.js} +23 -23
  23. package/dist/components/holders/pipplaceholder.cjs.map +1 -1
  24. package/dist/components/holders/pipplaceholder.js +2 -2
  25. package/dist/components/notifiers/z-register.js +9 -9
  26. package/dist/components/z-register.cjs.map +1 -1
  27. package/dist/components/z-register.js +18 -18
  28. package/dist/index.cjs +1 -1
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.js +1 -1
  31. package/dist/init.cjs +1 -1
  32. package/dist/init.cjs.map +1 -1
  33. package/dist/init.js +1 -1
  34. package/dist/plugs/main/playlist/index.cjs +57 -8
  35. package/dist/plugs/main/playlist/index.cjs.map +1 -1
  36. package/dist/plugs/main/playlist/index.js +3 -1
  37. package/dist/plugs/menus/main/playlist.cjs +1 -1
  38. package/dist/plugs/menus/main/playlist.cjs.map +1 -1
  39. package/dist/plugs/menus/main/playlist.js +1 -1
  40. package/dist/plugs/menus/settings/metadata.cjs.map +1 -1
  41. package/dist/plugs/menus/settings/metadata.js +2 -2
  42. package/dist/plugs/menus/z-register.cjs +1 -1
  43. package/dist/plugs/menus/z-register.cjs.map +1 -1
  44. package/dist/plugs/menus/z-register.js +14 -14
  45. package/dist/plugs/settings/auto/index.cjs +7 -4
  46. package/dist/plugs/settings/auto/index.cjs.map +1 -1
  47. package/dist/plugs/settings/auto/index.js +1 -1
  48. package/dist/plugs/settings/cast/index.cjs.map +1 -1
  49. package/dist/plugs/settings/cast/index.js +2 -2
  50. package/dist/plugs/z-register.cjs +126 -86
  51. package/dist/plugs/z-register.cjs.map +1 -1
  52. package/dist/plugs/z-register.js +31 -31
  53. package/dist/super/components/index.cjs.map +1 -1
  54. package/dist/super/components/index.js +59 -59
  55. package/dist/super/components/notifiers.js +23 -23
  56. package/dist/super/plugs/index.cjs +340 -302
  57. package/dist/super/plugs/index.cjs.map +1 -1
  58. package/dist/super/plugs/index.js +92 -92
  59. package/dist/super/plugs/menus.cjs +1 -1
  60. package/dist/super/plugs/menus.cjs.map +1 -1
  61. package/dist/super/plugs/menus.js +31 -31
  62. package/dist/super/techs.js +3 -3
  63. package/dist/super/utils.cjs +4 -4
  64. package/dist/super/utils.cjs.map +1 -1
  65. package/dist/super/utils.js +2 -2
  66. package/dist/super.cjs +71 -66
  67. package/dist/super.cjs.map +1 -1
  68. package/dist/super.global.js +53 -48
  69. package/dist/super.global.js.map +1 -1
  70. package/dist/super.js +78 -78
  71. package/dist/techs/z-register.js +3 -3
  72. package/dist/utils/file.cjs +4 -4
  73. package/dist/utils/file.cjs.map +1 -1
  74. package/dist/utils/file.js +1 -1
  75. package/package.json +1 -1
  76. package/dist/chunk-7W4SABYP.js.map +0 -1
  77. package/dist/chunk-FI5SPLES.js.map +0 -1
  78. package/dist/chunk-K7Z7Q6LQ.js.map +0 -1
  79. package/dist/chunk-T4ABAVTZ.js.map +0 -1
  80. package/dist/chunk-UIK25CH6.js.map +0 -1
  81. /package/dist/{chunk-HUH25JG5.js.map → chunk-2HVBZADO.js.map} +0 -0
  82. /package/dist/{chunk-RR5GXBNA.js.map → chunk-2OWLFV3A.js.map} +0 -0
  83. /package/dist/{chunk-CWE4QKDK.js.map → chunk-APTMOXNH.js.map} +0 -0
  84. /package/dist/{chunk-GSOXOST7.js.map → chunk-BKFXEFPY.js.map} +0 -0
  85. /package/dist/{chunk-4MF2SLIL.js.map → chunk-IS4FCH6B.js.map} +0 -0
  86. /package/dist/{chunk-4BBRAX3O.js.map → chunk-Q3GITFJK.js.map} +0 -0
  87. /package/dist/{chunk-ONDVMF2G.js.map → chunk-S4NETCMQ.js.map} +0 -0
  88. /package/dist/{chunk-3DUIEUZK.js.map → chunk-WWIT3BRG.js.map} +0 -0
  89. /package/dist/{chunk-I5CLRE4T.js.map → chunk-YJX3ENZR.js.map} +0 -0
  90. /package/dist/{chunk-RXQAQ4GB.js.map → chunk-YWNPOW3G.js.map} +0 -0
Binary file
Binary file
@@ -20,7 +20,7 @@ function noExtension(fn, generic = true) {
20
20
  function getMimeTypeFromExtension(name, generic = true) {
21
21
  return mimeTypes[getExtension(name, generic)] || "application/octet-stream";
22
22
  }
23
- function smartFlatSort(files, debug = false, stripExt = noExtension, log = debug ? (title, ...body) => console.log(`[Sorter][${title}]`, ...body) : NOOP, bCache = /* @__PURE__ */ new Map(), kCache = /* @__PURE__ */ new Map(), groups = /* @__PURE__ */ new Map()) {
23
+ function smartFlatSort(files, getName = (item) => item.name || "", debug = false, stripExt = noExtension, log = debug ? (title, ...body) => console.log(`[Sorter][${title}]`, ...body) : NOOP, bCache = /* @__PURE__ */ new Map(), kCache = /* @__PURE__ */ new Map(), groups = /* @__PURE__ */ new Map()) {
24
24
  debug && console.time("[Sorter]"), log("Init", `Sorting ${files.length} items...`);
25
25
  function getNamePrefix(name, base = stripExt(name), match = base.match(/(.*?)(?:(?:s|season)[\s\-]?)(\d+).*?(?:(?:e|ep|episode)[\s\-]?)(\d+)?/i)) {
26
26
  return bCache.set(name, base), (match ? match[1].replace(/[^a-z0-9]+/gi, " ").trim().toLowerCase() + " s" + match[2].padStart(2, "0") : base.replace(/(?:(?:e|ep|episode|part)[\s\-]?)\d+/gi, "").replace(/[^a-z0-9]+/gi, " ").trim().toLowerCase()) || "unknown";
@@ -37,11 +37,11 @@ function smartFlatSort(files, debug = false, stripExt = noExtension, log = debug
37
37
  return [Infinity, Infinity];
38
38
  }
39
39
  for (const file of files) {
40
- const key = getNamePrefix(file.name);
40
+ const key = getNamePrefix(getName(file));
41
41
  let group = groups.get(key);
42
- log("Prefix", `"${file.name}" -> "${key}"`), (group ?? (groups.set(key, group = []), group)).push(file);
42
+ log("Prefix", `"${getName(file)}" -> "${key}"`), (group ?? (groups.set(key, group = []), group)).push(file);
43
43
  }
44
- const sortedFiles = [], byGroup = ([a], [b], diff = a === "unknown" ? 1 : b === "unknown" ? -1 : a.localeCompare(b)) => (log("Group Compare", `[${a}] vs [${b}] = ${diff > 0 ? "B first" : diff < 0 ? "A first" : "Tie"}`), diff), getKey = (name, key = kCache.get(name)) => key ? key : (kCache.set(name, key = extractEpisodeKey(name)), key), byEpisode = (a, b, ak = getKey(a.name), bk = getKey(b.name), diff = ak[0] !== bk[0] ? ak[0] - bk[0] : ak[1] - bk[1]) => (log("Episode Compare", `[${ak}] vs [${bk}] = ${diff > 0 ? "B first" : diff < 0 ? "A first" : "Tie"} ("${a.name}" / "${b.name}")`), diff), sortedGroups = (log("Groups", `Identified ${groups.size} group(s)`, groups), [...groups.entries()].sort(byGroup));
44
+ const sortedFiles = [], byGroup = ([a], [b], diff = a === "unknown" ? 1 : b === "unknown" ? -1 : a.localeCompare(b)) => (log("Group Compare", `[${a}] vs [${b}] = ${diff > 0 ? "B first" : diff < 0 ? "A first" : "Tie"}`), diff), getKey = (name, key = kCache.get(name)) => key ? key : (kCache.set(name, key = extractEpisodeKey(name)), key), byEpisode = (a, b, ak = getKey(getName(a)), bk = getKey(getName(b)), diff = ak[0] !== bk[0] ? ak[0] - bk[0] : ak[1] - bk[1]) => (log("Episode Compare", `[${ak}] vs [${bk}] = ${diff > 0 ? "B first" : diff < 0 ? "A first" : "Tie"} ("${getName(a)}" / "${getName(b)}")`), diff), sortedGroups = (log("Groups", `Identified ${groups.size} group(s)`, groups), [...groups.entries()].sort(byGroup));
45
45
  for (const [, group] of sortedGroups) group.sort(byEpisode), sortedFiles.push(...group);
46
46
  return log("Done", sortedFiles), debug && console.timeEnd("[Sorter]"), sortedFiles;
47
47
  }
@@ -53,4 +53,4 @@ export {
53
53
  smartFlatSort,
54
54
  formatSize
55
55
  };
56
- //# sourceMappingURL=chunk-FI5SPLES.js.map
56
+ //# sourceMappingURL=chunk-2H6X5VZG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ts/utils/file.ts"],"sourcesContent":["import { NOOP } from \"sia-reactor\";\r\nimport { parseRomanNum } from \"./num\";\r\nimport { MEDIA_EXTENSIONS, FILE_EXTENSIONS, mimeTypes } from \"./match\";\r\n\r\n// File Size Formatting\r\nexport { formatSize } from \"@t007/utils\";\r\n\r\n// Extension Helpers\r\nexport function getExtension(fn: string, generic = true): string {\r\n const m = fn.match(!generic ? MEDIA_EXTENSIONS : FILE_EXTENSIONS);\r\n return (m ? (generic ? m[1] : m[1] || m[4]) : \"\")?.toLowerCase() ?? \"\"; // AUD or VID ext\r\n}\r\n\r\nexport function noExtension(fn: string, generic = true): string {\r\n return fn.replace(!generic ? MEDIA_EXTENSIONS : FILE_EXTENSIONS, \"\");\r\n}\r\n\r\n// MIME Type Resolution\r\nexport function getMimeTypeFromExtension(name: string, generic = true): string {\r\n return mimeTypes[getExtension(name, generic)] || \"application/octet-stream\"; // Default to binary stream\r\n}\r\n\r\n// Sorters\r\nexport function smartFlatSort<F>(files: F[], getName: (item: F) => string = (item: any) => item.name || \"\", debug = false, stripExt = noExtension, log = debug ? (title: string, ...body: any[]) => console.log(`[Sorter][${title}]`, ...body) : NOOP, bCache = new Map(), kCache = new Map(), groups = new Map()) {\r\n debug && console.time(\"[Sorter]\"), log(\"Init\", `Sorting ${files.length} items...`);\r\n // Extracts the main series title + optional season\r\n function getNamePrefix(name: string, base = stripExt(name), match = base.match(/(.*?)(?:(?:s|season)[\\s\\-]?)(\\d+).*?(?:(?:e|ep|episode)[\\s\\-]?)(\\d+)?/i)) {\r\n // prettier-ignore\r\n return bCache.set(name, base), (match ? (match[1].replace(/[^a-z0-9]+/gi, \" \").trim().toLowerCase() + \" s\" + match[2].padStart(2, \"0\")) : base.replace(/(?:(?:e|ep|episode|part)[\\s\\-]?)\\d+/gi, \"\").replace(/[^a-z0-9]+/gi, \" \").trim().toLowerCase()) || \"unknown\";\r\n }\r\n // Extract episode key: season, episode number(s), or special flags\r\n function extractEpisodeKey(name: string, base = bCache.get(name).toLowerCase()) {\r\n // Match lazy formats like \"S02 - Episode 3\", \"S3 ep4\", \"S5E 7\" (not strict SxxEyy)\r\n const combo = base.match(/(?:(?:s|season)[\\s\\-]?)(\\d+).*?(?:(?:e|ep|episode)[\\s\\-]?)(\\d+)/);\r\n if (combo) return [parseInt(combo[1]), parseInt(combo[2])];\r\n // Match \"1x01\", \"5x12\", alternate style used by some encoders or fansubs\r\n const alt = base.match(/(\\d+)x(\\d+)/);\r\n if (alt) return [parseInt(alt[1]), parseInt(alt[2])];\r\n // Match Roman numerals like \"Season IV Episode IX\"\r\n const roman = base.match(/(?:(?:s|season)[\\s\\-]?)([ivxlcdm]+).*?(?:(?:e|ep|episode)[\\s\\-]?)([ivxlcdm]+)/i);\r\n if (roman) return [parseRomanNum(roman[1], true), parseRomanNum(roman[2], true)];\r\n // Match fallback single-episode formats like \"Ep12\", \"Episode 5\", \"E7\", \"Part 2\" without season info\r\n const loose = base.match(/(?:(?:e|ep|episode|part)[\\s\\-]?)(\\d+)/);\r\n if (loose) return [999, parseInt(loose[1])]; // Put these at the end with fake season 999\r\n // Totally unmatchable junk (e.g. \"Behind the Scenes\", \"Bonus Feature\")\r\n return [Infinity, Infinity]; // Hard fallback, gets sorted dead last\r\n }\r\n for (const file of files) {\r\n const key = getNamePrefix(getName(file));\r\n let group = groups.get(key);\r\n log(\"Prefix\", `\"${getName(file)}\" -> \"${key}\"`), (group ?? (groups.set(key, (group = [])), group)).push(file);\r\n }\r\n const sortedFiles = [],\r\n byGroup = ([a]: [string, F[]], [b]: [string, F[]], diff = a === \"unknown\" ? 1 : b === \"unknown\" ? -1 : a.localeCompare(b)) => (log(\"Group Compare\", `[${a}] vs [${b}] = ${diff > 0 ? \"B first\" : diff < 0 ? \"A first\" : \"Tie\"}`), diff), // Sort groups alphabetically by their prefix\r\n getKey = (name: string, key = kCache.get(name)) => (key ? key : (kCache.set(name, (key = extractEpisodeKey(name))), key)),\r\n byEpisode = (a: F, b: F, ak = getKey(getName(a)), bk = getKey(getName(b)), diff = ak[0] !== bk[0] ? ak[0] - bk[0] : ak[1] - bk[1]) => (log(\"Episode Compare\", `[${ak}] vs [${bk}] = ${diff > 0 ? \"B first\" : diff < 0 ? \"A first\" : \"Tie\"} (\"${getName(a)}\" / \"${getName(b)}\")`), diff), // season | episode\r\n sortedGroups = (log(\"Groups\", `Identified ${groups.size} group(s)`, groups), [...groups.entries()].sort(byGroup)); // Sort groups alphabetically by their prefix\r\n for (const [, group] of sortedGroups) group.sort(byEpisode), sortedFiles.push(...group);\r\n return log(\"Done\", sortedFiles), debug && console.timeEnd(\"[Sorter]\"), sortedFiles;\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
- OverlayPlug
3
- } from "./chunk-5MQI7O2R.js";
2
+ VoicePlug
3
+ } from "./chunk-NKIZSZK6.js";
4
4
  import {
5
5
  VolumePlug
6
6
  } from "./chunk-PQS6UHBT.js";
@@ -11,32 +11,32 @@ import {
11
11
  TimeTravelPlug
12
12
  } from "./chunk-OJGLZKJW.js";
13
13
  import {
14
- VoicePlug
15
- } from "./chunk-NKIZSZK6.js";
14
+ TimePlug
15
+ } from "./chunk-SNNRESPJ.js";
16
16
  import {
17
17
  PlaybackRatePlug
18
18
  } from "./chunk-ANM4O6YM.js";
19
- import {
20
- SettingsViewPlug
21
- } from "./chunk-KLP6DROH.js";
22
- import {
23
- TimePlug
24
- } from "./chunk-SNNRESPJ.js";
25
19
  import {
26
20
  PosterPlug
27
21
  } from "./chunk-JZJVBWGH.js";
22
+ import {
23
+ SettingsViewPlug
24
+ } from "./chunk-KLP6DROH.js";
28
25
  import {
29
26
  PersistPlug
30
27
  } from "./chunk-57DK4F6O.js";
31
- import {
32
- NotifiersPlug
33
- } from "./chunk-CMJIS72L.js";
34
28
  import {
35
29
  ObjectFitPlug
36
30
  } from "./chunk-JF4OMYVV.js";
37
31
  import {
38
- AutoPlug
39
- } from "./chunk-T4ABAVTZ.js";
32
+ MetadataPlug
33
+ } from "./chunk-66JWLLKI.js";
34
+ import {
35
+ NotifiersPlug
36
+ } from "./chunk-CMJIS72L.js";
37
+ import {
38
+ OverlayPlug
39
+ } from "./chunk-5MQI7O2R.js";
40
40
  import {
41
41
  ModesFullscreenPin,
42
42
  ModesMiniplayerPin,
@@ -51,8 +51,8 @@ import {
51
51
  LockedPlug
52
52
  } from "./chunk-PIW3OLIE.js";
53
53
  import {
54
- MetadataPlug
55
- } from "./chunk-66JWLLKI.js";
54
+ FastPlayPlug
55
+ } from "./chunk-RXLBLUED.js";
56
56
  import {
57
57
  FramePlug
58
58
  } from "./chunk-WMQSS6BN.js";
@@ -61,12 +61,24 @@ import {
61
61
  GestureTouchPin,
62
62
  GestureWheelPin
63
63
  } from "./chunk-BSW7I4ZK.js";
64
+ import {
65
+ CSSPlug
66
+ } from "./chunk-FEJWVRKV.js";
64
67
  import {
65
68
  ErrorsPlug
66
69
  } from "./chunk-OB4IQC4Q.js";
67
70
  import {
68
- FastPlayPlug
69
- } from "./chunk-RXLBLUED.js";
71
+ CastPlug
72
+ } from "./chunk-BKFXEFPY.js";
73
+ import {
74
+ CaptionsPlug
75
+ } from "./chunk-F7PTR3GV.js";
76
+ import {
77
+ BrightnessPlug
78
+ } from "./chunk-VZLLCYU7.js";
79
+ import {
80
+ AutoPlug
81
+ } from "./chunk-CGR2QBUD.js";
70
82
  import {
71
83
  ControlPanelDraggablePin,
72
84
  ControlPanelPlug
@@ -74,36 +86,24 @@ import {
74
86
  import {
75
87
  ToastsPlug
76
88
  } from "./chunk-DQJN3BAA.js";
77
- import {
78
- CastPlug
79
- } from "./chunk-GSOXOST7.js";
80
- import {
81
- CSSPlug
82
- } from "./chunk-FEJWVRKV.js";
83
- import {
84
- BrightnessPlug
85
- } from "./chunk-VZLLCYU7.js";
86
- import {
87
- CaptionsPlug
88
- } from "./chunk-F7PTR3GV.js";
89
89
  import {
90
90
  AmbiencePlug
91
91
  } from "./chunk-ZUINQUU4.js";
92
92
  import {
93
93
  AirPlayPlug
94
94
  } from "./chunk-Z4XKUDFZ.js";
95
- import {
96
- DisabledPlug
97
- } from "./chunk-V5KWIXNY.js";
98
95
  import {
99
96
  PlaylistPlug
100
- } from "./chunk-K7Z7Q6LQ.js";
97
+ } from "./chunk-6SUR2P3T.js";
98
+ import {
99
+ LightStatePlug
100
+ } from "./chunk-PYK7PEVZ.js";
101
101
  import {
102
102
  SkeletonPlug
103
103
  } from "./chunk-GZCRCL4H.js";
104
104
  import {
105
- LightStatePlug
106
- } from "./chunk-PYK7PEVZ.js";
105
+ DisabledPlug
106
+ } from "./chunk-V5KWIXNY.js";
107
107
  import {
108
108
  PinRegistry,
109
109
  PlugRegistry
@@ -159,4 +159,4 @@ for (const Pin of [
159
159
  GestureTouchPin
160
160
  ])
161
161
  PinRegistry.register(Pin);
162
- //# sourceMappingURL=chunk-HUH25JG5.js.map
162
+ //# sourceMappingURL=chunk-2HVBZADO.js.map
@@ -1,3 +1,9 @@
1
+ import {
2
+ ShakaTech
3
+ } from "./chunk-NWYZI2HT.js";
4
+ import {
5
+ VimeoTech
6
+ } from "./chunk-3ZMXATGH.js";
1
7
  import {
2
8
  YouTubeTech
3
9
  } from "./chunk-M3Y6LR6M.js";
@@ -7,12 +13,6 @@ import {
7
13
  import {
8
14
  HLSTech
9
15
  } from "./chunk-3GYKSLPI.js";
10
- import {
11
- ShakaTech
12
- } from "./chunk-NWYZI2HT.js";
13
- import {
14
- VimeoTech
15
- } from "./chunk-3ZMXATGH.js";
16
16
  import {
17
17
  HTML5Tech
18
18
  } from "./chunk-GECXQOTO.js";
@@ -31,4 +31,4 @@ for (const Tech of [
31
31
  VimeoTech
32
32
  ])
33
33
  TechRegistry.register(Tech);
34
- //# sourceMappingURL=chunk-RR5GXBNA.js.map
34
+ //# sourceMappingURL=chunk-2OWLFV3A.js.map
@@ -5,6 +5,9 @@ import {
5
5
  PLAYLIST_BUILD,
6
6
  PLAYLIST_ITEM_BUILD
7
7
  } from "./chunk-DZNLR3DX.js";
8
+ import {
9
+ smartFlatSort
10
+ } from "./chunk-2H6X5VZG.js";
8
11
  import {
9
12
  safeNum
10
13
  } from "./chunk-YWBPJGAR.js";
@@ -72,14 +75,16 @@ var PlaylistPlug = class extends BasePlug {
72
75
  if (this.config.content && this.state.currentIndex < this.config.content.length - 1) this.moveTo(this.state.currentIndex + 1, true, "Next");
73
76
  }
74
77
  sort(order = this.state.sortOrder === "asc" ? "desc" : "asc", list = this.config.content) {
78
+ if (!list) return;
75
79
  this.state.sortOrder = order;
76
- list?.sort((a, b, aT = a.media.settings.metadata.title || a.media.intent.src.split("/").pop(), bT = b.media.settings.metadata.title || b.media.intent.src.split("/").pop()) => order === "asc" ? aT.localeCompare(bT) : bT.localeCompare(aT));
80
+ const sorted = smartFlatSort(list, (i) => i.media.settings.metadata.title || "");
81
+ this.config.content = order === "desc" ? sorted.reverse() : sorted;
77
82
  }
78
83
  shuffle(list = this.config.content) {
79
- for (let i = (list?.length ?? 0) - 1; i > 0; i--) {
80
- const j = Math.floor(Math.random() * (i + 1));
81
- [list[i], list[j]] = [list[j], list[i]];
82
- }
84
+ if (!list) return;
85
+ const shuffled = [...list];
86
+ for (let i = shuffled.length - 1, j = Math.floor(Math.random() * (i + 1)); i > 0; i--) [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
87
+ this.config.content = shuffled;
83
88
  }
84
89
  remove(index, list = this.config.content) {
85
90
  list?.splice(index, 1), index === this.state.currentIndex && list?.length && this.moveTo(Math.min(index, list.length - 1));
@@ -96,4 +101,4 @@ __publicField(PlaylistPlug, "BUILD", PLAYLIST_BUILD);
96
101
  export {
97
102
  PlaylistPlug
98
103
  };
99
- //# sourceMappingURL=chunk-K7Z7Q6LQ.js.map
104
+ //# sourceMappingURL=chunk-6SUR2P3T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ts/plugs/main/playlist/index.ts"],"sourcesContent":["import { BasePlug } from \"../../base\";\r\nimport type { PlaylistConfig, PlaylistItemConfig, PlaylistState } from \"./types\";\r\nimport { PLAYLIST_BUILD, PLAYLIST_ITEM_BUILD } from \"./build\";\r\nimport type { CtlrConfig } from \"@defs/config\";\r\nimport { type REvent } from \"sia-reactor\";\r\nimport { mergeObjs, fanout, parsePathObj } from \"sia-reactor/utils\";\r\nimport { silence, transaction } from \"sia-reactor/modules\";\r\nimport { isBool } from \"@utils/obj\";\r\nimport { isSameURL } from \"@utils/str\";\r\nimport { safeNum } from \"@utils/num\";\r\nimport { smartFlatSort } from \"@utils/file\";\r\nimport { Controller } from \"@core/controller\";\r\n\r\nexport class PlaylistPlug extends BasePlug<PlaylistConfig, PlaylistState> {\r\n public static readonly plugName = \"playlist\";\r\n public static readonly isMain: boolean = true;\r\n public static readonly BUILD = PLAYLIST_BUILD;\r\n public get atFirst() {\r\n return this.state.currentIndex <= 0;\r\n }\r\n public get atLast() {\r\n return !this.config.content || this.state.currentIndex >= this.config.content.length - 1;\r\n }\r\n\r\n constructor(ctlr: Controller, config = ctlr.config.playlist) {\r\n super(ctlr, config, { currentIndex: 0, editIndex: 0, sortOrder: \"asc\" });\r\n }\r\n\r\n public override wire(): void {\r\n // State Listeners\r\n this.state.on(\"currentIndex\", this.syncFeatures, { signal: this.signal });\r\n this.state.on(\"sortOrder\", ({ value }) => (this.media.container.dataset.playlistSort = value), { init: true, signal: this.signal });\r\n // Ctlr Config Getters\r\n this.ctlr.config.get(\"playlist.content\", (v) => (v?.length ? v : null), { signal: this.signal });\r\n // ----------- Setters\r\n this.ctlr.config.set(\"playlist.content\", (v) => (v ? (v.map((i) => mergeObjs(structuredClone(PLAYLIST_ITEM_BUILD) as any, parsePathObj(i))) as any) : null), { init: true, signal: this.signal });\r\n // ---- Media Watchers\r\n this.media.watch(\"tech\", this.syncFeatures, { init: true, signal: this.signal });\r\n for (const key of [\"title\", \"artist\", \"profile\", \"artwork\", \"chapterInfo\"] as const) this.media.watch(`settings.metadata.${key}`, (v) => this.config.content && !this.applying && (this.config.content[this.state.currentIndex].media.settings.metadata[key] = v as any), { init: this.ctlr.payload.wired && \"auto\", signal: this.signal });\r\n for (const key of [\"title\", \"artist\", \"profile\"] as const) this.media.watch(`settings.metadata.links.${key}`, (v) => this.config.content && !this.applying && (this.config.content[this.state.currentIndex].media.settings.metadata.links[key] = v), { init: this.ctlr.payload.wired && \"auto\", signal: this.signal });\r\n this.media.watch(\"state.currentTime\", (v) => this.config.content && !this.applying && (this.config.content[this.state.currentIndex].settings.time.start = v), { signal: this.signal });\r\n this.media.watch(\"status.duration\", (v) => this.config.content && !this.applying && (this.config.content[this.state.currentIndex].media.status.duration = v), { signal: this.signal });\r\n // ---- Config Listeners\r\n this.ctlr.config.watch(\"settings.time.start\", (v) => this.config.content && !this.applying && (this.config.content[this.state.currentIndex].settings.time.start = v), { init: this.ctlr.payload.wired && \"auto\", signal: this.signal });\r\n for (const key of [\"previews\", \"marks\"] as const) this.ctlr.config.watch(`settings.controlPanel.timeline.${key}`, (v) => this.config.content && !this.applying && (this.config.content[this.state.currentIndex].settings.controlPanel.timeline[key] = v as any), { init: this.ctlr.payload.wired && \"auto\", signal: this.signal });\r\n this.ctlr.config.on(\"playlist.content\", this.handleContent, { signal: this.signal, init: true, depth: 1 });\r\n this.ctlr.config.on(\"playlist.allowOverride\", this.syncFeatures, { signal: this.signal });\r\n // Post Wiring\r\n this.ctlr.registerAction(\"previous\", { fn: this.previous, keyboard: { phase: \"keydown\" } }), this.ctlr.registerAction(\"next\", { fn: this.next, keyboard: { phase: \"keydown\" } });\r\n super.wire();\r\n }\r\n\r\n protected handleContent({ currentTarget: { value: content } }: REvent<CtlrConfig, \"playlist.content\", 1>): void {\r\n this.syncFeatures();\r\n const v = content?.find((v) => (v.media.settings.metadata.id && v.media.settings.metadata.id === this.media.settings.metadata.id) || isSameURL(v.media.intent.src, this.media.intent.src));\r\n this.state.currentIndex = (v && content!.indexOf(v)) ?? 0;\r\n const pmdle = this.ctlr.plug(\"settings.persist\")?.module,\r\n apply = () => (v ? transaction(() => this.applyItem(v, false), \"Playlist Update\") : this.moveTo(this.state.currentIndex));\r\n pmdle && !pmdle.state.hydrated ? pmdle.state.wonce(\"hydrated\", apply, { signal: this.signal }) : apply();\r\n }\r\n\r\n protected applyItem(item: PlaylistItemConfig, _reset = true): void {\r\n (this.applying = true), fanout(this.settings, item.settings), fanout(this.media, item.media), (this.applying = false);\r\n }\r\n protected applying = false;\r\n\r\n public moveTo(index: number, shouldPlay?: boolean, label = \"Move\"): void {\r\n if (!this.config.content || !this.config.content[index]) return;\r\n this.state.currentIndex = index;\r\n transaction(() => (this.applyItem(this.config.content![index]), isBool(shouldPlay) && silence(() => (this.media.intent.paused = !shouldPlay))), `Playlist ${label}`);\r\n }\r\n\r\n public previous(): void {\r\n if (safeNum(this.media.state.currentTime) >= 3) transaction(() => ((this.media.intent.currentTime = 0), (this.media.intent.paused = false)), \"Playlist Previous (Restart)\");\r\n else if (this.config.content && this.state.currentIndex > 0) this.moveTo(this.state.currentIndex - 1, true, \"Previous\");\r\n }\r\n public next(): void {\r\n if (this.config.content && this.state.currentIndex < this.config.content.length - 1) this.moveTo(this.state.currentIndex + 1, true, \"Next\");\r\n }\r\n\r\n public sort(order: \"asc\" | \"desc\" = this.state.sortOrder === \"asc\" ? \"desc\" : \"asc\", list = this.config.content): void {\r\n if (!list) return;\r\n this.state.sortOrder = order;\r\n const sorted = smartFlatSort(list, (i) => i.media.settings.metadata.title || \"\");\r\n this.config.content = order === \"desc\" ? sorted.reverse() : sorted;\r\n }\r\n public shuffle(list = this.config.content): void {\r\n if (!list) return;\r\n const shuffled = [...list];\r\n for (let i = shuffled.length - 1, j = Math.floor(Math.random() * (i + 1)); i > 0; i--) [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\r\n this.config.content = shuffled;\r\n }\r\n public remove(index: number, list = this.config.content): void {\r\n list?.splice(index, 1), index === this.state.currentIndex && list?.length && this.moveTo(Math.min(index, list.length - 1));\r\n }\r\n\r\n protected syncFeatures(): void {\r\n this.media.features.playlist = !!(this.config.content?.length || this.config.allowOverride.add);\r\n (this.media.features.nextItem = !this.atLast), (this.media.features.previousItem = !this.atFirst);\r\n }\r\n}\r\n\r\ndeclare module \"@defs/registries\" {\r\n interface PlugRegistryMap {\r\n playlist: typeof PlaylistPlug;\r\n }\r\n}\r\n\r\ndeclare module \"@defs/config\" {\r\n interface CtlrConfig {\r\n playlist: PlaylistConfig;\r\n }\r\n}\r\n\r\ndeclare module \"@defs/contract\" {\r\n interface MediaExtraFeatures {\r\n playlist?: boolean;\r\n nextItem?: boolean;\r\n previousItem?: boolean;\r\n }\r\n}\r\n\r\nexport type * from \"./types\";\r\nexport * from \"./build\";\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,SAAS,WAAW,QAAQ,oBAAoB;AAChD,SAAS,SAAS,mBAAmB;AAO9B,IAAM,eAAN,cAA2B,SAAwC;AAAA,EAWxE,YAAY,MAAkB,SAAS,KAAK,OAAO,UAAU;AAC3D,UAAM,MAAM,QAAQ,EAAE,cAAc,GAAG,WAAW,GAAG,WAAW,MAAM,CAAC;AAuCzE,wBAAU,YAAW;AAAA,EAtCrB;AAAA,EATA,IAAW,UAAU;AACnB,WAAO,KAAK,MAAM,gBAAgB;AAAA,EACpC;AAAA,EACA,IAAW,SAAS;AAClB,WAAO,CAAC,KAAK,OAAO,WAAW,KAAK,MAAM,gBAAgB,KAAK,OAAO,QAAQ,SAAS;AAAA,EACzF;AAAA,EAMgB,OAAa;AAE3B,SAAK,MAAM,GAAG,gBAAgB,KAAK,cAAc,EAAE,QAAQ,KAAK,OAAO,CAAC;AACxE,SAAK,MAAM,GAAG,aAAa,CAAC,EAAE,MAAM,MAAO,KAAK,MAAM,UAAU,QAAQ,eAAe,OAAQ,EAAE,MAAM,MAAM,QAAQ,KAAK,OAAO,CAAC;AAElI,SAAK,KAAK,OAAO,IAAI,oBAAoB,CAAC,MAAO,GAAG,SAAS,IAAI,MAAO,EAAE,QAAQ,KAAK,OAAO,CAAC;AAE/F,SAAK,KAAK,OAAO,IAAI,oBAAoB,CAAC,MAAO,IAAK,EAAE,IAAI,CAAC,MAAM,UAAU,gBAAgB,mBAAmB,GAAU,aAAa,CAAC,CAAC,CAAC,IAAY,MAAO,EAAE,MAAM,MAAM,QAAQ,KAAK,OAAO,CAAC;AAEhM,SAAK,MAAM,MAAM,QAAQ,KAAK,cAAc,EAAE,MAAM,MAAM,QAAQ,KAAK,OAAO,CAAC;AAC/E,eAAW,OAAO,CAAC,SAAS,UAAU,WAAW,WAAW,aAAa,EAAY,MAAK,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,WAAW,CAAC,KAAK,aAAa,KAAK,OAAO,QAAQ,KAAK,MAAM,YAAY,EAAE,MAAM,SAAS,SAAS,GAAG,IAAI,IAAW,EAAE,MAAM,KAAK,KAAK,QAAQ,SAAS,QAAQ,QAAQ,KAAK,OAAO,CAAC;AAC1U,eAAW,OAAO,CAAC,SAAS,UAAU,SAAS,EAAY,MAAK,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,WAAW,CAAC,KAAK,aAAa,KAAK,OAAO,QAAQ,KAAK,MAAM,YAAY,EAAE,MAAM,SAAS,SAAS,MAAM,GAAG,IAAI,IAAI,EAAE,MAAM,KAAK,KAAK,QAAQ,SAAS,QAAQ,QAAQ,KAAK,OAAO,CAAC;AACrT,SAAK,MAAM,MAAM,qBAAqB,CAAC,MAAM,KAAK,OAAO,WAAW,CAAC,KAAK,aAAa,KAAK,OAAO,QAAQ,KAAK,MAAM,YAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC;AACrL,SAAK,MAAM,MAAM,mBAAmB,CAAC,MAAM,KAAK,OAAO,WAAW,CAAC,KAAK,aAAa,KAAK,OAAO,QAAQ,KAAK,MAAM,YAAY,EAAE,MAAM,OAAO,WAAW,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC;AAErL,SAAK,KAAK,OAAO,MAAM,uBAAuB,CAAC,MAAM,KAAK,OAAO,WAAW,CAAC,KAAK,aAAa,KAAK,OAAO,QAAQ,KAAK,MAAM,YAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,EAAE,MAAM,KAAK,KAAK,QAAQ,SAAS,QAAQ,QAAQ,KAAK,OAAO,CAAC;AACtO,eAAW,OAAO,CAAC,YAAY,OAAO,EAAY,MAAK,KAAK,OAAO,MAAM,kCAAkC,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,WAAW,CAAC,KAAK,aAAa,KAAK,OAAO,QAAQ,KAAK,MAAM,YAAY,EAAE,SAAS,aAAa,SAAS,GAAG,IAAI,IAAW,EAAE,MAAM,KAAK,KAAK,QAAQ,SAAS,QAAQ,QAAQ,KAAK,OAAO,CAAC;AACjU,SAAK,KAAK,OAAO,GAAG,oBAAoB,KAAK,eAAe,EAAE,QAAQ,KAAK,QAAQ,MAAM,MAAM,OAAO,EAAE,CAAC;AACzG,SAAK,KAAK,OAAO,GAAG,0BAA0B,KAAK,cAAc,EAAE,QAAQ,KAAK,OAAO,CAAC;AAExF,SAAK,KAAK,eAAe,YAAY,EAAE,IAAI,KAAK,UAAU,UAAU,EAAE,OAAO,UAAU,EAAE,CAAC,GAAG,KAAK,KAAK,eAAe,QAAQ,EAAE,IAAI,KAAK,MAAM,UAAU,EAAE,OAAO,UAAU,EAAE,CAAC;AAC/K,UAAM,KAAK;AAAA,EACb;AAAA,EAEU,cAAc,EAAE,eAAe,EAAE,OAAO,QAAQ,EAAE,GAAoD;AAC9G,SAAK,aAAa;AAClB,UAAM,IAAI,SAAS,KAAK,CAACA,OAAOA,GAAE,MAAM,SAAS,SAAS,MAAMA,GAAE,MAAM,SAAS,SAAS,OAAO,KAAK,MAAM,SAAS,SAAS,MAAO,UAAUA,GAAE,MAAM,OAAO,KAAK,KAAK,MAAM,OAAO,GAAG,CAAC;AACzL,SAAK,MAAM,gBAAgB,KAAK,QAAS,QAAQ,CAAC,MAAM;AACxD,UAAM,QAAQ,KAAK,KAAK,KAAK,kBAAkB,GAAG,QAChD,QAAQ,MAAO,IAAI,YAAY,MAAM,KAAK,UAAU,GAAG,KAAK,GAAG,iBAAiB,IAAI,KAAK,OAAO,KAAK,MAAM,YAAY;AACzH,aAAS,CAAC,MAAM,MAAM,WAAW,MAAM,MAAM,MAAM,YAAY,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,MAAM;AAAA,EACzG;AAAA,EAEU,UAAU,MAA0B,SAAS,MAAY;AACjE,IAAC,KAAK,WAAW,MAAO,OAAO,KAAK,UAAU,KAAK,QAAQ,GAAG,OAAO,KAAK,OAAO,KAAK,KAAK,GAAI,KAAK,WAAW;AAAA,EACjH;AAAA,EAGO,OAAO,OAAe,YAAsB,QAAQ,QAAc;AACvE,QAAI,CAAC,KAAK,OAAO,WAAW,CAAC,KAAK,OAAO,QAAQ,KAAK,EAAG;AACzD,SAAK,MAAM,eAAe;AAC1B,gBAAY,OAAO,KAAK,UAAU,KAAK,OAAO,QAAS,KAAK,CAAC,GAAG,OAAO,UAAU,KAAK,QAAQ,MAAO,KAAK,MAAM,OAAO,SAAS,CAAC,UAAW,IAAI,YAAY,KAAK,EAAE;AAAA,EACrK;AAAA,EAEO,WAAiB;AACtB,QAAI,QAAQ,KAAK,MAAM,MAAM,WAAW,KAAK,EAAG,aAAY,OAAQ,KAAK,MAAM,OAAO,cAAc,GAAK,KAAK,MAAM,OAAO,SAAS,QAAS,6BAA6B;AAAA,aACjK,KAAK,OAAO,WAAW,KAAK,MAAM,eAAe,EAAG,MAAK,OAAO,KAAK,MAAM,eAAe,GAAG,MAAM,UAAU;AAAA,EACxH;AAAA,EACO,OAAa;AAClB,QAAI,KAAK,OAAO,WAAW,KAAK,MAAM,eAAe,KAAK,OAAO,QAAQ,SAAS,EAAG,MAAK,OAAO,KAAK,MAAM,eAAe,GAAG,MAAM,MAAM;AAAA,EAC5I;AAAA,EAEO,KAAK,QAAwB,KAAK,MAAM,cAAc,QAAQ,SAAS,OAAO,OAAO,KAAK,OAAO,SAAe;AACrH,QAAI,CAAC,KAAM;AACX,SAAK,MAAM,YAAY;AACvB,UAAM,SAAS,cAAc,MAAM,CAAC,MAAM,EAAE,MAAM,SAAS,SAAS,SAAS,EAAE;AAC/E,SAAK,OAAO,UAAU,UAAU,SAAS,OAAO,QAAQ,IAAI;AAAA,EAC9D;AAAA,EACO,QAAQ,OAAO,KAAK,OAAO,SAAe;AAC/C,QAAI,CAAC,KAAM;AACX,UAAM,WAAW,CAAC,GAAG,IAAI;AACzB,aAAS,IAAI,SAAS,SAAS,GAAG,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAK,EAAC,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC;AAC7I,SAAK,OAAO,UAAU;AAAA,EACxB;AAAA,EACO,OAAO,OAAe,OAAO,KAAK,OAAO,SAAe;AAC7D,UAAM,OAAO,OAAO,CAAC,GAAG,UAAU,KAAK,MAAM,gBAAgB,MAAM,UAAU,KAAK,OAAO,KAAK,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC;AAAA,EAC3H;AAAA,EAEU,eAAqB;AAC7B,SAAK,MAAM,SAAS,WAAW,CAAC,EAAE,KAAK,OAAO,SAAS,UAAU,KAAK,OAAO,cAAc;AAC3F,IAAC,KAAK,MAAM,SAAS,WAAW,CAAC,KAAK,QAAU,KAAK,MAAM,SAAS,eAAe,CAAC,KAAK;AAAA,EAC3F;AACF;AAtFE,cADW,cACY,YAAW;AAClC,cAFW,cAEY,UAAkB;AACzC,cAHW,cAGY,SAAQ;","names":["v"]}
@@ -11,7 +11,7 @@ import {
11
11
  getMimeTypeFromExtension,
12
12
  noExtension,
13
13
  smartFlatSort
14
- } from "./chunk-FI5SPLES.js";
14
+ } from "./chunk-2H6X5VZG.js";
15
15
  import {
16
16
  ANDROID_VERSION,
17
17
  CHROME_VERSION,
@@ -416,4 +416,4 @@ __export(utils_exports, {
416
416
  export {
417
417
  utils_exports
418
418
  };
419
- //# sourceMappingURL=chunk-CWE4QKDK.js.map
419
+ //# sourceMappingURL=chunk-APTMOXNH.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-BUTHKICZ.js";
7
7
  import {
8
8
  getMimeTypeFromExtension
9
- } from "./chunk-FI5SPLES.js";
9
+ } from "./chunk-2H6X5VZG.js";
10
10
  import {
11
11
  ComponentRegistry
12
12
  } from "./chunk-LPASNNCL.js";
@@ -141,4 +141,4 @@ __publicField(CastPlug, "BUILD", CAST_BUILD);
141
141
  export {
142
142
  CastPlug
143
143
  };
144
- //# sourceMappingURL=chunk-GSOXOST7.js.map
144
+ //# sourceMappingURL=chunk-BKFXEFPY.js.map
@@ -23,7 +23,7 @@ import {
23
23
 
24
24
  // src/ts/plugs/settings/auto/index.ts
25
25
  import { silence } from "sia-reactor/modules";
26
- import { capitalize } from "@t007/utils";
26
+ import { capitalize, isSameURL } from "@t007/utils";
27
27
  var AutoPlug = class extends BasePlug {
28
28
  constructor() {
29
29
  super(...arguments);
@@ -53,17 +53,17 @@ var AutoPlug = class extends BasePlug {
53
53
  if (Array.isArray(this.config.play.value) && this.config.play.value.includes(`${p}-window-always`) && this.ctlr.state.mediaIntersecting) this.media.intent.paused = false;
54
54
  }
55
55
  handleNextPreviewUsePoster({ target: { value, object } }) {
56
- if (!this.nextPreview || value && this.nextPreview.poster) return;
56
+ if (!this.nextPreview || value && this.usingPreviewPoster) return;
57
57
  if (object.tease) this.config.next.preview.tease = true;
58
58
  else this.nextPreview.currentTime = object.time;
59
59
  }
60
60
  handleNextPreviewTease({ target: { value, object } }) {
61
61
  if (!this.nextPreview) return;
62
62
  this.nextPreview.ontimeupdate = () => this.nextPreview && Number(this.nextPreview.currentTime) >= object.time && this.nextPreview.pause();
63
- if (value && (!object.usePoster || !this.nextPreview.poster)) this.nextPreview.play();
63
+ if (value && (!object.usePoster || !this.usingPreviewPoster)) this.nextPreview.play();
64
64
  }
65
65
  handleNextPreviewTime({ target: { value, object } }) {
66
- if (!this.nextPreview || object.usePoster && this.nextPreview.poster) return;
66
+ if (!this.nextPreview || object.usePoster && this.usingPreviewPoster) return;
67
67
  this.nextPreview.currentTime = Number(value);
68
68
  }
69
69
  aptAutoplay(auto = this.config.play.value, bool = true, p = this.ctlr.state.mediaParentIntersecting ? "in" : "out") {
@@ -95,9 +95,12 @@ var AutoPlug = class extends BasePlug {
95
95
  const nVP = type === "video" ? this.nextPreview = this.ctlr.queryDOM(".tmg-media-next-preview") : null;
96
96
  if (nVP && m.intent.sources?.length) addSources(m.intent.sources, nVP);
97
97
  for (const e of ["loadedmetadata", "loaded", "durationchange"]) nVP?.addEventListener(e, ({ target: p }) => p.nextElementSibling.textContent = this.ctlr.plug("settings.time")?.toTimeText(p.duration) ?? "-:--", { signal: this.signal });
98
- this.config.next.preview = this.config.next.preview;
98
+ this.config.next.preview.usePoster = this.config.next.preview.usePoster;
99
99
  nVP?.previousElementSibling?.addEventListener("click", () => (cleanUp(true), this.ctlr.plug("playlist")?.next()), { capture: true, signal: this.signal });
100
100
  }
101
+ get usingPreviewPoster() {
102
+ return !!this.nextPreview?.poster && !isSameURL(this.nextPreview.poster, window.TMG_MEDIA_ALT_IMG_SRC);
103
+ }
101
104
  registerMenu() {
102
105
  this.ctlr.plug("settings.settingsView")?.menu.registerFirst(MenuRegistry.get("settings.auto")?.(this));
103
106
  }
@@ -108,4 +111,4 @@ __publicField(AutoPlug, "BUILD", AUTO_BUILD);
108
111
  export {
109
112
  AutoPlug
110
113
  };
111
- //# sourceMappingURL=chunk-T4ABAVTZ.js.map
114
+ //# sourceMappingURL=chunk-CGR2QBUD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ts/plugs/settings/auto/index.ts"],"sourcesContent":["import { BasePlug } from \"../../base\";\r\nimport type { AutoConfig } from \"./types\";\r\nimport { AUTO_BUILD } from \"./build\";\r\nimport { type REvent } from \"sia-reactor\";\r\nimport { CtlrConfig } from \"@defs/config\";\r\nimport { CtlrMedia } from \"@defs/contract\";\r\nimport { clamp, safeNum } from \"@utils/num\";\r\nimport { addSources } from \"@utils/media\";\r\nimport { silence } from \"sia-reactor/modules\";\r\nimport { MenuRegistry } from \"@core/registries\";\r\nimport { AUDIO_EXTENSIONS } from \"@utils/match\";\r\nimport { capitalize, isSameURL } from \"@t007/utils\";\r\nimport { CtlrState } from \"@tools/runtime\";\r\n\r\nexport class AutoPlug extends BasePlug<AutoConfig> {\r\n public static readonly plugName = \"auto\";\r\n public static readonly BUILD = AUTO_BUILD;\r\n protected nextPreview: HTMLVideoElement | null = null;\r\n protected canAutoMovePlaylist = true;\r\n\r\n public override wire(): void {\r\n // Plug Watchers\r\n this.ctlr.plug(\"playlist\")?.state.watch(\"currentIndex\", () => (this.canAutoMovePlaylist = true), { signal: this.signal });\r\n // Ctlr Config Watchers\r\n this.ctlr.config.watch(\"settings.auto.play.value\", (value) => silence(() => (this.media.intent.autoplay = value === true)), { init: \"auto\", signal: this.signal });\r\n // ---- Media Listeners\r\n this.media.on(\"state.currentTime\", this.handleCurrentTimeState, { init: this.ctlr.payload.wired, signal: this.signal });\r\n // ---- State ---------\r\n this.ctlr.state.on(\"mediaParentIntersecting\", this.handleMediaParentIntersecting, { signal: this.signal });\r\n this.ctlr.state.on(\"docVisibilityState\", this.handleDocVisibilityState, { signal: this.signal });\r\n // ---- Config --------\r\n this.ctlr.config.on(\"settings.auto.next.preview.usePoster\", this.handleNextPreviewUsePoster, { signal: this.signal });\r\n this.ctlr.config.on(\"settings.auto.next.preview.tease\", this.handleNextPreviewTease, { signal: this.signal });\r\n this.ctlr.config.on(\"settings.auto.next.preview.time\", this.handleNextPreviewTime, { signal: this.signal });\r\n // Post Wiring\r\n super.wire();\r\n }\r\n\r\n protected handleCurrentTimeState({ value: curr }: REvent<CtlrMedia, \"state.currentTime\">): void {\r\n if (this.media.status.readyState && curr && this.ctlr.payload.wired && Math.floor((this.settings.time.end ?? this.media.status.duration) - curr) <= this.config.next.value / 1000) this.autonextMedia();\r\n }\r\n\r\n protected handleMediaParentIntersecting(): void {\r\n this.aptAutoplay(this.config.pause.value, false), this.aptAutoplay();\r\n }\r\n\r\n protected handleDocVisibilityState({ value }: REvent<CtlrState, \"docVisibilityState\">, p = value === \"visible\" ? (\"in\" as const) : (\"out\" as const)): void {\r\n if (Array.isArray(this.config.pause.value) && this.config.pause.value.includes(`${p}-window-always`)) this.media.intent.paused = true;\r\n if (Array.isArray(this.config.play.value) && this.config.play.value.includes(`${p}-window-always`) && this.ctlr.state.mediaIntersecting) this.media.intent.paused = false;\r\n }\r\n\r\n protected handleNextPreviewUsePoster({ target: { value, object } }: REvent<CtlrConfig, \"settings.auto.next.preview.usePoster\">): void {\r\n if (!this.nextPreview || (value && this.usingPreviewPoster)) return;\r\n if (object.tease) this.config.next.preview.tease = true;\r\n else this.nextPreview.currentTime = object.time;\r\n }\r\n\r\n protected handleNextPreviewTease({ target: { value, object } }: REvent<CtlrConfig, \"settings.auto.next.preview.tease\">): void {\r\n if (!this.nextPreview) return;\r\n this.nextPreview.ontimeupdate = () => this.nextPreview && Number(this.nextPreview.currentTime) >= object.time && this.nextPreview.pause();\r\n if (value && (!object.usePoster || !this.usingPreviewPoster)) this.nextPreview.play();\r\n }\r\n\r\n protected handleNextPreviewTime({ target: { value, object } }: REvent<CtlrConfig, \"settings.auto.next.preview.time\">): void {\r\n if (!this.nextPreview || (object.usePoster && this.usingPreviewPoster)) return;\r\n this.nextPreview.currentTime = Number(value);\r\n }\r\n\r\n protected aptAutoplay(auto = this.config.play.value, bool = true, p = this.ctlr.state.mediaParentIntersecting ? (\"in\" as const) : (\"out\" as const)): void {\r\n if (!Array.isArray(auto)) return;\r\n if (auto.includes(`${p}-view-always`)) this.media.intent.paused = !bool;\r\n else if (auto.includes(`${p}-view`) && this.ctlr.state.readyState < 3) this.media.intent.paused = !bool; // #PATIENT: only before first play\r\n }\r\n\r\n protected autonextMedia(): void {\r\n if (!this.canAutoMovePlaylist || this.media.state.loop || !this.media.status.loadedMetadata || !this.ctlr.config.playlist.content || this.config.next.value < 0 || this.ctlr.plug(\"playlist\")!.state.currentIndex >= this.ctlr.config.playlist.content.length - 1 || this.media.state.paused || this.media.status.waiting) return;\r\n this.canAutoMovePlaylist = false;\r\n const count = clamp(1, Math.round(safeNum(this.settings.time.end ?? this.media.status.duration) - safeNum(this.media.state.currentTime)), this.config.next.value / 1000),\r\n m = this.ctlr.config.playlist.content[this.ctlr.plug(\"playlist\")!.state.currentIndex + 1].media,\r\n type = m.intent.src && AUDIO_EXTENSIONS.test(m.intent.src) ? \"audio\" : \"video\";\r\n const nVTId = this.ctlr.plug(\"settings.toasts\")?.toast?.(\"\", {\r\n autoClose: count * 1000,\r\n hideProgressBar: false,\r\n position: \"bottom-right\",\r\n bodyHTML: `<span title=\"Play next ${type}\" class=\"tmg-media-next-preview-wrapper\">\r\n <button type=\"button\"><svg viewBox=\"0 0 25 25\"><path d=\"M8,5.14V19.14L19,12.14L8,5.14Z\" /></svg></button>\r\n <video class=\"tmg-media-next-preview\" poster=\"${m.intent.poster || m.settings.metadata.artwork?.[0]?.src || window.TMG_MEDIA_ALT_IMG_SRC || \"\"}\" src=\"${m.intent.src || \"\"}\" muted playsinline webkit-playsinline preload=\"metadata\"></video>\r\n <p>${this.ctlr.plug(\"settings.time\")?.toTimeText(NaN) ?? \"0:00\"}</p>\r\n </span>\r\n <span class=\"tmg-media-next-info\"><h2>Next ${capitalize(type)} in <span class=\"tmg-media-next-countdown\">${count}</span></h2>${m.settings.metadata.title ? `<p class=\"tmg-media-next-title\">${m.settings.metadata.title}</p>` : \"\"}</span>`,\r\n onTimeUpdate: (time: number, el = this.ctlr.queryDOM(\".tmg-media-next-countdown\")) => el && (el.textContent = String(Math.round((count * 1000 - time) / 1000) || 1)),\r\n onClose: (elapsed?: boolean) => void (removeListeners(), elapsed && this.ctlr.plug(\"playlist\")?.next()),\r\n tag: \"tmg-anvi\",\r\n signal: this.signal,\r\n });\r\n const cleanUp = (permanent = false) => (nVTId && t007.toast?.dismiss(nVTId, \"instant\"), (this.nextPreview = null), (this.canAutoMovePlaylist = !permanent)),\r\n strictCleanUp = () => !this.media.status.ended && cleanUp(),\r\n autoCleanUp = () => Math.floor(safeNum((this.settings.time.end ?? this.media.status.duration) - this.media.state.currentTime)) > this.config.next.value / 1000 && cleanUp(),\r\n removeListeners = () => this.autonextPaths.forEach((e) => this.media.off(e, e === this.autonextPaths[0] ? autoCleanUp : strictCleanUp));\r\n for (const e of this.autonextPaths) this.media.on(e, e === this.autonextPaths[0] ? autoCleanUp : strictCleanUp, { signal: this.signal });\r\n const nVP = type === \"video\" ? (this.nextPreview = this.ctlr.queryDOM<HTMLVideoElement>(\".tmg-media-next-preview\"))! : null;\r\n if (nVP && m.intent.sources?.length) addSources(m.intent.sources, nVP);\r\n for (const e of [\"loadedmetadata\", \"loaded\", \"durationchange\"] as const) nVP?.addEventListener(e, ({ target: p }) => ((p as HTMLVideoElement).nextElementSibling!.textContent = this.ctlr.plug(\"settings.time\")?.toTimeText((p as HTMLVideoElement).duration) ?? \"-:--\"), { signal: this.signal });\r\n this.config.next.preview.usePoster = this.config.next.preview.usePoster; // force update\r\n nVP?.previousElementSibling?.addEventListener(\"click\", () => (cleanUp(true), this.ctlr.plug(\"playlist\")?.next()), { capture: true, signal: this.signal });\r\n }\r\n private autonextPaths = [\"state.currentTime\", \"state.paused\", \"status.waiting\"] as const;\r\n private get usingPreviewPoster(): boolean {\r\n return !!this.nextPreview?.poster && !isSameURL(this.nextPreview.poster, window.TMG_MEDIA_ALT_IMG_SRC);\r\n }\r\n\r\n protected override registerMenu(): void {\r\n this.ctlr.plug(\"settings.settingsView\")?.menu.registerFirst(MenuRegistry.get(\"settings.auto\")?.(this));\r\n }\r\n}\r\n\r\nexport type * from \"./types\";\r\nexport * from \"./build\";\r\n\r\ndeclare module \"@defs/registries\" {\r\n interface PlugRegistryMap {\r\n \"settings.auto\": typeof AutoPlug;\r\n }\r\n}\r\n\r\ndeclare module \"@defs/config\" {\r\n interface Settings {\r\n auto: AutoConfig;\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -8,7 +8,6 @@ import {
8
8
  // src/ts/init.ts
9
9
  if ("undefined" !== typeof window) {
10
10
  window.tmg ?? (window.tmg = {});
11
- window.TMG_MEDIA_ALT_IMG_SRC ?? (window.TMG_MEDIA_ALT_IMG_SRC = "https://cdn.jsdelivr.net/npm/tmg-media-player/assets/movie-tape.png");
12
11
  window.TMG_MEDIA_CSS_SRC ?? (window.TMG_MEDIA_CSS_SRC = "https://cdn.jsdelivr.net/npm/tmg-media-player@latest/dist/index.min.css");
13
12
  window.TMG_SHAKA_JS_SRC ?? (window.TMG_SHAKA_JS_SRC = "https://cdn.jsdelivr.net/npm/shaka-player/dist/shaka-player.compiled.js");
14
13
  window.TMG_HLS_JS_SRC ?? (window.TMG_HLS_JS_SRC = "https://cdn.jsdelivr.net/npm/hls.js@1/dist/hls.min.js");
@@ -16,10 +15,11 @@ if ("undefined" !== typeof window) {
16
15
  window.TMG_YT_API_SRC ?? (window.TMG_YT_API_SRC = "https://www.youtube.com/iframe_api");
17
16
  window.TMG_VIMEO_API_SRC ?? (window.TMG_VIMEO_API_SRC = "https://player.vimeo.com/api/player.js");
18
17
  window.TMG_CAST_SENDER_SRC ?? (window.TMG_CAST_SENDER_SRC = "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1");
18
+ window.TMG_MEDIA_ALT_IMG_SRC ?? (window.TMG_MEDIA_ALT_IMG_SRC = "https://cdn.jsdelivr.net/npm/tmg-media-player@latest/dist/assets/icons/movie-tape.png");
19
19
  init(), loadResource(window.TMG_MEDIA_CSS_SRC), loadResource(window.T007_TOAST_JS_SRC, "script"), loadResource(window.T007_INPUT_JS_SRC, "script"), loadResource(window.T007_DIALOG_JS_SRC, "script");
20
20
  console.log("%cTMG Media Player Available", "color: darkturquoise");
21
21
  } else {
22
22
  console.log("\x1B[38;2;139;69;19mTMG Media Player Unavailable\x1B[0m");
23
23
  console.error("TMG Media Player cannot run in a terminal!"), console.warn("Consider moving to a browser environment to use the TMG Media Player");
24
24
  }
25
- //# sourceMappingURL=chunk-7W4SABYP.js.map
25
+ //# sourceMappingURL=chunk-DDFE4KEG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ts/init.ts"],"sourcesContent":["import \"./types/global.d.ts\"; // bundler handles the stylesheet side effect\r\nimport { init } from \"./tools/runtime\";\r\nimport { loadResource } from \"./utils/dom\";\r\n\r\nif (\"undefined\" !== typeof window) {\r\n window.tmg ??= {} as any; // bundler will handle the rest\r\n window.TMG_MEDIA_CSS_SRC ??= \"https://cdn.jsdelivr.net/npm/tmg-media-player@latest/dist/index.min.css\";\r\n window.TMG_SHAKA_JS_SRC ??= \"https://cdn.jsdelivr.net/npm/shaka-player/dist/shaka-player.compiled.js\";\r\n window.TMG_HLS_JS_SRC ??= \"https://cdn.jsdelivr.net/npm/hls.js@1/dist/hls.min.js\";\r\n window.TMG_DASH_JS_SRC ??= \"https://cdn.jsdelivr.net/npm/dashjs@4/dist/dash.all.min.js\";\r\n window.TMG_YT_API_SRC ??= \"https://www.youtube.com/iframe_api\";\r\n window.TMG_VIMEO_API_SRC ??= \"https://player.vimeo.com/api/player.js\";\r\n window.TMG_CAST_SENDER_SRC ??= \"https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1\";\r\n window.TMG_MEDIA_ALT_IMG_SRC ??= \"https://cdn.jsdelivr.net/npm/tmg-media-player@latest/dist/assets/icons/movie-tape.png\";\r\n init(), loadResource(window.TMG_MEDIA_CSS_SRC), loadResource(window.T007_TOAST_JS_SRC!, \"script\"), loadResource(window.T007_INPUT_JS_SRC!, \"script\"), loadResource(window.T007_DIALOG_JS_SRC!, \"script\");\r\n console.log(\"%cTMG Media Player Available\", \"color: darkturquoise\");\r\n} else {\r\n console.log(\"\\x1b[38;2;139;69;19mTMG Media Player Unavailable\\x1b[0m\");\r\n console.error(\"TMG Media Player cannot run in a terminal!\"), console.warn(\"Consider moving to a browser environment to use the TMG Media Player\");\r\n}\r\n"],"mappings":";;;;;;;;AAIA,IAAI,gBAAgB,OAAO,QAAQ;AACjC,SAAO,QAAP,OAAO,MAAQ,CAAC;AAChB,SAAO,sBAAP,OAAO,oBAAsB;AAC7B,SAAO,qBAAP,OAAO,mBAAqB;AAC5B,SAAO,mBAAP,OAAO,iBAAmB;AAC1B,SAAO,oBAAP,OAAO,kBAAoB;AAC3B,SAAO,mBAAP,OAAO,iBAAmB;AAC1B,SAAO,sBAAP,OAAO,oBAAsB;AAC7B,SAAO,wBAAP,OAAO,sBAAwB;AAC/B,SAAO,0BAAP,OAAO,wBAA0B;AACjC,OAAK,GAAG,aAAa,OAAO,iBAAiB,GAAG,aAAa,OAAO,mBAAoB,QAAQ,GAAG,aAAa,OAAO,mBAAoB,QAAQ,GAAG,aAAa,OAAO,oBAAqB,QAAQ;AACvM,UAAQ,IAAI,gCAAgC,sBAAsB;AACpE,OAAO;AACL,UAAQ,IAAI,yDAAyD;AACrE,UAAQ,MAAM,4CAA4C,GAAG,QAAQ,KAAK,sEAAsE;AAClJ;","names":[]}
@@ -1,21 +1,3 @@
1
- import {
2
- TouchTimelineNotifier
3
- } from "./chunk-AEP5HJTD.js";
4
- import {
5
- TouchVolumeNotifier
6
- } from "./chunk-E2N7MRFO.js";
7
- import {
8
- VolumeNotifier
9
- } from "./chunk-W62D57H6.js";
10
- import {
11
- FwdBwdNotifier
12
- } from "./chunk-RDAPNHMM.js";
13
- import {
14
- ObjectFitNotifier
15
- } from "./chunk-W6ZMMBY3.js";
16
- import {
17
- PlaybackRateNotifier
18
- } from "./chunk-FTG7BDND.js";
19
1
  import {
20
2
  PlayPauseNotifier
21
3
  } from "./chunk-SMURNKQZ.js";
@@ -29,11 +11,14 @@ import {
29
11
  TouchBrightnessNotifier
30
12
  } from "./chunk-UKG5RUA3.js";
31
13
  import {
32
- BrightnessNotifier
33
- } from "./chunk-APS5SUUK.js";
14
+ TouchTimelineNotifier
15
+ } from "./chunk-AEP5HJTD.js";
34
16
  import {
35
- CancelScrubNotifier
36
- } from "./chunk-NKIBSEUG.js";
17
+ TouchVolumeNotifier
18
+ } from "./chunk-E2N7MRFO.js";
19
+ import {
20
+ VolumeNotifier
21
+ } from "./chunk-W62D57H6.js";
37
22
  import {
38
23
  CaptionsNotifier
39
24
  } from "./chunk-VF5SUWPG.js";
@@ -49,6 +34,15 @@ import {
49
34
  import {
50
35
  FastPlayNotifier
51
36
  } from "./chunk-H4VKNFSA.js";
37
+ import {
38
+ FwdBwdNotifier
39
+ } from "./chunk-RDAPNHMM.js";
40
+ import {
41
+ ObjectFitNotifier
42
+ } from "./chunk-W6ZMMBY3.js";
43
+ import {
44
+ PlaybackRateNotifier
45
+ } from "./chunk-FTG7BDND.js";
52
46
  import {
53
47
  volumehigh
54
48
  } from "./chunk-JRWYWTTT.js";
@@ -61,6 +55,12 @@ import {
61
55
  import {
62
56
  AirPlayNotifier
63
57
  } from "./chunk-MDEH7YMI.js";
58
+ import {
59
+ BrightnessNotifier
60
+ } from "./chunk-APS5SUUK.js";
61
+ import {
62
+ CancelScrubNotifier
63
+ } from "./chunk-NKIBSEUG.js";
64
64
  import {
65
65
  BaseNotifier
66
66
  } from "./chunk-254AE7UJ.js";
@@ -218,26 +218,17 @@ import {
218
218
  add
219
219
  } from "./chunk-ID72UAJE.js";
220
220
  import {
221
- Timeline
222
- } from "./chunk-6AFKS7SE.js";
221
+ BrightnessControl
222
+ } from "./chunk-DU4OZCVE.js";
223
223
  import {
224
224
  VolumeControl
225
225
  } from "./chunk-ZAMGOESA.js";
226
226
  import {
227
- BrightnessControl
228
- } from "./chunk-DU4OZCVE.js";
227
+ Timeline
228
+ } from "./chunk-6AFKS7SE.js";
229
229
  import {
230
230
  RangeInput
231
231
  } from "./chunk-AQMEXSBY.js";
232
- import {
233
- RemoveMiniplayerButton
234
- } from "./chunk-BGHTG5PC.js";
235
- import {
236
- SettingsButton
237
- } from "./chunk-QSQ3MYN3.js";
238
- import {
239
- TheaterButton
240
- } from "./chunk-XP6LM2B7.js";
241
232
  import {
242
233
  TimeButton
243
234
  } from "./chunk-2QSACBJ3.js";
@@ -245,14 +236,14 @@ import {
245
236
  TimeAndDurationButton
246
237
  } from "./chunk-ORXXCDRO.js";
247
238
  import {
248
- FullscreenLockButton
249
- } from "./chunk-3SG7NEMG.js";
239
+ AirPlayPlaceholder
240
+ } from "./chunk-BD5DVRTH.js";
250
241
  import {
251
- FullscreenOrientationButton
252
- } from "./chunk-TPA6MG7H.js";
242
+ CastPlaceholder
243
+ } from "./chunk-SCDBAXRE.js";
253
244
  import {
254
- Meta
255
- } from "./chunk-BYENKVXX.js";
245
+ PiPPlaceholder
246
+ } from "./chunk-HAHMA6KJ.js";
256
247
  import {
257
248
  NextButton
258
249
  } from "./chunk-X4ANPN2X.js";
@@ -269,14 +260,14 @@ import {
269
260
  PreviousButton
270
261
  } from "./chunk-Z3472QRR.js";
271
262
  import {
272
- CaptionsButton
273
- } from "./chunk-3ORZUFBV.js";
263
+ RemoveMiniplayerButton
264
+ } from "./chunk-BGHTG5PC.js";
274
265
  import {
275
- CaptureButton
276
- } from "./chunk-OTKQMNBH.js";
266
+ SettingsButton
267
+ } from "./chunk-QSQ3MYN3.js";
277
268
  import {
278
- CastButton
279
- } from "./chunk-Q5D7TB6T.js";
269
+ TheaterButton
270
+ } from "./chunk-XP6LM2B7.js";
280
271
  import {
281
272
  ChapterButton
282
273
  } from "./chunk-NM254BRR.js";
@@ -293,14 +284,14 @@ import {
293
284
  FullscreenButton
294
285
  } from "./chunk-FEXBUKCU.js";
295
286
  import {
296
- AirPlayPlaceholder
297
- } from "./chunk-BD5DVRTH.js";
287
+ FullscreenLockButton
288
+ } from "./chunk-3SG7NEMG.js";
298
289
  import {
299
- CastPlaceholder
300
- } from "./chunk-SCDBAXRE.js";
290
+ FullscreenOrientationButton
291
+ } from "./chunk-TPA6MG7H.js";
301
292
  import {
302
- PiPPlaceholder
303
- } from "./chunk-HAHMA6KJ.js";
293
+ Meta
294
+ } from "./chunk-BYENKVXX.js";
304
295
  import {
305
296
  AirPlayButton
306
297
  } from "./chunk-PU4VNV5O.js";
@@ -316,6 +307,15 @@ import {
316
307
  import {
317
308
  BigPreviousButton
318
309
  } from "./chunk-EDLECZEJ.js";
310
+ import {
311
+ CaptionsButton
312
+ } from "./chunk-3ORZUFBV.js";
313
+ import {
314
+ CaptureButton
315
+ } from "./chunk-OTKQMNBH.js";
316
+ import {
317
+ CastButton
318
+ } from "./chunk-Q5D7TB6T.js";
319
319
  import {
320
320
  Buffer
321
321
  } from "./chunk-VOBM2BKO.js";
@@ -468,4 +468,4 @@ __export(components_exports, {
468
468
  export {
469
469
  components_exports
470
470
  };
471
- //# sourceMappingURL=chunk-4MF2SLIL.js.map
471
+ //# sourceMappingURL=chunk-IS4FCH6B.js.map
@@ -34,7 +34,7 @@ var getMainPlaylistMenu = (plug) => ({
34
34
  if (await t007.confirm?.(`Delete "${itemTitle}" from your playlist? This cannot be undone.`, { id: `${plug.ctlr.config.id}-playlist-del-confirm`, rootElement: plug.ctlr.plug("settings.settingsView")?.menu?.element ?? plug.media.container, confirmText: "Delete" })) plug.remove(idx);
35
35
  },
36
36
  onEdit: (idx) => plug.config.allowOverride.edit ? (plug.state.editIndex = idx, plug.ctlr.plug("settings.settingsView")?.menu?.goTo("playlist-edit")) : void 0,
37
- getTipHTML: () => plug.config.allowOverride.move ? "You can drag to reorder items" : "",
37
+ getTipHTML: () => plug.config.allowOverride.move ? "You can drag items to reorder your playlist" : "",
38
38
  actions: [...plug.config.allowOverride.move ? [{ id: "sort", getLabel: () => "Sort", icon: "sort", onClick: plug.sort }, { id: "shuffle", getLabel: () => "Shuffle", icon: "shuffle", onClick: plug.shuffle }] : [], ...plug.config.allowOverride.add ? [{ id: "add", getLabel: () => "Add", icon: "add", onClick: () => plug.ctlr.plug("settings.settingsView")?.menu?.goTo("playlist-add") }] : []],
39
39
  items: [
40
40
  {
@@ -68,4 +68,4 @@ var getMainPlaylistMenu = (plug) => ({
68
68
  export {
69
69
  getMainPlaylistMenu
70
70
  };
71
- //# sourceMappingURL=chunk-UIK25CH6.js.map
71
+ //# sourceMappingURL=chunk-K22NHK7L.js.map