@locpd/vidstack 1.12.14

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 (242) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -0
  3. package/analyze.json.d.ts +8 -0
  4. package/bundle.d.ts +1 -0
  5. package/cdn/chunks/vidstack-2f5gzOW6.js +1 -0
  6. package/cdn/chunks/vidstack-BYgY9wmd.js +1 -0
  7. package/cdn/chunks/vidstack-BfBBPhXV.js +1 -0
  8. package/cdn/chunks/vidstack-Bjo5esRp.js +1 -0
  9. package/cdn/chunks/vidstack-BuL67v3q.js +1 -0
  10. package/cdn/chunks/vidstack-C0msPRTd.js +3 -0
  11. package/cdn/chunks/vidstack-CJNLoJPa.js +1 -0
  12. package/cdn/chunks/vidstack-CQSpZ7X8.js +16 -0
  13. package/cdn/chunks/vidstack-C_AxqLKV.js +1 -0
  14. package/cdn/chunks/vidstack-CioT3Yw2.js +1 -0
  15. package/cdn/chunks/vidstack-CrqkytHl.js +1 -0
  16. package/cdn/chunks/vidstack-D0M8R0ZU.js +1 -0
  17. package/cdn/chunks/vidstack-D40FSa5B.js +3 -0
  18. package/cdn/chunks/vidstack-DD2JwFVU.js +1 -0
  19. package/cdn/chunks/vidstack-DRH_1tFW.js +1 -0
  20. package/cdn/chunks/vidstack-DfDZuHNP.js +1 -0
  21. package/cdn/chunks/vidstack-DiNS2Vx5.js +1 -0
  22. package/cdn/chunks/vidstack-xjJ-ui_l.js +1 -0
  23. package/cdn/providers/vidstack-audio-2Dt_Ivbp.js +1 -0
  24. package/cdn/providers/vidstack-dash-CUtD4e6q.js +1 -0
  25. package/cdn/providers/vidstack-google-cast-BdORATUX.js +1 -0
  26. package/cdn/providers/vidstack-hls-R25Kb6DP.js +1 -0
  27. package/cdn/providers/vidstack-html-DaAUJYsD.js +1 -0
  28. package/cdn/providers/vidstack-video-Csvox7SO.js +1 -0
  29. package/cdn/providers/vidstack-vimeo-D4Z96kg2.js +1 -0
  30. package/cdn/providers/vidstack-youtube-DiND6h3s.js +1 -0
  31. package/cdn/vidstack.js +1 -0
  32. package/cdn/with-layouts/chunks/vidstack-2f5gzOW6.js +1 -0
  33. package/cdn/with-layouts/chunks/vidstack-45yH5los.js +1 -0
  34. package/cdn/with-layouts/chunks/vidstack-BBVMdOnf.js +1 -0
  35. package/cdn/with-layouts/chunks/vidstack-BB_ulI_T.js +1 -0
  36. package/cdn/with-layouts/chunks/vidstack-BcAewM33.js +1 -0
  37. package/cdn/with-layouts/chunks/vidstack-BfBBPhXV.js +1 -0
  38. package/cdn/with-layouts/chunks/vidstack-Bxv1Qnxe.js +1 -0
  39. package/cdn/with-layouts/chunks/vidstack-C2ZbG62f.js +3 -0
  40. package/cdn/with-layouts/chunks/vidstack-CCYIOKgL.js +1 -0
  41. package/cdn/with-layouts/chunks/vidstack-CL6PeIO1.js +1 -0
  42. package/cdn/with-layouts/chunks/vidstack-C_AxqLKV.js +1 -0
  43. package/cdn/with-layouts/chunks/vidstack-CifDkwDH.js +795 -0
  44. package/cdn/with-layouts/chunks/vidstack-Cry7aD59.js +3 -0
  45. package/cdn/with-layouts/chunks/vidstack-D065okCn.js +1 -0
  46. package/cdn/with-layouts/chunks/vidstack-DGuMoXmI.js +1 -0
  47. package/cdn/with-layouts/chunks/vidstack-DRH_1tFW.js +1 -0
  48. package/cdn/with-layouts/chunks/vidstack-DVBs1XoQ.js +1 -0
  49. package/cdn/with-layouts/chunks/vidstack-Dge3KT8k.js +1 -0
  50. package/cdn/with-layouts/chunks/vidstack-DiNS2Vx5.js +1 -0
  51. package/cdn/with-layouts/chunks/vidstack-HvYfJoen.js +1 -0
  52. package/cdn/with-layouts/providers/vidstack-audio-DE5vKIzW.js +1 -0
  53. package/cdn/with-layouts/providers/vidstack-dash-CA2agUuZ.js +1 -0
  54. package/cdn/with-layouts/providers/vidstack-google-cast-CGs-t8HM.js +1 -0
  55. package/cdn/with-layouts/providers/vidstack-hls-BHMbMFFR.js +1 -0
  56. package/cdn/with-layouts/providers/vidstack-html-Dm9gmNk6.js +1 -0
  57. package/cdn/with-layouts/providers/vidstack-video-C5it_Lbl.js +1 -0
  58. package/cdn/with-layouts/providers/vidstack-vimeo-BabLn9sy.js +1 -0
  59. package/cdn/with-layouts/providers/vidstack-youtube-D8UlccUL.js +1 -0
  60. package/cdn/with-layouts/vidstack.js +1 -0
  61. package/dev/chunks/vidstack-B7Zi3v_O.js +104 -0
  62. package/dev/chunks/vidstack-BFg1ZqiG.js +91 -0
  63. package/dev/chunks/vidstack-BGB2pa9s.js +58 -0
  64. package/dev/chunks/vidstack-BaIbHZE3.js +1519 -0
  65. package/dev/chunks/vidstack-Bb2rASIc.js +5188 -0
  66. package/dev/chunks/vidstack-Bcmx8pmK.js +224 -0
  67. package/dev/chunks/vidstack-Bl4b0Nen.js +29 -0
  68. package/dev/chunks/vidstack-Bo5OTJ06.js +58 -0
  69. package/dev/chunks/vidstack-BoAGnlRt.js +58 -0
  70. package/dev/chunks/vidstack-Bpr4fI4n.js +7 -0
  71. package/dev/chunks/vidstack-Bt8MP2DK.js +204 -0
  72. package/dev/chunks/vidstack-Bu2kfzUd.js +1637 -0
  73. package/dev/chunks/vidstack-C-ffXlSV.js +2995 -0
  74. package/dev/chunks/vidstack-C-ztJq-f.js +109 -0
  75. package/dev/chunks/vidstack-CFNlaVTR.js +55 -0
  76. package/dev/chunks/vidstack-C_l97D5j.js +254 -0
  77. package/dev/chunks/vidstack-CjhKISI0.js +114 -0
  78. package/dev/chunks/vidstack-CofXIJAy.js +57 -0
  79. package/dev/chunks/vidstack-CwTj4H1w.js +18 -0
  80. package/dev/chunks/vidstack-DDwbYVHV.js +66 -0
  81. package/dev/chunks/vidstack-DFImIcIL.js +11 -0
  82. package/dev/chunks/vidstack-DGDvUbvO.js +33 -0
  83. package/dev/chunks/vidstack-DO0kqA99.js +107 -0
  84. package/dev/chunks/vidstack-DXxIKXmd.js +50 -0
  85. package/dev/chunks/vidstack-DajrMUR0.js +297 -0
  86. package/dev/chunks/vidstack-DbBJlz7I.js +10 -0
  87. package/dev/chunks/vidstack-Dihypf8P.js +11 -0
  88. package/dev/chunks/vidstack-DlAhl87f.js +1193 -0
  89. package/dev/chunks/vidstack-Dm1xEU9Q.js +34 -0
  90. package/dev/chunks/vidstack-Dv_LIPFu.js +14 -0
  91. package/dev/chunks/vidstack-igYn0Apa.js +254 -0
  92. package/dev/chunks/vidstack-krOAtKMi.js +32 -0
  93. package/dev/chunks/vidstack-qh1N5_f_.js +26 -0
  94. package/dev/chunks/vidstack-rB-wqXw1.js +107 -0
  95. package/dev/chunks/vidstack-zG6PIeGg.js +66 -0
  96. package/dev/define/plyr-layout.js +51 -0
  97. package/dev/define/templates/plyr-layout.js +571 -0
  98. package/dev/define/templates/vidstack-audio-layout.js +167 -0
  99. package/dev/define/templates/vidstack-video-layout.js +390 -0
  100. package/dev/define/vidstack-icons.js +1 -0
  101. package/dev/define/vidstack-player-default-layout.js +21 -0
  102. package/dev/define/vidstack-player-layouts.js +25 -0
  103. package/dev/define/vidstack-player-ui.js +70 -0
  104. package/dev/define/vidstack-player.js +19 -0
  105. package/dev/global/plyr.js +501 -0
  106. package/dev/global/vidstack-player.js +129 -0
  107. package/dev/providers/vidstack-audio.js +35 -0
  108. package/dev/providers/vidstack-dash.js +516 -0
  109. package/dev/providers/vidstack-google-cast.js +474 -0
  110. package/dev/providers/vidstack-hls.js +408 -0
  111. package/dev/providers/vidstack-html.js +567 -0
  112. package/dev/providers/vidstack-video.js +207 -0
  113. package/dev/providers/vidstack-vimeo.js +554 -0
  114. package/dev/providers/vidstack-youtube.js +286 -0
  115. package/dev/vidstack-elements.js +36 -0
  116. package/dev/vidstack.js +91 -0
  117. package/dom.d.ts +91 -0
  118. package/elements.d.ts +1433 -0
  119. package/empty.vtt +1 -0
  120. package/global/player.d.ts +52 -0
  121. package/global/plyr.d.ts +343 -0
  122. package/google-cast.d.ts +1422 -0
  123. package/icons.d.ts +1 -0
  124. package/index.d.ts +402 -0
  125. package/package.json +199 -0
  126. package/player/index.d.ts +3 -0
  127. package/player/layouts/default.d.ts +3 -0
  128. package/player/layouts/index.d.ts +3 -0
  129. package/player/layouts/plyr.d.ts +3 -0
  130. package/player/styles/base.css +153 -0
  131. package/player/styles/default/buffering.css +55 -0
  132. package/player/styles/default/buttons.css +175 -0
  133. package/player/styles/default/captions.css +181 -0
  134. package/player/styles/default/chapter-title.css +26 -0
  135. package/player/styles/default/controls.css +56 -0
  136. package/player/styles/default/gestures.css +19 -0
  137. package/player/styles/default/icons.css +6 -0
  138. package/player/styles/default/keyboard.css +148 -0
  139. package/player/styles/default/layouts/audio.css +417 -0
  140. package/player/styles/default/layouts/video.css +590 -0
  141. package/player/styles/default/menus.css +959 -0
  142. package/player/styles/default/poster.css +52 -0
  143. package/player/styles/default/sliders.css +391 -0
  144. package/player/styles/default/theme.css +2461 -0
  145. package/player/styles/default/thumbnail.css +40 -0
  146. package/player/styles/default/time.css +45 -0
  147. package/player/styles/default/tooltips.css +141 -0
  148. package/player/styles/plyr/theme.css +1237 -0
  149. package/player/ui.d.ts +3 -0
  150. package/plugins.d.ts +19 -0
  151. package/plugins.js +13 -0
  152. package/prod/chunks/vidstack-B01xzxC4.js +7 -0
  153. package/prod/chunks/vidstack-BCeb7ryV.js +201 -0
  154. package/prod/chunks/vidstack-BGSTndAW.js +1590 -0
  155. package/prod/chunks/vidstack-BPitBBjh.js +1519 -0
  156. package/prod/chunks/vidstack-BQlOPwOu.js +45 -0
  157. package/prod/chunks/vidstack-BSDzlwxO.js +4778 -0
  158. package/prod/chunks/vidstack-BT0m6zEi.js +109 -0
  159. package/prod/chunks/vidstack-BTigPj2h.js +55 -0
  160. package/prod/chunks/vidstack-BiyXcJ_M.js +107 -0
  161. package/prod/chunks/vidstack-BoVf5n1M.js +2985 -0
  162. package/prod/chunks/vidstack-Bq6c3Bam.js +58 -0
  163. package/prod/chunks/vidstack-ByLCIBtB.js +297 -0
  164. package/prod/chunks/vidstack-C2US-gSO.js +248 -0
  165. package/prod/chunks/vidstack-C9vIqaYT.js +10 -0
  166. package/prod/chunks/vidstack-CF6fixCQ.js +1193 -0
  167. package/prod/chunks/vidstack-CTojmhKq.js +66 -0
  168. package/prod/chunks/vidstack-ChQTHmIQ.js +77 -0
  169. package/prod/chunks/vidstack-Cm6_unwd.js +246 -0
  170. package/prod/chunks/vidstack-CwTj4H1w.js +18 -0
  171. package/prod/chunks/vidstack-D3ltXc3a.js +33 -0
  172. package/prod/chunks/vidstack-D5EzK014.js +14 -0
  173. package/prod/chunks/vidstack-DDXt6fpN.js +58 -0
  174. package/prod/chunks/vidstack-DJDnh4xT.js +11 -0
  175. package/prod/chunks/vidstack-DXxIKXmd.js +50 -0
  176. package/prod/chunks/vidstack-D_-9AA6_.js +29 -0
  177. package/prod/chunks/vidstack-DbkZGjSn.js +107 -0
  178. package/prod/chunks/vidstack-Dihypf8P.js +11 -0
  179. package/prod/chunks/vidstack-Dm1xEU9Q.js +34 -0
  180. package/prod/chunks/vidstack-Dq5Yu0Vr.js +205 -0
  181. package/prod/chunks/vidstack-DqAw8m9J.js +26 -0
  182. package/prod/chunks/vidstack-DsPOyKtl.js +57 -0
  183. package/prod/chunks/vidstack-krOAtKMi.js +32 -0
  184. package/prod/chunks/vidstack-nLyr4NEP.js +58 -0
  185. package/prod/chunks/vidstack-xMS8dnYq.js +114 -0
  186. package/prod/chunks/vidstack-yEGTpgeA.js +104 -0
  187. package/prod/define/plyr-layout.js +51 -0
  188. package/prod/define/templates/plyr-layout.js +571 -0
  189. package/prod/define/templates/vidstack-audio-layout.js +167 -0
  190. package/prod/define/templates/vidstack-video-layout.js +390 -0
  191. package/prod/define/vidstack-icons.js +1 -0
  192. package/prod/define/vidstack-player-default-layout.js +21 -0
  193. package/prod/define/vidstack-player-layouts.js +25 -0
  194. package/prod/define/vidstack-player-ui.js +70 -0
  195. package/prod/define/vidstack-player.js +19 -0
  196. package/prod/global/plyr.js +493 -0
  197. package/prod/global/vidstack-player.js +129 -0
  198. package/prod/providers/vidstack-audio.js +35 -0
  199. package/prod/providers/vidstack-dash.js +501 -0
  200. package/prod/providers/vidstack-google-cast.js +468 -0
  201. package/prod/providers/vidstack-hls.js +393 -0
  202. package/prod/providers/vidstack-html.js +555 -0
  203. package/prod/providers/vidstack-video.js +204 -0
  204. package/prod/providers/vidstack-vimeo.js +548 -0
  205. package/prod/providers/vidstack-youtube.js +286 -0
  206. package/prod/vidstack-elements.js +36 -0
  207. package/prod/vidstack.js +158 -0
  208. package/server/chunks/vidstack-6juFdkKy.js +29 -0
  209. package/server/chunks/vidstack-B7iHmv7_.js +307 -0
  210. package/server/chunks/vidstack-BmxyML9v.js +1619 -0
  211. package/server/chunks/vidstack-BskfxwD3.js +566 -0
  212. package/server/chunks/vidstack-BvLV0SMz.js +4642 -0
  213. package/server/chunks/vidstack-BvWwluXZ.js +205 -0
  214. package/server/chunks/vidstack-C-413dj2.js +8 -0
  215. package/server/chunks/vidstack-C26K8z_-.js +55 -0
  216. package/server/chunks/vidstack-CJJiksDz.js +107 -0
  217. package/server/chunks/vidstack-CUNv52x1.js +141 -0
  218. package/server/chunks/vidstack-CqyBCODe.js +295 -0
  219. package/server/chunks/vidstack-CwTj4H1w.js +18 -0
  220. package/server/chunks/vidstack-DHAyGSOl.js +1502 -0
  221. package/server/chunks/vidstack-DLU3cjcp.js +381 -0
  222. package/server/chunks/vidstack-DXxIKXmd.js +50 -0
  223. package/server/chunks/vidstack-DbtDXDS2.js +104 -0
  224. package/server/chunks/vidstack-Dm1xEU9Q.js +34 -0
  225. package/server/chunks/vidstack-DzTHw_bw.js +207 -0
  226. package/server/chunks/vidstack-Wn3NH5Sg.js +1566 -0
  227. package/server/chunks/vidstack-krOAtKMi.js +32 -0
  228. package/server/chunks/vidstack-wNViAkr4.js +3045 -0
  229. package/server/define/plyr-layout.js +16 -0
  230. package/server/define/vidstack-icons.js +1 -0
  231. package/server/define/vidstack-player-default-layout.js +13 -0
  232. package/server/define/vidstack-player-layouts.js +16 -0
  233. package/server/define/vidstack-player-ui.js +11 -0
  234. package/server/define/vidstack-player.js +6 -0
  235. package/server/global/plyr.js +322 -0
  236. package/server/global/vidstack-player.js +58 -0
  237. package/server/vidstack-elements.js +46 -0
  238. package/server/vidstack.js +148 -0
  239. package/tailwind.cjs +101 -0
  240. package/tailwind.d.cts +15 -0
  241. package/types/vidstack-BOvzfZjK.d.ts +1269 -0
  242. package/types/vidstack-Cttpg6GU.d.ts +7474 -0
@@ -0,0 +1,286 @@
1
+ import { createScope, signal, effect, isString, deferredPromise, isObject, isNumber, isBoolean } from '../chunks/vidstack-BGSTndAW.js';
2
+ import { TimeRange } from '../chunks/vidstack-ChQTHmIQ.js';
3
+ import { preconnect } from '../chunks/vidstack-CTojmhKq.js';
4
+ import { EmbedProvider } from '../chunks/vidstack-DDXt6fpN.js';
5
+ import { resolveYouTubeVideoId } from '../chunks/vidstack-Dm1xEU9Q.js';
6
+ import '../chunks/vidstack-xMS8dnYq.js';
7
+
8
+ const YouTubePlayerState = {
9
+ Ended: 0,
10
+ Playing: 1,
11
+ Paused: 2,
12
+ Buffering: 3,
13
+ Cued: 5
14
+ };
15
+
16
+ class YouTubeProvider extends EmbedProvider {
17
+ $$PROVIDER_TYPE = "YOUTUBE";
18
+ scope = createScope();
19
+ #ctx;
20
+ #videoId = signal("");
21
+ #state = -1;
22
+ #currentSrc = null;
23
+ #seekingTimer = -1;
24
+ #invalidPlay = false;
25
+ #promises = /* @__PURE__ */ new Map();
26
+ constructor(iframe, ctx) {
27
+ super(iframe);
28
+ this.#ctx = ctx;
29
+ }
30
+ /**
31
+ * Sets the player's interface language. The parameter value is an ISO 639-1 two-letter
32
+ * language code or a fully specified locale. For example, fr and fr-ca are both valid values.
33
+ * Other language input codes, such as IETF language tags (BCP 47) might also be handled properly.
34
+ *
35
+ * The interface language is used for tooltips in the player and also affects the default caption
36
+ * track. Note that YouTube might select a different caption track language for a particular
37
+ * user based on the user's individual language preferences and the availability of caption tracks.
38
+ *
39
+ * @defaultValue 'en'
40
+ */
41
+ language = "en";
42
+ color = "red";
43
+ /**
44
+ * Whether cookies should be enabled on the embed. This is turned off by default to be
45
+ * GDPR-compliant.
46
+ *
47
+ * @defaultValue `false`
48
+ */
49
+ cookies = false;
50
+ get currentSrc() {
51
+ return this.#currentSrc;
52
+ }
53
+ get type() {
54
+ return "youtube";
55
+ }
56
+ get videoId() {
57
+ return this.#videoId();
58
+ }
59
+ preconnect() {
60
+ preconnect(this.getOrigin());
61
+ }
62
+ setup() {
63
+ super.setup();
64
+ effect(this.#watchVideoId.bind(this));
65
+ this.#ctx.notify("provider-setup", this);
66
+ }
67
+ destroy() {
68
+ this.#reset();
69
+ const message = "provider destroyed";
70
+ for (const promises of this.#promises.values()) {
71
+ for (const { reject } of promises) reject(message);
72
+ }
73
+ this.#promises.clear();
74
+ }
75
+ async play() {
76
+ return this.#remote("playVideo");
77
+ }
78
+ #playFail(message) {
79
+ this.#getPromise("playVideo")?.reject(message);
80
+ }
81
+ async pause() {
82
+ return this.#remote("pauseVideo");
83
+ }
84
+ #pauseFail(message) {
85
+ this.#getPromise("pauseVideo")?.reject(message);
86
+ }
87
+ setMuted(muted) {
88
+ if (muted) this.#remote("mute");
89
+ else this.#remote("unMute");
90
+ }
91
+ setCurrentTime(time) {
92
+ this.#remote("seekTo", [time, true]);
93
+ this.#ctx.notify("seeking", time);
94
+ }
95
+ setVolume(volume) {
96
+ this.#remote("setVolume", volume * 100);
97
+ }
98
+ setPlaybackRate(rate) {
99
+ this.#remote("setPlaybackRate", rate);
100
+ }
101
+ async loadSource(src) {
102
+ if (!isString(src.src)) {
103
+ this.#currentSrc = null;
104
+ this.#videoId.set("");
105
+ return;
106
+ }
107
+ const videoId = resolveYouTubeVideoId(src.src);
108
+ this.#videoId.set(videoId ?? "");
109
+ this.#currentSrc = src;
110
+ }
111
+ getOrigin() {
112
+ return !this.cookies ? "https://www.youtube-nocookie.com" : "https://www.youtube.com";
113
+ }
114
+ #watchVideoId() {
115
+ this.#reset();
116
+ const videoId = this.#videoId();
117
+ if (!videoId) {
118
+ this.src.set("");
119
+ return;
120
+ }
121
+ this.src.set(`${this.getOrigin()}/embed/${videoId}`);
122
+ this.#ctx.notify("load-start");
123
+ }
124
+ buildParams() {
125
+ const { keyDisabled } = this.#ctx.$props, { muted, playsInline, nativeControls } = this.#ctx.$state, showControls = nativeControls();
126
+ return {
127
+ rel: 0,
128
+ autoplay: 0,
129
+ cc_lang_pref: this.language,
130
+ cc_load_policy: showControls ? 1 : void 0,
131
+ color: this.color,
132
+ controls: showControls ? 1 : 0,
133
+ disablekb: !showControls || keyDisabled() ? 1 : 0,
134
+ enablejsapi: 1,
135
+ fs: 1,
136
+ hl: this.language,
137
+ iv_load_policy: showControls ? 1 : 3,
138
+ mute: muted() ? 1 : 0,
139
+ playsinline: playsInline() ? 1 : 0
140
+ };
141
+ }
142
+ #remote(command, arg) {
143
+ let promise = deferredPromise(), promises = this.#promises.get(command);
144
+ if (!promises) this.#promises.set(command, promises = []);
145
+ promises.push(promise);
146
+ const args = Array.isArray(arg) ? arg : arg ? [arg] : void 0;
147
+ this.postMessage({
148
+ event: "command",
149
+ func: command,
150
+ args
151
+ });
152
+ return promise.promise;
153
+ }
154
+ onLoad() {
155
+ window.setTimeout(() => this.postMessage({ event: "listening" }), 100);
156
+ }
157
+ #onReady(trigger) {
158
+ this.#ctx.notify("loaded-metadata");
159
+ this.#ctx.notify("loaded-data");
160
+ this.#ctx.delegate.ready(void 0, trigger);
161
+ }
162
+ #onPause(trigger) {
163
+ this.#getPromise("pauseVideo")?.resolve();
164
+ this.#ctx.notify("pause", void 0, trigger);
165
+ }
166
+ #onTimeUpdate(time, trigger) {
167
+ const { duration, realCurrentTime } = this.#ctx.$state, hasEnded = this.#state === YouTubePlayerState.Ended, boundTime = hasEnded ? duration() : time;
168
+ this.#ctx.notify("time-change", boundTime, trigger);
169
+ if (!hasEnded && Math.abs(boundTime - realCurrentTime()) > 1) {
170
+ this.#ctx.notify("seeking", boundTime, trigger);
171
+ }
172
+ }
173
+ #onProgress(buffered, seekable, trigger) {
174
+ const detail = {
175
+ buffered: new TimeRange(0, buffered),
176
+ seekable
177
+ };
178
+ this.#ctx.notify("progress", detail, trigger);
179
+ const { seeking, realCurrentTime } = this.#ctx.$state;
180
+ if (seeking() && buffered > realCurrentTime()) {
181
+ this.#onSeeked(trigger);
182
+ }
183
+ }
184
+ #onSeeked(trigger) {
185
+ const { paused, realCurrentTime } = this.#ctx.$state;
186
+ window.clearTimeout(this.#seekingTimer);
187
+ this.#seekingTimer = window.setTimeout(
188
+ () => {
189
+ this.#ctx.notify("seeked", realCurrentTime(), trigger);
190
+ this.#seekingTimer = -1;
191
+ },
192
+ paused() ? 100 : 0
193
+ );
194
+ }
195
+ #onEnded(trigger) {
196
+ const { seeking } = this.#ctx.$state;
197
+ if (seeking()) this.#onSeeked(trigger);
198
+ this.#ctx.notify("pause", void 0, trigger);
199
+ this.#ctx.notify("end", void 0, trigger);
200
+ }
201
+ #onStateChange(state, trigger) {
202
+ const { paused, seeking } = this.#ctx.$state, isPlaying = state === YouTubePlayerState.Playing, isBuffering = state === YouTubePlayerState.Buffering, isPendingPlay = this.#isPending("playVideo"), isPlay = paused() && (isBuffering || isPlaying);
203
+ if (isBuffering) this.#ctx.notify("waiting", void 0, trigger);
204
+ if (seeking() && isPlaying) {
205
+ this.#onSeeked(trigger);
206
+ }
207
+ if (this.#invalidPlay && isPlaying) {
208
+ this.pause();
209
+ this.#invalidPlay = false;
210
+ this.setMuted(this.#ctx.$state.muted());
211
+ return;
212
+ }
213
+ if (!isPendingPlay && isPlay) {
214
+ this.#invalidPlay = true;
215
+ this.setMuted(true);
216
+ return;
217
+ }
218
+ if (isPlay) {
219
+ this.#getPromise("playVideo")?.resolve();
220
+ this.#ctx.notify("play", void 0, trigger);
221
+ }
222
+ switch (state) {
223
+ case YouTubePlayerState.Cued:
224
+ this.#onReady(trigger);
225
+ break;
226
+ case YouTubePlayerState.Playing:
227
+ this.#ctx.notify("playing", void 0, trigger);
228
+ break;
229
+ case YouTubePlayerState.Paused:
230
+ this.#onPause(trigger);
231
+ break;
232
+ case YouTubePlayerState.Ended:
233
+ this.#onEnded(trigger);
234
+ break;
235
+ }
236
+ this.#state = state;
237
+ }
238
+ onMessage({ info }, event) {
239
+ if (!info) return;
240
+ const { title, intrinsicDuration, playbackRate } = this.#ctx.$state;
241
+ if (isObject(info.videoData) && info.videoData.title !== title()) {
242
+ this.#ctx.notify("title-change", info.videoData.title, event);
243
+ }
244
+ if (isNumber(info.duration) && info.duration !== intrinsicDuration()) {
245
+ if (isNumber(info.videoLoadedFraction)) {
246
+ const buffered = info.progressState?.loaded ?? info.videoLoadedFraction * info.duration, seekable = new TimeRange(0, info.duration);
247
+ this.#onProgress(buffered, seekable, event);
248
+ }
249
+ this.#ctx.notify("duration-change", info.duration, event);
250
+ }
251
+ if (isNumber(info.playbackRate) && info.playbackRate !== playbackRate()) {
252
+ this.#ctx.notify("rate-change", info.playbackRate, event);
253
+ }
254
+ if (info.progressState) {
255
+ const { current, seekableStart, seekableEnd, loaded, duration } = info.progressState;
256
+ this.#onTimeUpdate(current, event);
257
+ this.#onProgress(loaded, new TimeRange(seekableStart, seekableEnd), event);
258
+ if (duration !== intrinsicDuration()) {
259
+ this.#ctx.notify("duration-change", duration, event);
260
+ }
261
+ }
262
+ if (isNumber(info.volume) && isBoolean(info.muted) && !this.#invalidPlay) {
263
+ const detail = {
264
+ muted: info.muted,
265
+ volume: info.volume / 100
266
+ };
267
+ this.#ctx.notify("volume-change", detail, event);
268
+ }
269
+ if (isNumber(info.playerState) && info.playerState !== this.#state) {
270
+ this.#onStateChange(info.playerState, event);
271
+ }
272
+ }
273
+ #reset() {
274
+ this.#state = -1;
275
+ this.#seekingTimer = -1;
276
+ this.#invalidPlay = false;
277
+ }
278
+ #getPromise(command) {
279
+ return this.#promises.get(command)?.shift();
280
+ }
281
+ #isPending(command) {
282
+ return Boolean(this.#promises.get(command)?.length);
283
+ }
284
+ }
285
+
286
+ export { YouTubeProvider };
@@ -0,0 +1,36 @@
1
+ export { defineCustomElement } from './chunks/vidstack-BGSTndAW.js';
2
+ export { MediaAnnouncerElement, MediaAudioGainRadioGroupElement, MediaAudioGainSliderElement, MediaCaptionsElement, MediaChapterTitleElement, MediaChaptersRadioGroupElement, MediaControlsElement, MediaControlsGroupElement, MediaGestureElement, MediaGoogleCastButtonElement, MediaLayoutElement, MediaMenuPortalElement, MediaQualitySliderElement, MediaRadioGroupElement, MediaSliderChaptersElement, MediaSliderElement, MediaSliderStepsElement, MediaSliderVideoElement, MediaSpeedSliderElement, MediaSpinnerElement, MediaTitleElement, MediaToggleButtonElement, MediaTooltipContentElement, MediaTooltipElement, MediaTooltipTriggerElement } from './chunks/vidstack-ByLCIBtB.js';
3
+ export { MediaPlayerElement, MediaProviderElement } from './chunks/vidstack-yEGTpgeA.js';
4
+ export { MediaPosterElement } from './chunks/vidstack-D3ltXc3a.js';
5
+ export { MediaAirPlayButtonElement, MediaAudioRadioGroupElement, MediaCaptionButtonElement, MediaCaptionsRadioGroupElement, MediaFullscreenButtonElement, MediaLiveButtonElement, MediaMenuButtonElement, MediaMenuElement, MediaMenuItemElement, MediaMenuItemsElement, MediaMuteButtonElement, MediaPIPButtonElement, MediaPlayButtonElement, MediaQualityRadioGroupElement, MediaRadioElement, MediaSeekButtonElement, MediaSliderPreviewElement, MediaSliderThumbnailElement, MediaSliderValueElement, MediaSpeedRadioGroupElement, MediaThumbnailElement, MediaTimeElement, MediaTimeSliderElement, MediaVolumeSliderElement } from './chunks/vidstack-BCeb7ryV.js';
6
+ export { MediaAudioLayoutElement } from './define/templates/vidstack-audio-layout.js';
7
+ export { MediaVideoLayoutElement } from './define/templates/vidstack-video-layout.js';
8
+ export { MediaPlyrLayoutElement } from './define/templates/plyr-layout.js';
9
+ import './chunks/vidstack-BPitBBjh.js';
10
+ import './chunks/vidstack-DJDnh4xT.js';
11
+ import './chunks/vidstack-C2US-gSO.js';
12
+ import '@floating-ui/dom';
13
+ import './chunks/vidstack-BoVf5n1M.js';
14
+ import './chunks/vidstack-Cm6_unwd.js';
15
+ import './chunks/vidstack-CTojmhKq.js';
16
+ import './chunks/vidstack-xMS8dnYq.js';
17
+ import './chunks/vidstack-nLyr4NEP.js';
18
+ import './chunks/vidstack-DsPOyKtl.js';
19
+ import './chunks/vidstack-Dihypf8P.js';
20
+ import './chunks/vidstack-C9vIqaYT.js';
21
+ import 'lit-html';
22
+ import './chunks/vidstack-CwTj4H1w.js';
23
+ import './chunks/vidstack-BSDzlwxO.js';
24
+ import './chunks/vidstack-ChQTHmIQ.js';
25
+ import './chunks/vidstack-D5EzK014.js';
26
+ import './chunks/vidstack-B01xzxC4.js';
27
+ import './chunks/vidstack-BiyXcJ_M.js';
28
+ import './chunks/vidstack-CF6fixCQ.js';
29
+ import './chunks/vidstack-Dq5Yu0Vr.js';
30
+ import 'lit-html/directives/if-defined.js';
31
+ import 'lit-html/directives/unsafe-svg.js';
32
+ import 'lit-html/async-directive.js';
33
+ import 'lit-html/directives/ref.js';
34
+ import 'lit-html/directives/keyed.js';
35
+ import './chunks/vidstack-DbkZGjSn.js';
36
+ import 'lit-html/directives/unsafe-html.js';
@@ -0,0 +1,158 @@
1
+ import { DOMEvent, isString, EventsController, useState } from './chunks/vidstack-BGSTndAW.js';
2
+ export { appendTriggerEvent, findTriggerEvent, hasTriggerEvent, isKeyboardClick, isKeyboardEvent, isPointerEvent, walkTriggerEventChain } from './chunks/vidstack-BGSTndAW.js';
3
+ export { AudioProviderLoader, AudioTrackList, DASHProviderLoader, FullscreenController, HLSProviderLoader, List, LocalMediaStorage, MEDIA_KEY_SHORTCUTS, MediaControls, MediaPlayer, MediaProvider, MediaRemoteControl, ScreenOrientationController, TextRenderers, TextTrackList, VideoProviderLoader, VideoQualityList, VimeoProviderLoader, YouTubeProviderLoader, boundTime, canFullscreen, isAudioProvider, isDASHProvider, isGoogleCastProvider, isHLSProvider, isHTMLAudioElement, isHTMLIFrameElement, isHTMLMediaElement, isHTMLVideoElement, isVideoProvider, isVideoQualitySrc, isVimeoProvider, isYouTubeProvider, mediaState, softResetMediaState } from './chunks/vidstack-BSDzlwxO.js';
4
+ export { mediaContext } from './chunks/vidstack-DJDnh4xT.js';
5
+ import { TextTrackSymbol } from './chunks/vidstack-Cm6_unwd.js';
6
+ export { TextTrack, isTrackCaptionKind, parseJSONCaptionsFile } from './chunks/vidstack-Cm6_unwd.js';
7
+ export { findActiveCue, isCueActive, watchActiveTextTrack, watchCueTextChange } from './chunks/vidstack-nLyr4NEP.js';
8
+ import { Thumbnail, Slider } from './chunks/vidstack-BoVf5n1M.js';
9
+ export { ARIAKeyShortcuts, AirPlayButton, AudioRadioGroup, CaptionButton, CaptionsRadioGroup, DEFAULT_PLAYBACK_RATES, FullscreenButton, LiveButton, Menu, MenuButton, MenuItem, MenuItems, MenuPortal, MuteButton, PIPButton, PlayButton, QualityRadioGroup, Radio, SeekButton, SliderController, SliderPreview, SliderValue, SpeedRadioGroup, ThumbnailsLoader, Time, TimeSlider, VolumeSlider, formatSpokenTime, formatTime, menuPortalContext, sliderContext, sliderState, sortVideoQualities, updateSliderPreviewPlacement } from './chunks/vidstack-BoVf5n1M.js';
10
+ export { TimeRange, getTimeRangesEnd, getTimeRangesStart, normalizeTimeIntervals, updateTimeIntervals } from './chunks/vidstack-ChQTHmIQ.js';
11
+ export { AudioGainRadioGroup, AudioGainSlider, Captions, ChaptersRadioGroup, Controls, ControlsGroup, DEFAULT_AUDIO_GAINS, Gesture, GoogleCastButton, MediaAnnouncer, QualitySlider, RadioGroup, SliderChapters, SliderVideo, SpeedSlider, ToggleButton, Tooltip, TooltipContent, TooltipTrigger } from './chunks/vidstack-BPitBBjh.js';
12
+ export { Poster } from './chunks/vidstack-BiyXcJ_M.js';
13
+ export { usePlyrLayoutClasses } from './chunks/vidstack-DbkZGjSn.js';
14
+ export { getDownloadFile } from './chunks/vidstack-CTojmhKq.js';
15
+ export { AUDIO_EXTENSIONS, AUDIO_TYPES, DASH_VIDEO_EXTENSIONS, DASH_VIDEO_TYPES, HLS_VIDEO_EXTENSIONS, HLS_VIDEO_TYPES, VIDEO_EXTENSIONS, VIDEO_TYPES, canChangeVolume, canGoogleCastSrc, canOrientScreen, canPlayHLSNatively, canRotateScreen, canUsePictureInPicture, canUseVideoPresentation, isAudioSrc, isDASHSrc, isHLSSrc, isMediaStream, isVideoSrc } from './chunks/vidstack-xMS8dnYq.js';
16
+ import './chunks/vidstack-D5EzK014.js';
17
+ import './chunks/vidstack-B01xzxC4.js';
18
+ import './chunks/vidstack-C2US-gSO.js';
19
+ import '@floating-ui/dom';
20
+ import './chunks/vidstack-C9vIqaYT.js';
21
+ import './chunks/vidstack-Dihypf8P.js';
22
+ import './chunks/vidstack-DsPOyKtl.js';
23
+
24
+ const GROUPED_LOG = Symbol(0);
25
+ class GroupedLog {
26
+ constructor(logger, level, title, root, parent) {
27
+ this.logger = logger;
28
+ this.level = level;
29
+ this.title = title;
30
+ this.root = root;
31
+ this.parent = parent;
32
+ }
33
+ [GROUPED_LOG] = true;
34
+ logs = [];
35
+ log(...data) {
36
+ this.logs.push({ data });
37
+ return this;
38
+ }
39
+ labelledLog(label, ...data) {
40
+ this.logs.push({ label, data });
41
+ return this;
42
+ }
43
+ groupStart(title) {
44
+ return new GroupedLog(this.logger, this.level, title, this.root ?? this, this);
45
+ }
46
+ groupEnd() {
47
+ this.parent?.logs.push(this);
48
+ return this.parent ?? this;
49
+ }
50
+ dispatch() {
51
+ return this.logger.dispatch(this.level, this.root ?? this);
52
+ }
53
+ }
54
+
55
+ class Logger {
56
+ #target = null;
57
+ error(...data) {
58
+ return this.dispatch("error", ...data);
59
+ }
60
+ warn(...data) {
61
+ return this.dispatch("warn", ...data);
62
+ }
63
+ info(...data) {
64
+ return this.dispatch("info", ...data);
65
+ }
66
+ debug(...data) {
67
+ return this.dispatch("debug", ...data);
68
+ }
69
+ errorGroup(title) {
70
+ return new GroupedLog(this, "error", title);
71
+ }
72
+ warnGroup(title) {
73
+ return new GroupedLog(this, "warn", title);
74
+ }
75
+ infoGroup(title) {
76
+ return new GroupedLog(this, "info", title);
77
+ }
78
+ debugGroup(title) {
79
+ return new GroupedLog(this, "debug", title);
80
+ }
81
+ setTarget(newTarget) {
82
+ this.#target = newTarget;
83
+ }
84
+ dispatch(level, ...data) {
85
+ return this.#target?.dispatchEvent(
86
+ new DOMEvent("vds-log", {
87
+ bubbles: true,
88
+ composed: true,
89
+ detail: { level, data }
90
+ })
91
+ ) || false;
92
+ }
93
+ }
94
+
95
+ class LibASSTextRenderer {
96
+ constructor(loader, config) {
97
+ this.loader = loader;
98
+ this.config = config;
99
+ }
100
+ priority = 1;
101
+ #instance = null;
102
+ #track = null;
103
+ #typeRE = /(ssa|ass)$/;
104
+ canRender(track, video) {
105
+ return !!video && !!track.src && (isString(track.type) && this.#typeRE.test(track.type) || this.#typeRE.test(track.src));
106
+ }
107
+ attach(video) {
108
+ if (!video) return;
109
+ this.loader().then(async (mod) => {
110
+ this.#instance = new mod.default({
111
+ ...this.config,
112
+ video,
113
+ subUrl: this.#track?.src || ""
114
+ });
115
+ new EventsController(this.#instance).add("ready", () => {
116
+ const canvas = this.#instance?._canvas;
117
+ if (canvas) canvas.style.pointerEvents = "none";
118
+ }).add("error", (event) => {
119
+ if (!this.#track) return;
120
+ this.#track[TextTrackSymbol.readyState] = 3;
121
+ this.#track.dispatchEvent(
122
+ new DOMEvent("error", {
123
+ trigger: event,
124
+ detail: event.error
125
+ })
126
+ );
127
+ });
128
+ });
129
+ }
130
+ changeTrack(track) {
131
+ if (!track || track.readyState === 3) {
132
+ this.#freeTrack();
133
+ } else if (this.#track !== track) {
134
+ this.#instance?.setTrackByUrl(track.src);
135
+ this.#track = track;
136
+ }
137
+ }
138
+ detach() {
139
+ this.#freeTrack();
140
+ }
141
+ #freeTrack() {
142
+ this.#instance?.freeTrack();
143
+ this.#track = null;
144
+ }
145
+ }
146
+
147
+ class SliderThumbnail extends Thumbnail {
148
+ #slider;
149
+ onAttach(el) {
150
+ this.#slider = useState(Slider.state);
151
+ }
152
+ getTime() {
153
+ const { duration, clipStartTime } = this.media.$state;
154
+ return clipStartTime() + this.#slider.pointerRate() * duration();
155
+ }
156
+ }
157
+
158
+ export { LibASSTextRenderer, Logger, Slider, SliderThumbnail, Thumbnail };
@@ -0,0 +1,29 @@
1
+ import { Icon$24, effect } from './vidstack-Wn3NH5Sg.js';
2
+ import { cloneTemplateContent, createTemplate } from './vidstack-DLU3cjcp.js';
3
+ import '@floating-ui/dom';
4
+
5
+ const svgTemplate = /* @__PURE__ */ createTemplate(
6
+ `<svg viewBox="0 0 32 32" fill="none" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"></svg>`
7
+ );
8
+ function insertContent(container, $state) {
9
+ const icon = cloneTemplateContent(svgTemplate);
10
+ icon.innerHTML = Icon$24;
11
+ container.append(icon);
12
+ const text = document.createElement("span");
13
+ text.classList.add("vds-google-cast-info");
14
+ container.append(text);
15
+ const deviceName = document.createElement("span");
16
+ deviceName.classList.add("vds-google-cast-device-name");
17
+ effect(() => {
18
+ const { remotePlaybackInfo } = $state, info = remotePlaybackInfo();
19
+ if (info?.deviceName) {
20
+ deviceName.textContent = info.deviceName;
21
+ text.append("Google Cast on ", deviceName);
22
+ }
23
+ return () => {
24
+ text.textContent = "";
25
+ };
26
+ });
27
+ }
28
+
29
+ export { insertContent };