tmg-media-player 0.0.40 → 0.0.42

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 (179) hide show
  1. package/dist/{chunk-HCTNCCPR.js → chunk-23BYW5JE.js} +5 -5
  2. package/dist/chunk-23BYW5JE.js.map +1 -0
  3. package/dist/{chunk-TJMGAIJ2.js → chunk-3JYTCSCR.js} +42 -42
  4. package/dist/{chunk-VIJEMQ77.js → chunk-6WK4XXTL.js} +4 -4
  5. package/dist/{chunk-E5PBQLV3.js → chunk-JLUX5NZJ.js} +55 -55
  6. package/dist/{chunk-WA5VZIDC.js → chunk-LQSU7JDG.js} +5 -5
  7. package/dist/{chunk-XV33TV7K.js → chunk-O6VCD64X.js} +27 -27
  8. package/dist/{chunk-R4CYVZ7J.js → chunk-SGQJYALA.js} +15 -15
  9. package/dist/{chunk-ZRJ47BPK.js → chunk-U4STCHIM.js} +4 -4
  10. package/dist/{chunk-D7Y72JWH.js → chunk-U6XDI2FQ.js} +2 -2
  11. package/dist/{chunk-D7Y72JWH.js.map → chunk-U6XDI2FQ.js.map} +1 -1
  12. package/dist/{chunk-OSSQUF2N.js → chunk-WE2IT3XO.js} +103 -103
  13. package/dist/{chunk-URYM5WYF.js → chunk-X24LFSYJ.js} +3 -3
  14. package/dist/chunk-X24LFSYJ.js.map +1 -0
  15. package/dist/{chunk-PD72HDH4.js → chunk-XN5CVECC.js} +94 -94
  16. package/dist/{chunk-SFNWCR4G.js → chunk-YXUIPCGS.js} +37 -37
  17. package/dist/components/controls/airplay.js +1 -1
  18. package/dist/components/controls/backward10.js +1 -1
  19. package/dist/components/controls/bigNext.js +1 -1
  20. package/dist/components/controls/bigPlayPause.js +1 -1
  21. package/dist/components/controls/bigPrevious.js +1 -1
  22. package/dist/components/controls/brightness/index.js +1 -1
  23. package/dist/components/controls/captions.js +1 -1
  24. package/dist/components/controls/capture.js +1 -1
  25. package/dist/components/controls/cast.js +1 -1
  26. package/dist/components/controls/expandMiniplayer.js +1 -1
  27. package/dist/components/controls/forward10.js +1 -1
  28. package/dist/components/controls/fullscreen.js +1 -1
  29. package/dist/components/controls/fullscreenLock.js +1 -1
  30. package/dist/components/controls/fullscreenOrientation.js +1 -1
  31. package/dist/components/controls/next.js +1 -1
  32. package/dist/components/controls/objectFit.js +1 -1
  33. package/dist/components/controls/pictureInPicture.js +1 -1
  34. package/dist/components/controls/playPause.js +1 -1
  35. package/dist/components/controls/previous.js +1 -1
  36. package/dist/components/controls/removeMiniplayer.js +1 -1
  37. package/dist/components/controls/settings.js +1 -1
  38. package/dist/components/controls/theater.js +1 -1
  39. package/dist/components/controls/timeline/index.js +1 -1
  40. package/dist/components/controls/voice.js +1 -1
  41. package/dist/components/controls/volume/index.js +1 -1
  42. package/dist/components/holders/airplayPlaceholder.js +1 -1
  43. package/dist/components/holders/castPlaceholder.js +1 -1
  44. package/dist/components/holders/errorPlaceholder.js +1 -1
  45. package/dist/components/holders/pipPlaceholder.js +1 -1
  46. package/dist/components/icons/z-register.js +25 -25
  47. package/dist/components/notifiers/airplay.js +1 -1
  48. package/dist/components/notifiers/brightness.js +1 -1
  49. package/dist/components/notifiers/captions.js +1 -1
  50. package/dist/components/notifiers/capture.js +1 -1
  51. package/dist/components/notifiers/cast.js +1 -1
  52. package/dist/components/notifiers/fastPlay.js +1 -1
  53. package/dist/components/notifiers/fwdBwd.js +1 -1
  54. package/dist/components/notifiers/objectFit.js +1 -1
  55. package/dist/components/notifiers/playPause.js +1 -1
  56. package/dist/components/notifiers/playbackRate.js +1 -1
  57. package/dist/components/notifiers/prevNext.js +1 -1
  58. package/dist/components/notifiers/scrub.js +1 -1
  59. package/dist/components/notifiers/touchBrightness.js +1 -1
  60. package/dist/components/notifiers/touchVolume.js +1 -1
  61. package/dist/components/notifiers/volume.js +1 -1
  62. package/dist/components/notifiers/z-register.js +7 -7
  63. package/dist/components/screenLock.js +1 -1
  64. package/dist/components/z-register.js +17 -17
  65. package/dist/core/controller.js +1 -1
  66. package/dist/index.js +1 -1
  67. package/dist/init.js +1 -1
  68. package/dist/plugs/base/index.js +1 -1
  69. package/dist/plugs/base/slider.js +1 -1
  70. package/dist/plugs/main/ads/index.js +1 -1
  71. package/dist/plugs/main/disabled/index.js +1 -1
  72. package/dist/plugs/main/light/index.js +1 -1
  73. package/dist/plugs/main/playlist/index.js +1 -1
  74. package/dist/plugs/main/skeleton/index.js +1 -1
  75. package/dist/plugs/menus/main/actions.js +1 -1
  76. package/dist/plugs/menus/settings/auto.js +1 -1
  77. package/dist/plugs/menus/settings/frame.js +1 -1
  78. package/dist/plugs/menus/settings/keys.js +1 -1
  79. package/dist/plugs/menus/settings/modes.js +1 -1
  80. package/dist/plugs/menus/settings/sleepTimer.js +1 -1
  81. package/dist/plugs/menus/settings/toasts.js +1 -1
  82. package/dist/plugs/menus/settings/voice.js +1 -1
  83. package/dist/plugs/menus/z-register.js +14 -14
  84. package/dist/plugs/settings/ambience/index.js +1 -1
  85. package/dist/plugs/settings/auto/index.js +1 -1
  86. package/dist/plugs/settings/brightness/index.js +1 -1
  87. package/dist/plugs/settings/captions/index.js +1 -1
  88. package/dist/plugs/settings/controlPanel/draggable.js +1 -1
  89. package/dist/plugs/settings/controlPanel/index.js +1 -1
  90. package/dist/plugs/settings/css/index.cjs +4 -4
  91. package/dist/plugs/settings/css/index.cjs.map +1 -1
  92. package/dist/plugs/settings/css/index.js +2 -2
  93. package/dist/plugs/settings/errors/index.js +1 -1
  94. package/dist/plugs/settings/fastPlay/index.js +1 -1
  95. package/dist/plugs/settings/frame/index.cjs +1 -1
  96. package/dist/plugs/settings/frame/index.cjs.map +1 -1
  97. package/dist/plugs/settings/frame/index.js +2 -2
  98. package/dist/plugs/settings/gesture/base.js +1 -1
  99. package/dist/plugs/settings/gesture/index.js +1 -1
  100. package/dist/plugs/settings/gesture/touch.js +1 -1
  101. package/dist/plugs/settings/gesture/wheel.js +1 -1
  102. package/dist/plugs/settings/keys/index.js +1 -1
  103. package/dist/plugs/settings/locked/index.js +1 -1
  104. package/dist/plugs/settings/metadata/index.js +1 -1
  105. package/dist/plugs/settings/modes/airplay.js +1 -1
  106. package/dist/plugs/settings/modes/cast.js +1 -1
  107. package/dist/plugs/settings/modes/fullscreen.js +1 -1
  108. package/dist/plugs/settings/modes/index.js +1 -1
  109. package/dist/plugs/settings/modes/miniplayer.js +1 -1
  110. package/dist/plugs/settings/modes/pictureInPicture.js +1 -1
  111. package/dist/plugs/settings/modes/theater.js +1 -1
  112. package/dist/plugs/settings/notifiers/index.js +1 -1
  113. package/dist/plugs/settings/objectFit/index.js +1 -1
  114. package/dist/plugs/settings/overlay/index.js +1 -1
  115. package/dist/plugs/settings/panel/index.cjs +2 -2
  116. package/dist/plugs/settings/panel/index.cjs.map +1 -1
  117. package/dist/plugs/settings/panel/index.js +2 -2
  118. package/dist/plugs/settings/panel/menu/index.js +1 -1
  119. package/dist/plugs/settings/panel/menu/panel/main.js +1 -1
  120. package/dist/plugs/settings/panel/menu/panel/sub.js +1 -1
  121. package/dist/plugs/settings/panel/menu/widgets/base.js +1 -1
  122. package/dist/plugs/settings/panel/menu/widgets/button.js +1 -1
  123. package/dist/plugs/settings/panel/menu/widgets/color.js +1 -1
  124. package/dist/plugs/settings/panel/menu/widgets/dragselect.js +1 -1
  125. package/dist/plugs/settings/panel/menu/widgets/group.js +1 -1
  126. package/dist/plugs/settings/panel/menu/widgets/index.js +1 -1
  127. package/dist/plugs/settings/panel/menu/widgets/input.js +1 -1
  128. package/dist/plugs/settings/panel/menu/widgets/limits.js +1 -1
  129. package/dist/plugs/settings/panel/menu/widgets/range.js +1 -1
  130. package/dist/plugs/settings/panel/menu/widgets/select.js +1 -1
  131. package/dist/plugs/settings/panel/menu/widgets/toggle.js +1 -1
  132. package/dist/plugs/settings/persist/index.js +1 -1
  133. package/dist/plugs/settings/playbackRate/index.js +1 -1
  134. package/dist/plugs/settings/poster/index.js +1 -1
  135. package/dist/plugs/settings/sleepTimer/index.js +2 -2
  136. package/dist/plugs/settings/time/index.js +1 -1
  137. package/dist/plugs/settings/timeTravel/index.js +1 -1
  138. package/dist/plugs/settings/toasts/index.js +1 -1
  139. package/dist/plugs/settings/voice/index.js +1 -1
  140. package/dist/plugs/settings/volume/index.js +1 -1
  141. package/dist/plugs/z-register.cjs +7 -7
  142. package/dist/plugs/z-register.cjs.map +1 -1
  143. package/dist/plugs/z-register.js +35 -35
  144. package/dist/super/components/icons.js +55 -55
  145. package/dist/super/components/index.js +110 -110
  146. package/dist/super/components/notifiers.js +16 -16
  147. package/dist/super/consts.js +5 -5
  148. package/dist/super/plugs/index.cjs +7 -7
  149. package/dist/super/plugs/index.cjs.map +1 -1
  150. package/dist/super/plugs/index.js +108 -108
  151. package/dist/super/plugs/menus.js +31 -31
  152. package/dist/super/techs.js +6 -6
  153. package/dist/super.cjs +7 -7
  154. package/dist/super.cjs.map +1 -1
  155. package/dist/super.global.js +7 -7
  156. package/dist/super.global.js.map +1 -1
  157. package/dist/super.js +106 -106
  158. package/dist/techs/dash.js +1 -1
  159. package/dist/techs/hls.js +1 -1
  160. package/dist/techs/html5.js +1 -1
  161. package/dist/techs/ima.js +1 -1
  162. package/dist/techs/shaka.js +1 -1
  163. package/dist/techs/youtube.js +1 -1
  164. package/dist/techs/z-register.js +3 -3
  165. package/dist/tools/player.js +1 -1
  166. package/dist/tools/runtime/index.js +1 -1
  167. package/package.json +1 -1
  168. package/dist/chunk-HCTNCCPR.js.map +0 -1
  169. package/dist/chunk-URYM5WYF.js.map +0 -1
  170. /package/dist/{chunk-TJMGAIJ2.js.map → chunk-3JYTCSCR.js.map} +0 -0
  171. /package/dist/{chunk-VIJEMQ77.js.map → chunk-6WK4XXTL.js.map} +0 -0
  172. /package/dist/{chunk-E5PBQLV3.js.map → chunk-JLUX5NZJ.js.map} +0 -0
  173. /package/dist/{chunk-WA5VZIDC.js.map → chunk-LQSU7JDG.js.map} +0 -0
  174. /package/dist/{chunk-XV33TV7K.js.map → chunk-O6VCD64X.js.map} +0 -0
  175. /package/dist/{chunk-R4CYVZ7J.js.map → chunk-SGQJYALA.js.map} +0 -0
  176. /package/dist/{chunk-ZRJ47BPK.js.map → chunk-U4STCHIM.js.map} +0 -0
  177. /package/dist/{chunk-OSSQUF2N.js.map → chunk-WE2IT3XO.js.map} +0 -0
  178. /package/dist/{chunk-PD72HDH4.js.map → chunk-XN5CVECC.js.map} +0 -0
  179. /package/dist/{chunk-SFNWCR4G.js.map → chunk-YXUIPCGS.js.map} +0 -0
@@ -37,10 +37,10 @@ var CSSPlug = class extends BasePlug {
37
37
  for (const [k, v] of entries) k !== "syncWithMedia" && ((_a = this.build)[k] ?? (_a[k] = this.ctlr.build.settings.css[k]), this.set(k, v));
38
38
  super.wire();
39
39
  }
40
- async handleLoadedMetadataStatus({ value }) {
41
- if (!value) return;
42
- const color = await this.ctlr.plug("settings.frame")?.getMainColor();
43
- for (const k of Object.keys(this.settings.css.syncWithMedia)) if (this.settings.css.syncWithMedia[k]) this.settings.css[k] = String(color ?? this.build[k]);
40
+ async handleLoadedMetadataStatus({ value }, keys = Object.keys(this.settings.css.syncWithMedia)) {
41
+ if (!value || !keys.some((k) => this.settings.css.syncWithMedia[k])) return;
42
+ const color = await this.ctlr.plug("settings.frame")?.getMainColor(void 0, this.media.features.frameCapture ? "" : void 0);
43
+ for (const k of keys) if (this.settings.css.syncWithMedia[k]) this.settings.css[k] = String(color ?? this.build[k]);
44
44
  }
45
45
  getCSSKey(key) {
46
46
  return { isClass: this.classList.includes(key), id: `tmg-media-${uncamelize(key, "-")}` };
@@ -79,4 +79,4 @@ var banRgx = /\.(?:(constructor|syncWithMedia))/;
79
79
  export {
80
80
  CSSPlug
81
81
  };
82
- //# sourceMappingURL=chunk-HCTNCCPR.js.map
82
+ //# sourceMappingURL=chunk-23BYW5JE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ts/plugs/settings/css/index.ts"],"sourcesContent":["import { BasePlug } from \"../../base\";\r\nimport type { CssConfig } from \"./types\";\r\nimport { CSS_BUILD } from \"./build\";\r\nimport type { CtlrMedia } from \"@defs/contract\";\r\nimport type { REvent } from \"sia-reactor\";\r\nimport { camelize, capitalize, uncamelize } from \"@utils/str\";\r\n\r\nexport class CSSPlug extends BasePlug<CssConfig> {\r\n public static readonly plugName = \"css\";\r\n public static readonly BUILD = CSS_BUILD;\r\n public classList: string[] = [\"captionsCharacterEdgeStyle\"]; // #DEFAULT: build privilege\r\n public build: Record<string, string | number | undefined> = {};\r\n\r\n public override wire(): void {\r\n // Variables Assignment\r\n const entries = Object.entries(this.config);\r\n this.settings.css.altImgUrl = `url(${window.TMG_MEDIA_ALT_IMG_SRC})`;\r\n // Blackbox Handlers\r\n this.ctlr.config.get(\"*\", (val, { target: { key, path } }: any) => val ?? (!path.startsWith(\"settings.css.\") || banRgx.test(path) ? val : (this.build[key] ??= this.get(key))), { signal: this.signal }); // #BLACKBOX: immediacy requirement\r\n this.ctlr.config.watch(\"*\", (val, { target: { key, path } }: any) => path.startsWith(\"settings.css.\") && !banRgx.test(path) && this.set(key, val), { signal: this.signal }); // #BLACKBOX: immediacy requirement\r\n // ---- Media Watchers\r\n for (const p of [\"videoWidth\", \"videoHeight\"] as const) this.media.watch(`status.${p}`, this.syncAspectRatio, { init: p === \"videoWidth\", signal: this.signal });\r\n // ---- State --------\r\n ([\"container.width\", \"container.height\", \"object.width\", \"object.height\", \"object.top\", \"object.left\", \"poster.width\", \"poster.height\", \"poster.top\", \"poster.left\"] as const).forEach((p, _, __, camped = capitalize(camelize(p, /\\./))) => this.ctlr.state.watch(`dimensions.${p}`, (v) => (this.config[`current${camped}`] = `${v || 0}px`), { init: true, signal: this.signal }));\r\n // ---- Media Listeners\r\n this.media.on(\"status.loadedMetadata\", this.handleLoadedMetadataStatus, { init: this.ctlr.flags.wired, signal: this.signal });\r\n // ---- State ----------\r\n for (const k of [\"container\", \"pseudoContainer\"] as const) this.ctlr.state.on(`dimensions.${k}.tier`, ({ value: tier }) => (this.media[k].dataset.sizeTier = tier || \"\"), { init: true, signal: this.signal });\r\n // Post Wiring\r\n for (const [k, v] of entries) k !== \"syncWithMedia\" && ((this.build[k] ??= this.ctlr.build.settings.css[k]), this.set(k, v));\r\n super.wire();\r\n }\r\n\r\n protected async handleLoadedMetadataStatus({ value }: REvent<CtlrMedia, \"status.loadedMetadata\">, keys = Object.keys(this.settings.css.syncWithMedia)): Promise<void> {\r\n if (!value || !keys.some((k) => this.settings.css.syncWithMedia[k])) return;\r\n const color = await this.ctlr.plug(\"settings.frame\")?.getMainColor(undefined, this.media.features.frameCapture ? \"\" : undefined);\r\n for (const k of keys) if (this.settings.css.syncWithMedia[k]) this.settings.css[k] = String(color ?? this.build[k]);\r\n }\r\n\r\n public getCSSKey(key: string): { isClass: boolean; id: string } {\r\n return { isClass: this.classList.includes(key), id: `tmg-media-${uncamelize(key, \"-\")}` };\r\n }\r\n protected getCSSValue(id: string): string {\r\n return getComputedStyle(this.media.container).getPropertyValue(`--${id}`) || \"\";\r\n }\r\n protected getClassValue(id: string): string {\r\n return Array.prototype.find.call(this.media.container.classList, (c) => c.startsWith(id))?.replace(`${id}-`, \"\") || \"\";\r\n }\r\n\r\n protected setCssVariable(id: string, value: any): void {\r\n const strVal = value != null ? String(value) : \"\";\r\n for (const el of [this.media.container, this.media.pseudoContainer]) el?.style.setProperty(`--${id}`, strVal); // \"\" auto-removes\r\n }\r\n protected setClassValue(id: string, value: any): void {\r\n for (const c of this.media.container.classList) c.startsWith(id) && this.media.container.classList.remove(c);\r\n value != null && value !== \"\" && this.media.container.classList.add(`${id}-${String(value)}`); // \"\" removes\r\n }\r\n\r\n protected get(key: string): string | number | undefined {\r\n const { isClass, id } = this.getCSSKey(key);\r\n return this[isClass ? \"getClassValue\" : \"getCSSValue\"](id);\r\n }\r\n protected set(key: string, value: any): void {\r\n const { isClass, id } = this.getCSSKey(key);\r\n this[isClass ? \"setClassValue\" : \"setCssVariable\"](id, value);\r\n }\r\n\r\n public syncAspectRatio(): void {\r\n const { videoWidth: w, videoHeight: h } = this.media.status;\r\n this.settings.css.aspectRatio = w && h ? `${w} / ${h}` : \"16 / 9\";\r\n }\r\n}\r\nconst banRgx = /\\.(?:(constructor|syncWithMedia))/; // __proto__|prototype|toString|valueOf|hasOwnProperty|\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.css\": typeof CSSPlug;\r\n }\r\n}\r\n\r\ndeclare module \"@defs/config\" {\r\n interface Settings {\r\n css: CssConfig;\r\n }\r\n}\r\n"],"mappings":"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","names":["_a"]}
@@ -1,57 +1,39 @@
1
1
  import {
2
- PlaylistPlug
3
- } from "./chunk-3VN6SCE4.js";
4
- import {
5
- SkeletonPlug
6
- } from "./chunk-EO2SYXX5.js";
7
- import {
8
- AdsPlug
9
- } from "./chunk-6CXX7WZO.js";
10
- import {
11
- DisabledPlug
12
- } from "./chunk-EZN6F5JE.js";
13
- import {
14
- LightPlug
15
- } from "./chunk-AKSQNAZS.js";
2
+ VoicePlug
3
+ } from "./chunk-UCO75OSK.js";
16
4
  import {
17
5
  VolumePlug
18
6
  } from "./chunk-I6Q53IPI.js";
19
7
  import {
20
- TimeTravelPlug
21
- } from "./chunk-SUEKTA5D.js";
8
+ OverlayPlug
9
+ } from "./chunk-AUHJS22O.js";
22
10
  import {
23
- VoicePlug
24
- } from "./chunk-UCO75OSK.js";
11
+ TimePlug
12
+ } from "./chunk-XNQILPYL.js";
25
13
  import {
26
- SleepTimerPlug
27
- } from "./chunk-PI7JPTSL.js";
14
+ TimeTravelPlug
15
+ } from "./chunk-SUEKTA5D.js";
28
16
  import {
29
17
  PosterPlug
30
18
  } from "./chunk-PXK56QO3.js";
31
19
  import {
32
- TimePlug
33
- } from "./chunk-XNQILPYL.js";
20
+ SleepTimerPlug
21
+ } from "./chunk-PI7JPTSL.js";
34
22
  import {
35
23
  PersistPlug
36
24
  } from "./chunk-JCSBCUKA.js";
25
+ import {
26
+ PanelPlug
27
+ } from "./chunk-X24LFSYJ.js";
37
28
  import {
38
29
  PlaybackRatePlug
39
30
  } from "./chunk-JDC4FBXX.js";
40
- import {
41
- ObjectFitPlug
42
- } from "./chunk-SG4E7P7S.js";
43
- import {
44
- OverlayPlug
45
- } from "./chunk-AUHJS22O.js";
46
- import {
47
- PanelPlug
48
- } from "./chunk-URYM5WYF.js";
49
31
  import {
50
32
  NotifiersPlug
51
33
  } from "./chunk-KST5YWTX.js";
52
34
  import {
53
- MetadataPlug
54
- } from "./chunk-65ZJKSNP.js";
35
+ ObjectFitPlug
36
+ } from "./chunk-SG4E7P7S.js";
55
37
  import {
56
38
  ModesAirPlayPin
57
39
  } from "./chunk-5QPPF5CW.js";
@@ -72,11 +54,11 @@ import {
72
54
  LockedPlug
73
55
  } from "./chunk-4JJV6NZM.js";
74
56
  import {
75
- CSSPlug
76
- } from "./chunk-HCTNCCPR.js";
57
+ MetadataPlug
58
+ } from "./chunk-65ZJKSNP.js";
77
59
  import {
78
60
  FramePlug
79
- } from "./chunk-D7Y72JWH.js";
61
+ } from "./chunk-U6XDI2FQ.js";
80
62
  import {
81
63
  GesturePlug,
82
64
  GestureTouchPin,
@@ -88,12 +70,12 @@ import {
88
70
  import {
89
71
  FastPlayPlug
90
72
  } from "./chunk-IW4PM2ND.js";
91
- import {
92
- BrightnessPlug
93
- } from "./chunk-X543EHRV.js";
94
73
  import {
95
74
  CaptionsPlug
96
75
  } from "./chunk-SJOESZ5R.js";
76
+ import {
77
+ CSSPlug
78
+ } from "./chunk-23BYW5JE.js";
97
79
  import {
98
80
  ControlPanelDraggablePin,
99
81
  ControlPanelPlug
@@ -101,12 +83,30 @@ import {
101
83
  import {
102
84
  ToastsPlug
103
85
  } from "./chunk-I3RJYUX7.js";
86
+ import {
87
+ AutoPlug
88
+ } from "./chunk-OLPEXQJF.js";
89
+ import {
90
+ BrightnessPlug
91
+ } from "./chunk-X543EHRV.js";
104
92
  import {
105
93
  AmbiencePlug
106
94
  } from "./chunk-3APJR7DP.js";
107
95
  import {
108
- AutoPlug
109
- } from "./chunk-OLPEXQJF.js";
96
+ SkeletonPlug
97
+ } from "./chunk-EO2SYXX5.js";
98
+ import {
99
+ DisabledPlug
100
+ } from "./chunk-EZN6F5JE.js";
101
+ import {
102
+ LightPlug
103
+ } from "./chunk-AKSQNAZS.js";
104
+ import {
105
+ PlaylistPlug
106
+ } from "./chunk-3VN6SCE4.js";
107
+ import {
108
+ AdsPlug
109
+ } from "./chunk-6CXX7WZO.js";
110
110
  import {
111
111
  PinRegistry,
112
112
  PlugRegistry
@@ -162,4 +162,4 @@ for (const Pin of [
162
162
  GestureTouchPin
163
163
  ])
164
164
  PinRegistry.register(Pin);
165
- //# sourceMappingURL=chunk-TJMGAIJ2.js.map
165
+ //# sourceMappingURL=chunk-3JYTCSCR.js.map
@@ -1,6 +1,3 @@
1
- import {
2
- ShakaTech
3
- } from "./chunk-5V7L4U3B.js";
4
1
  import {
5
2
  VIMEO_EVENTS,
6
3
  VimeoTech
@@ -14,6 +11,9 @@ import {
14
11
  import {
15
12
  HLSTech
16
13
  } from "./chunk-LNING7Z4.js";
14
+ import {
15
+ ShakaTech
16
+ } from "./chunk-5V7L4U3B.js";
17
17
  import {
18
18
  IMATech
19
19
  } from "./chunk-XOAJMIHO.js";
@@ -46,4 +46,4 @@ __export(techs_exports, {
46
46
  export {
47
47
  techs_exports
48
48
  };
49
- //# sourceMappingURL=chunk-VIJEMQ77.js.map
49
+ //# sourceMappingURL=chunk-6WK4XXTL.js.map
@@ -1,12 +1,3 @@
1
- import {
2
- tripleTriangleRight
3
- } from "./chunk-ZTOANBNR.js";
4
- import {
5
- unlock
6
- } from "./chunk-TMTWPBFD.js";
7
- import {
8
- videoTrack
9
- } from "./chunk-AIJWNUXU.js";
10
1
  import {
11
2
  volumeHigh
12
3
  } from "./chunk-W6TNR6NH.js";
@@ -16,15 +7,6 @@ import {
16
7
  import {
17
8
  volumeMuted
18
9
  } from "./chunk-2WOP45O7.js";
19
- import {
20
- returnBack
21
- } from "./chunk-BHHFZM5D.js";
22
- import {
23
- settings
24
- } from "./chunk-2J3FJY73.js";
25
- import {
26
- shuffle
27
- } from "./chunk-OEHNS7YX.js";
28
10
  import {
29
11
  sort
30
12
  } from "./chunk-QP2X53HC.js";
@@ -41,14 +23,14 @@ import {
41
23
  tripleTriangleLeft
42
24
  } from "./chunk-IIRP4XMQ.js";
43
25
  import {
44
- pipPlaceholder
45
- } from "./chunk-7CRW7VGS.js";
26
+ tripleTriangleRight
27
+ } from "./chunk-ZTOANBNR.js";
46
28
  import {
47
- play
48
- } from "./chunk-K4UHBEDT.js";
29
+ unlock
30
+ } from "./chunk-TMTWPBFD.js";
49
31
  import {
50
- playbackRate
51
- } from "./chunk-C3IEUYR3.js";
32
+ videoTrack
33
+ } from "./chunk-AIJWNUXU.js";
52
34
  import {
53
35
  playlist
54
36
  } from "./chunk-KLAI7YSD.js";
@@ -65,14 +47,14 @@ import {
65
47
  replay
66
48
  } from "./chunk-YHTCXXEG.js";
67
49
  import {
68
- lock
69
- } from "./chunk-T4LAQEBY.js";
50
+ returnBack
51
+ } from "./chunk-BHHFZM5D.js";
70
52
  import {
71
- loop
72
- } from "./chunk-OSDM6ZVT.js";
53
+ settings
54
+ } from "./chunk-2J3FJY73.js";
73
55
  import {
74
- mic
75
- } from "./chunk-PEKXIISU.js";
56
+ shuffle
57
+ } from "./chunk-OEHNS7YX.js";
76
58
  import {
77
59
  next
78
60
  } from "./chunk-MP2GRDUX.js";
@@ -89,14 +71,14 @@ import {
89
71
  pause
90
72
  } from "./chunk-OOXUZMZ7.js";
91
73
  import {
92
- exitFullscreen
93
- } from "./chunk-DR2VKENG.js";
74
+ pipPlaceholder
75
+ } from "./chunk-7CRW7VGS.js";
94
76
  import {
95
- exitPip
96
- } from "./chunk-OCWLEK2W.js";
77
+ play
78
+ } from "./chunk-K4UHBEDT.js";
97
79
  import {
98
- exitTheater
99
- } from "./chunk-CRH6DM5A.js";
80
+ playbackRate
81
+ } from "./chunk-C3IEUYR3.js";
100
82
  import {
101
83
  expandMiniplayer
102
84
  } from "./chunk-DN4TFOZV.js";
@@ -113,14 +95,14 @@ import {
113
95
  goBack
114
96
  } from "./chunk-4XUR7NSC.js";
115
97
  import {
116
- doubleTriangleLeft
117
- } from "./chunk-VGWGAAZA.js";
98
+ lock
99
+ } from "./chunk-T4LAQEBY.js";
118
100
  import {
119
- doubleTriangleRight
120
- } from "./chunk-Q5TE3ZDK.js";
101
+ loop
102
+ } from "./chunk-OSDM6ZVT.js";
121
103
  import {
122
- dragIndicator
123
- } from "./chunk-ZLZCQ3KJ.js";
104
+ mic
105
+ } from "./chunk-PEKXIISU.js";
124
106
  import {
125
107
  edit
126
108
  } from "./chunk-NLJQAJZB.js";
@@ -137,14 +119,14 @@ import {
137
119
  errorPlaceholder
138
120
  } from "./chunk-2K7QF6AQ.js";
139
121
  import {
140
- brightnessLow
141
- } from "./chunk-63CB7WUR.js";
122
+ exitFullscreen
123
+ } from "./chunk-DR2VKENG.js";
142
124
  import {
143
- bwd
144
- } from "./chunk-PV24XKW2.js";
125
+ exitPip
126
+ } from "./chunk-OCWLEK2W.js";
145
127
  import {
146
- captions
147
- } from "./chunk-CTSPKWKN.js";
128
+ exitTheater
129
+ } from "./chunk-CRH6DM5A.js";
148
130
  import {
149
131
  capture
150
132
  } from "./chunk-HA2GK6KH.js";
@@ -161,14 +143,14 @@ import {
161
143
  check
162
144
  } from "./chunk-O7XYY33O.js";
163
145
  import {
164
- airplayPlaceholder
165
- } from "./chunk-URDNEQFP.js";
146
+ doubleTriangleLeft
147
+ } from "./chunk-VGWGAAZA.js";
166
148
  import {
167
- ambience
168
- } from "./chunk-XHXIXEGS.js";
149
+ doubleTriangleRight
150
+ } from "./chunk-Q5TE3ZDK.js";
169
151
  import {
170
- audioTrack
171
- } from "./chunk-AH2VE4UI.js";
152
+ dragIndicator
153
+ } from "./chunk-ZLZCQ3KJ.js";
172
154
  import {
173
155
  autoplay
174
156
  } from "./chunk-WTHHXWQM.js";
@@ -184,12 +166,30 @@ import {
184
166
  import {
185
167
  brightnessHigh
186
168
  } from "./chunk-YEQ7IT4H.js";
169
+ import {
170
+ brightnessLow
171
+ } from "./chunk-63CB7WUR.js";
172
+ import {
173
+ bwd
174
+ } from "./chunk-PV24XKW2.js";
175
+ import {
176
+ captions
177
+ } from "./chunk-CTSPKWKN.js";
187
178
  import {
188
179
  add
189
180
  } from "./chunk-ID72UAJE.js";
190
181
  import {
191
182
  airplay
192
183
  } from "./chunk-JP5X5JDL.js";
184
+ import {
185
+ airplayPlaceholder
186
+ } from "./chunk-URDNEQFP.js";
187
+ import {
188
+ ambience
189
+ } from "./chunk-XHXIXEGS.js";
190
+ import {
191
+ audioTrack
192
+ } from "./chunk-AH2VE4UI.js";
193
193
  import {
194
194
  IconRegistry
195
195
  } from "./chunk-3NUEYI6F.js";
@@ -262,4 +262,4 @@ IconRegistry.registerAll({
262
262
  goBack,
263
263
  mic
264
264
  });
265
- //# sourceMappingURL=chunk-E5PBQLV3.js.map
265
+ //# sourceMappingURL=chunk-JLUX5NZJ.js.map
@@ -9,14 +9,14 @@ import {
9
9
  CONFIG_BUILD,
10
10
  STATE_BUILD
11
11
  } from "./chunk-DZGMINRA.js";
12
- import {
13
- FN_KEY,
14
- LUID_KEY
15
- } from "./chunk-26QMCQE3.js";
16
12
  import {
17
13
  ACTIONS_DICT,
18
14
  ACTIONS_ENTRIES
19
15
  } from "./chunk-EEZLT2G2.js";
16
+ import {
17
+ FN_KEY,
18
+ LUID_KEY
19
+ } from "./chunk-26QMCQE3.js";
20
20
  import {
21
21
  __export
22
22
  } from "./chunk-UVKRO5ER.js";
@@ -40,4 +40,4 @@ __export(consts_exports, {
40
40
  export {
41
41
  consts_exports
42
42
  };
43
- //# sourceMappingURL=chunk-WA5VZIDC.js.map
43
+ //# sourceMappingURL=chunk-LQSU7JDG.js.map
@@ -1,15 +1,3 @@
1
- import {
2
- getSettingsVolumeMenu
3
- } from "./chunk-H6RCMDPN.js";
4
- import {
5
- getSettingsPersistMenu
6
- } from "./chunk-5J74VH7H.js";
7
- import {
8
- getSettingsPlaybackRateMenu
9
- } from "./chunk-BZ6OAKW4.js";
10
- import {
11
- getSettingsPosterMenu
12
- } from "./chunk-GGQFCJML.js";
13
1
  import {
14
2
  getSettingsSleepTimerMenu
15
3
  } from "./chunk-IPV7SSWB.js";
@@ -23,14 +11,8 @@ import {
23
11
  getSettingsVoiceMenu
24
12
  } from "./chunk-WX5AO66W.js";
25
13
  import {
26
- getSettingsFrameMenu
27
- } from "./chunk-K2UNUA26.js";
28
- import {
29
- getSettingsGestureMenu
30
- } from "./chunk-SL3E3D2U.js";
31
- import {
32
- getSettingsKeysMenu
33
- } from "./chunk-C5VHC67O.js";
14
+ getSettingsVolumeMenu
15
+ } from "./chunk-H6RCMDPN.js";
34
16
  import {
35
17
  getSettingsLockedMenu
36
18
  } from "./chunk-BRA3Z2FX.js";
@@ -47,14 +29,14 @@ import {
47
29
  getSettingspanelMenu
48
30
  } from "./chunk-A4TTYDEZ.js";
49
31
  import {
50
- getMainPlaylistMenu
51
- } from "./chunk-QULPSJ56.js";
32
+ getSettingsPersistMenu
33
+ } from "./chunk-5J74VH7H.js";
52
34
  import {
53
- getSkeletonMenu
54
- } from "./chunk-FYWFDWGC.js";
35
+ getSettingsPlaybackRateMenu
36
+ } from "./chunk-BZ6OAKW4.js";
55
37
  import {
56
- getSettingsAmbienceMenu
57
- } from "./chunk-SDKNPOLX.js";
38
+ getSettingsPosterMenu
39
+ } from "./chunk-GGQFCJML.js";
58
40
  import {
59
41
  getSettingsAutoMenu
60
42
  } from "./chunk-2O47QTXH.js";
@@ -70,12 +52,30 @@ import {
70
52
  import {
71
53
  getSettingsFastPlayMenu
72
54
  } from "./chunk-QUFTMXOO.js";
55
+ import {
56
+ getSettingsFrameMenu
57
+ } from "./chunk-K2UNUA26.js";
58
+ import {
59
+ getSettingsGestureMenu
60
+ } from "./chunk-SL3E3D2U.js";
61
+ import {
62
+ getSettingsKeysMenu
63
+ } from "./chunk-C5VHC67O.js";
73
64
  import {
74
65
  getActionsMenu
75
66
  } from "./chunk-74BHTSAI.js";
76
67
  import {
77
68
  getSettingsToastsMenu
78
69
  } from "./chunk-4ONCJW62.js";
70
+ import {
71
+ getMainPlaylistMenu
72
+ } from "./chunk-QULPSJ56.js";
73
+ import {
74
+ getSkeletonMenu
75
+ } from "./chunk-FYWFDWGC.js";
76
+ import {
77
+ getSettingsAmbienceMenu
78
+ } from "./chunk-SDKNPOLX.js";
79
79
  import {
80
80
  MenuRegistry
81
81
  } from "./chunk-3NUEYI6F.js";
@@ -110,4 +110,4 @@ for (const [key, menu] of [
110
110
  ["settings.panel", getSettingspanelMenu]
111
111
  ])
112
112
  MenuRegistry.register(key, menu);
113
- //# sourceMappingURL=chunk-XV33TV7K.js.map
113
+ //# sourceMappingURL=chunk-O6VCD64X.js.map
@@ -1,21 +1,9 @@
1
- import {
2
- TouchBrightnessNotifier
3
- } from "./chunk-P37VTJI7.js";
4
- import {
5
- TouchTimelineNotifier
6
- } from "./chunk-CBG4KPKG.js";
7
1
  import {
8
2
  TouchVolumeNotifier
9
3
  } from "./chunk-BOMP2W2F.js";
10
4
  import {
11
5
  VolumeNotifier
12
6
  } from "./chunk-32LAU2UA.js";
13
- import {
14
- ChapterNotifier
15
- } from "./chunk-DIUSXM23.js";
16
- import {
17
- FastPlayNotifier
18
- } from "./chunk-DRZX5IMC.js";
19
7
  import {
20
8
  FwdBwdNotifier
21
9
  } from "./chunk-BWD6SGR5.js";
@@ -35,8 +23,11 @@ import {
35
23
  ScrubNotifier
36
24
  } from "./chunk-GMSCCJ4E.js";
37
25
  import {
38
- AirPlayNotifier
39
- } from "./chunk-XTIGTJKL.js";
26
+ TouchBrightnessNotifier
27
+ } from "./chunk-P37VTJI7.js";
28
+ import {
29
+ TouchTimelineNotifier
30
+ } from "./chunk-CBG4KPKG.js";
40
31
  import {
41
32
  BrightnessNotifier
42
33
  } from "./chunk-ZNSGNZ3S.js";
@@ -52,6 +43,15 @@ import {
52
43
  import {
53
44
  CastNotifier
54
45
  } from "./chunk-LHSDTEGX.js";
46
+ import {
47
+ ChapterNotifier
48
+ } from "./chunk-DIUSXM23.js";
49
+ import {
50
+ FastPlayNotifier
51
+ } from "./chunk-DRZX5IMC.js";
52
+ import {
53
+ AirPlayNotifier
54
+ } from "./chunk-XTIGTJKL.js";
55
55
  import {
56
56
  ComponentRegistry
57
57
  } from "./chunk-3NUEYI6F.js";
@@ -79,4 +79,4 @@ for (const Comp of [
79
79
  AirPlayNotifier
80
80
  ])
81
81
  ComponentRegistry.register(Comp);
82
- //# sourceMappingURL=chunk-R4CYVZ7J.js.map
82
+ //# sourceMappingURL=chunk-SGQJYALA.js.map
@@ -1,6 +1,3 @@
1
- import {
2
- ShakaTech
3
- } from "./chunk-5V7L4U3B.js";
4
1
  import {
5
2
  VimeoTech
6
3
  } from "./chunk-VSL5UVE3.js";
@@ -13,6 +10,9 @@ import {
13
10
  import {
14
11
  HLSTech
15
12
  } from "./chunk-LNING7Z4.js";
13
+ import {
14
+ ShakaTech
15
+ } from "./chunk-5V7L4U3B.js";
16
16
  import {
17
17
  HTML5Tech
18
18
  } from "./chunk-QT5XXSG7.js";
@@ -31,4 +31,4 @@ for (const Tech of [
31
31
  VimeoTech
32
32
  ])
33
33
  TechRegistry.register(Tech);
34
- //# sourceMappingURL=chunk-ZRJ47BPK.js.map
34
+ //# sourceMappingURL=chunk-U4STCHIM.js.map
@@ -99,7 +99,7 @@ var FramePlug = class extends BasePlug {
99
99
  }
100
100
  return;
101
101
  }
102
- async getMainColor(time, poster = this.media.element.poster, config) {
102
+ async getMainColor(time, poster = this.media.state.poster, config) {
103
103
  return getDominantColor(poster ? poster : (await this.extract("", time ?? await this.getGoodTime(config), true, 1)).canvas);
104
104
  }
105
105
  moveFrame(dir = "forwards") {
@@ -115,4 +115,4 @@ __publicField(FramePlug, "BUILD", FRAME_BUILD);
115
115
  export {
116
116
  FramePlug
117
117
  };
118
- //# sourceMappingURL=chunk-D7Y72JWH.js.map
118
+ //# sourceMappingURL=chunk-U6XDI2FQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ts/plugs/settings/frame/index.ts"],"sourcesContent":["import { BasePlug } from \"../../base\";\r\nimport type { FrameConfig } from \"./types\";\r\nimport { FRAME_BUILD } from \"./build\";\r\nimport { getDominantColor, getRGBBri, getRGBSat } from \"@utils/color\";\r\nimport { createEl } from \"@utils/dom\";\r\nimport { clamp, safeNum } from \"@utils/num\";\r\nimport { parseCSSTime } from \"@utils/str\";\r\nimport { formatMediaTime } from \"@utils/time\";\r\nimport { silence } from \"sia-reactor/modules\";\r\nimport { setTimeout } from \"@utils/fn\";\r\nimport { getMediaMin, getMediaMax } from \"@utils/time\";\r\n\r\nexport class FramePlug extends BasePlug<FrameConfig> {\r\n public static readonly plugName = \"frame\";\r\n public static readonly BUILD = FRAME_BUILD;\r\n public exportCanvas: HTMLCanvasElement = createEl(\"canvas\");\r\n public exportCtx: CanvasRenderingContext2D = this.exportCanvas.getContext(\"2d\", { alpha: false })!;\r\n\r\n public override wire(): void {\r\n // Ctlr Media Watchers\r\n this.media.watch(\"tech\", this.syncFeatures, { init: true, signal: this.signal });\r\n // ---- Config --------\r\n this.ctlr.config.watch(\"settings.frame.disabled\", this.syncFeatures, { signal: this.signal });\r\n // Post Wiring\r\n this.ctlr.learn(\"capture\", { fn: () => this.capture(\"\") }, this.signal);\r\n this.ctlr.learn(\"timeStepFwd\", { fn: () => this.moveFrame(\"forwards\"), keyboard: { phase: \"keydown\" } }, this.signal);\r\n this.ctlr.learn(\"timeStepBwd\", { fn: () => this.moveFrame(\"backwards\"), keyboard: { phase: \"keydown\" } }, this.signal);\r\n super.wire();\r\n }\r\n\r\n public async extract(display: \"\" | \"monochrome\", time?: number, raw?: false, min?: number, video?: HTMLVideoElement): Promise<{ blob: Blob | null; url: string }>;\r\n public async extract(display: \"\" | \"monochrome\", time?: number, raw?: true, min?: number, video?: HTMLVideoElement): Promise<{ canvas: HTMLCanvasElement; context: CanvasRenderingContext2D }>;\r\n public async extract(display: string = \"\", time = safeNum(this.media.state.currentTime), raw = false, min = 0, video = this.media.pseudoElement as HTMLVideoElement): Promise<any> {\r\n if (!this.media.features.frameCapture) return raw ? { canvas: this.exportCanvas, context: (this.exportCtx.clearRect(0, 0, this.exportCanvas.width, this.exportCanvas.height), this.exportCtx) } : { blob: null, url: \"\" };\r\n if (video !== this.media.element) {\r\n if (this.ctlr.state.frameReadyPromise) await this.ctlr.state.frameReadyPromise; // wait for it to get set by last getter 5 lines below\r\n if (Math.abs(video.currentTime - time) > 0.01 || !video.readyState) {\r\n this.ctlr.state.frameReadyPromise ??= new Promise<null>((res, _, cb = () => (clearTimeout(t), res(null)), t?: any) => ([video.readyState ? \"timeupdate\" : \"loadeddata\", \"error\", \"abort\", \"emptied\"].forEach((ev) => video.addEventListener(ev, cb, { once: true, signal: this.signal })), (t = setTimeout(cb, 15000, this.signal)))); // me sef no small, been burned before this\r\n video.currentTime = time; // small epsilon tolerance for video time comparison - 0.01(10ms)\r\n }\r\n this.ctlr.state.frameReadyPromise = await this.ctlr.state.frameReadyPromise;\r\n }\r\n (this.exportCanvas.width = video.videoWidth || min), (this.exportCanvas.height = video.videoHeight || min);\r\n this.exportCtx.filter = `${this.settings.css.filter as string}${display === \"monochrome\" ? \" grayscale(100%)\" : \"\"}`;\r\n this.exportCtx.drawImage(video, 0, 0, this.exportCanvas.width, this.exportCanvas.height);\r\n this.exportCtx.filter = \"none\";\r\n if (raw === true) return { canvas: this.exportCanvas, context: this.exportCtx };\r\n let blob: Blob | null | false | 0 = null;\r\n try {\r\n blob = (this.exportCanvas.width || this.exportCanvas.height) && (await new Promise<Blob | null>((res) => this.exportCanvas.toBlob(res)));\r\n } catch (err) {\r\n this.ctlr.log(err, \"error\", true); // #LESS: error not worth notifying\r\n }\r\n return { blob: blob || null, url: blob ? URL.createObjectURL(blob) : \"\" };\r\n }\r\n\r\n public async capture(display: \"\" | \"monochrome\" = \"\", time = safeNum(this.media.state.currentTime)): Promise<void> {\r\n if (!this.media.features.frameCapture) return;\r\n this.ctlr.notify?.(\"capture\"); // #STALLING: necessary optimistic distraction\r\n const toast = this.ctlr.toast,\r\n tTxt = formatMediaTime({ time, format: \"human\", showMs: true }),\r\n fTxt = `video frame ${display === \"monochrome\" ? \"in b&w \" : \"\"}at ${tTxt}`,\r\n tId = toast?.loading(`Capturing ${fTxt}...`, { delay: parseCSSTime(this.settings.css.notifiersAnimationTime), image: window.TMG_MEDIA_ALT_IMG_SRC, tag: `tmg-${this.media.settings.metadata.title ?? \"Video\"}fcpa${tTxt}${display}`, signal: this.signal, ...this.config.toast }) as string,\r\n frame = await this.extract(display, time, false, 0, this.media.element as HTMLVideoElement),\r\n filename = `${this.media.settings.metadata.title ?? \"Video\"}_${display === \"monochrome\" ? `black&white_` : \"\"}at_${tTxt}.png`.replace(/[\\/:*?\"<>|\\s]+/g, \"_\"); // system filename safe\r\n const Save = () => {\r\n toast?.loading(tId, { render: `Saving ${fTxt}`, actions: false });\r\n createEl(\"a\", { href: frame.url as string, download: filename })?.click?.();\r\n toast?.success(tId, { delay: 1000, render: `Saved ${fTxt}`, actions: false });\r\n };\r\n const Share = () => {\r\n toast?.loading(tId, { render: `Sharing ${fTxt}`, actions: false });\r\n navigator.share?.({ title: this.media.settings.metadata.title ?? \"Video\", text: `Captured ${fTxt}`, files: [new File([frame.blob!], filename, { type: frame.blob!.type })] }).then(\r\n () => toast?.success(tId, { render: `Shared ${fTxt}`, actions: false }),\r\n () => toast?.error(tId, { render: `Failed sharing ${fTxt}`, autoClose: this.config.toast.autoClose, actions: { Save } })\r\n ) || toast?.warn(tId, { delay: 1000, render: `Couldn't share ${fTxt}`, autoClose: this.config.toast.autoClose, actions: { Save } });\r\n };\r\n frame?.url ? toast?.success(tId, { render: `Captured ${fTxt}`, image: frame.url, actions: { Save, Share }, onClose: () => URL.revokeObjectURL(frame.url), autoClose: this.config.toast.autoClose }) : toast?.error(tId, { render: `Failed capturing ${fTxt}` });\r\n }\r\n\r\n public async getGoodTime({ time: t = safeNum(this.media.state.currentTime), secondsLimit: s = 25, saturation: sat = 12, brightness: bri = 40 } = {}): Promise<number | undefined> {\r\n const end = clamp(getMediaMin(this.media), t + s, getMediaMax(this.media)),\r\n seq = ++this.findSeq;\r\n for (; t <= end; t += 0.333) {\r\n if (seq !== this.findSeq) return;\r\n const rgb = await getDominantColor((await this.extract(\"\", t, true, 1)).canvas, \"rgb\", true);\r\n if (rgb && getRGBBri(rgb) > bri && getRGBSat(rgb) > sat) return t; // <= FIRST legit content frame\r\n }\r\n return;\r\n }\r\n private findSeq = 0;\r\n\r\n public async getMainColor(time?: number, poster = (this.media.element as HTMLVideoElement).poster, config?: Parameters<typeof this.getGoodTime>[0]): Promise<string | null> {\r\n return getDominantColor(poster ? poster : (await this.extract(\"\", time ?? (await this.getGoodTime(config)), true, 1)).canvas);\r\n }\r\n\r\n public moveFrame(dir: \"forwards\" | \"backwards\" = \"forwards\"): void {\r\n this.media.state.paused && this.ctlr.throttle(\"frameStepping\", () => silence(() => (this.media.intent.currentTime = clamp(getMediaMin(this.media), Math.round(this.media.state.currentTime * this.config.fps) + (dir === \"backwards\" ? -1 : 1), Math.floor(getMediaMax(this.media) * this.config.fps)) / this.config.fps)), Math.round(1000 / this.config.fps));\r\n }\r\n\r\n public syncFeatures(): void {\r\n this.media.tech.polyfill(\"frameCapture\", this.ctlr.isNativeEl && this.media.type === \"video\", this.config.disabled);\r\n }\r\n} // Video only\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.frame\": typeof FramePlug;\r\n }\r\n}\r\n\r\ndeclare module \"@defs/config\" {\r\n interface Settings {\r\n frame: FrameConfig;\r\n }\r\n}\r\n\r\ndeclare module \"@defs/contract\" {\r\n interface MediaFeaturesExt {\r\n frameCapture: boolean;\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/ts/plugs/settings/frame/index.ts"],"sourcesContent":["import { BasePlug } from \"../../base\";\r\nimport type { FrameConfig } from \"./types\";\r\nimport { FRAME_BUILD } from \"./build\";\r\nimport { getDominantColor, getRGBBri, getRGBSat } from \"@utils/color\";\r\nimport { createEl } from \"@utils/dom\";\r\nimport { clamp, safeNum } from \"@utils/num\";\r\nimport { parseCSSTime } from \"@utils/str\";\r\nimport { formatMediaTime } from \"@utils/time\";\r\nimport { silence } from \"sia-reactor/modules\";\r\nimport { setTimeout } from \"@utils/fn\";\r\nimport { getMediaMin, getMediaMax } from \"@utils/time\";\r\n\r\nexport class FramePlug extends BasePlug<FrameConfig> {\r\n public static readonly plugName = \"frame\";\r\n public static readonly BUILD = FRAME_BUILD;\r\n public exportCanvas: HTMLCanvasElement = createEl(\"canvas\");\r\n public exportCtx: CanvasRenderingContext2D = this.exportCanvas.getContext(\"2d\", { alpha: false })!;\r\n\r\n public override wire(): void {\r\n // Ctlr Media Watchers\r\n this.media.watch(\"tech\", this.syncFeatures, { init: true, signal: this.signal });\r\n // ---- Config --------\r\n this.ctlr.config.watch(\"settings.frame.disabled\", this.syncFeatures, { signal: this.signal });\r\n // Post Wiring\r\n this.ctlr.learn(\"capture\", { fn: () => this.capture(\"\") }, this.signal);\r\n this.ctlr.learn(\"timeStepFwd\", { fn: () => this.moveFrame(\"forwards\"), keyboard: { phase: \"keydown\" } }, this.signal);\r\n this.ctlr.learn(\"timeStepBwd\", { fn: () => this.moveFrame(\"backwards\"), keyboard: { phase: \"keydown\" } }, this.signal);\r\n super.wire();\r\n }\r\n\r\n public async extract(display: \"\" | \"monochrome\", time?: number, raw?: false, min?: number, video?: HTMLVideoElement): Promise<{ blob: Blob | null; url: string }>;\r\n public async extract(display: \"\" | \"monochrome\", time?: number, raw?: true, min?: number, video?: HTMLVideoElement): Promise<{ canvas: HTMLCanvasElement; context: CanvasRenderingContext2D }>;\r\n public async extract(display: string = \"\", time = safeNum(this.media.state.currentTime), raw = false, min = 0, video = this.media.pseudoElement as HTMLVideoElement): Promise<any> {\r\n if (!this.media.features.frameCapture) return raw ? { canvas: this.exportCanvas, context: (this.exportCtx.clearRect(0, 0, this.exportCanvas.width, this.exportCanvas.height), this.exportCtx) } : { blob: null, url: \"\" };\r\n if (video !== this.media.element) {\r\n if (this.ctlr.state.frameReadyPromise) await this.ctlr.state.frameReadyPromise; // wait for it to get set by last getter 5 lines below\r\n if (Math.abs(video.currentTime - time) > 0.01 || !video.readyState) {\r\n this.ctlr.state.frameReadyPromise ??= new Promise<null>((res, _, cb = () => (clearTimeout(t), res(null)), t?: any) => ([video.readyState ? \"timeupdate\" : \"loadeddata\", \"error\", \"abort\", \"emptied\"].forEach((ev) => video.addEventListener(ev, cb, { once: true, signal: this.signal })), (t = setTimeout(cb, 15000, this.signal)))); // me sef no small, been burned before this\r\n video.currentTime = time; // small epsilon tolerance for video time comparison - 0.01(10ms)\r\n }\r\n this.ctlr.state.frameReadyPromise = await this.ctlr.state.frameReadyPromise;\r\n }\r\n (this.exportCanvas.width = video.videoWidth || min), (this.exportCanvas.height = video.videoHeight || min);\r\n this.exportCtx.filter = `${this.settings.css.filter as string}${display === \"monochrome\" ? \" grayscale(100%)\" : \"\"}`;\r\n this.exportCtx.drawImage(video, 0, 0, this.exportCanvas.width, this.exportCanvas.height);\r\n this.exportCtx.filter = \"none\";\r\n if (raw === true) return { canvas: this.exportCanvas, context: this.exportCtx };\r\n let blob: Blob | null | false | 0 = null;\r\n try {\r\n blob = (this.exportCanvas.width || this.exportCanvas.height) && (await new Promise<Blob | null>((res) => this.exportCanvas.toBlob(res)));\r\n } catch (err) {\r\n this.ctlr.log(err, \"error\", true); // #LESS: error not worth notifying\r\n }\r\n return { blob: blob || null, url: blob ? URL.createObjectURL(blob) : \"\" };\r\n }\r\n\r\n public async capture(display: \"\" | \"monochrome\" = \"\", time = safeNum(this.media.state.currentTime)): Promise<void> {\r\n if (!this.media.features.frameCapture) return;\r\n this.ctlr.notify?.(\"capture\"); // #STALLING: necessary optimistic distraction\r\n const toast = this.ctlr.toast,\r\n tTxt = formatMediaTime({ time, format: \"human\", showMs: true }),\r\n fTxt = `video frame ${display === \"monochrome\" ? \"in b&w \" : \"\"}at ${tTxt}`,\r\n tId = toast?.loading(`Capturing ${fTxt}...`, { delay: parseCSSTime(this.settings.css.notifiersAnimationTime), image: window.TMG_MEDIA_ALT_IMG_SRC, tag: `tmg-${this.media.settings.metadata.title ?? \"Video\"}fcpa${tTxt}${display}`, signal: this.signal, ...this.config.toast }) as string,\r\n frame = await this.extract(display, time, false, 0, this.media.element as HTMLVideoElement),\r\n filename = `${this.media.settings.metadata.title ?? \"Video\"}_${display === \"monochrome\" ? `black&white_` : \"\"}at_${tTxt}.png`.replace(/[\\/:*?\"<>|\\s]+/g, \"_\"); // system filename safe\r\n const Save = () => {\r\n toast?.loading(tId, { render: `Saving ${fTxt}`, actions: false });\r\n createEl(\"a\", { href: frame.url as string, download: filename })?.click?.();\r\n toast?.success(tId, { delay: 1000, render: `Saved ${fTxt}`, actions: false });\r\n };\r\n const Share = () => {\r\n toast?.loading(tId, { render: `Sharing ${fTxt}`, actions: false });\r\n navigator.share?.({ title: this.media.settings.metadata.title ?? \"Video\", text: `Captured ${fTxt}`, files: [new File([frame.blob!], filename, { type: frame.blob!.type })] }).then(\r\n () => toast?.success(tId, { render: `Shared ${fTxt}`, actions: false }),\r\n () => toast?.error(tId, { render: `Failed sharing ${fTxt}`, autoClose: this.config.toast.autoClose, actions: { Save } })\r\n ) || toast?.warn(tId, { delay: 1000, render: `Couldn't share ${fTxt}`, autoClose: this.config.toast.autoClose, actions: { Save } });\r\n };\r\n frame?.url ? toast?.success(tId, { render: `Captured ${fTxt}`, image: frame.url, actions: { Save, Share }, onClose: () => URL.revokeObjectURL(frame.url), autoClose: this.config.toast.autoClose }) : toast?.error(tId, { render: `Failed capturing ${fTxt}` });\r\n }\r\n\r\n public async getGoodTime({ time: t = safeNum(this.media.state.currentTime), secondsLimit: s = 25, saturation: sat = 12, brightness: bri = 40 } = {}): Promise<number | undefined> {\r\n const end = clamp(getMediaMin(this.media), t + s, getMediaMax(this.media)),\r\n seq = ++this.findSeq;\r\n for (; t <= end; t += 0.333) {\r\n if (seq !== this.findSeq) return;\r\n const rgb = await getDominantColor((await this.extract(\"\", t, true, 1)).canvas, \"rgb\", true);\r\n if (rgb && getRGBBri(rgb) > bri && getRGBSat(rgb) > sat) return t; // <= FIRST legit content frame\r\n }\r\n return;\r\n }\r\n private findSeq = 0;\r\n\r\n public async getMainColor(time?: number, poster = this.media.state.poster, config?: Parameters<typeof this.getGoodTime>[0]): Promise<string | null> {\r\n return getDominantColor(poster ? poster : (await this.extract(\"\", time ?? (await this.getGoodTime(config)), true, 1)).canvas);\r\n }\r\n\r\n public moveFrame(dir: \"forwards\" | \"backwards\" = \"forwards\"): void {\r\n this.media.state.paused && this.ctlr.throttle(\"frameStepping\", () => silence(() => (this.media.intent.currentTime = clamp(getMediaMin(this.media), Math.round(this.media.state.currentTime * this.config.fps) + (dir === \"backwards\" ? -1 : 1), Math.floor(getMediaMax(this.media) * this.config.fps)) / this.config.fps)), Math.round(1000 / this.config.fps));\r\n }\r\n\r\n public syncFeatures(): void {\r\n this.media.tech.polyfill(\"frameCapture\", this.ctlr.isNativeEl && this.media.type === \"video\", this.config.disabled);\r\n }\r\n} // Video only\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.frame\": typeof FramePlug;\r\n }\r\n}\r\n\r\ndeclare module \"@defs/config\" {\r\n interface Settings {\r\n frame: FrameConfig;\r\n }\r\n}\r\n\r\ndeclare module \"@defs/contract\" {\r\n interface MediaFeaturesExt {\r\n frameCapture: boolean;\r\n }\r\n}\r\n"],"mappings":"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","names":[]}