@videojs/html 10.0.0-beta.21 → 10.0.0-beta.22

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 (193) hide show
  1. package/cdn/audio-minimal-ui.dev.js +3 -3
  2. package/cdn/audio-minimal-ui.js +1 -1
  3. package/cdn/audio-minimal.dev.js +5 -5
  4. package/cdn/audio-minimal.js +1 -1
  5. package/cdn/audio-ui.dev.js +3 -3
  6. package/cdn/audio-ui.js +1 -1
  7. package/cdn/audio.dev.js +5 -5
  8. package/cdn/audio.js +1 -1
  9. package/cdn/background.dev.js +1 -1
  10. package/cdn/background.js +1 -1
  11. package/cdn/compounds-CCgS3IGo.js +8 -0
  12. package/cdn/compounds-CCgS3IGo.js.map +1 -0
  13. package/cdn/{compounds-CM_NP-ej.js → compounds-DD3MYkSc.js} +7 -4
  14. package/cdn/compounds-DD3MYkSc.js.map +1 -0
  15. package/cdn/create-player-B-PGzhq2.js +7 -0
  16. package/cdn/create-player-B-PGzhq2.js.map +1 -0
  17. package/cdn/{create-player-Bi6WUwDZ.js → create-player-BKLw7l1a.js} +123 -59
  18. package/cdn/create-player-BKLw7l1a.js.map +1 -0
  19. package/cdn/default-Djy9PEXm.js +2 -0
  20. package/cdn/default-Djy9PEXm.js.map +1 -0
  21. package/cdn/{default-XHZAb7gP.js → default-YzaLyoYg.js} +3 -1
  22. package/cdn/default-YzaLyoYg.js.map +1 -0
  23. package/cdn/{hls-BotloEPN.js → hls-CcSAx_3I.js} +5 -5
  24. package/cdn/{hls-BotloEPN.js.map → hls-CcSAx_3I.js.map} +1 -1
  25. package/cdn/{hls-CBpGTZXU.js → hls-Dl2v35sW.js} +3 -3
  26. package/cdn/{hls-CBpGTZXU.js.map → hls-Dl2v35sW.js.map} +1 -1
  27. package/cdn/{hotkey-element-317kwVH5.js → hotkey-element-BONs_FyJ.js} +3 -3
  28. package/cdn/{hotkey-element-317kwVH5.js.map → hotkey-element-BONs_FyJ.js.map} +1 -1
  29. package/cdn/{hotkey-element-DRGCbVj9.js → hotkey-element-DWWkfH3A.js} +2 -2
  30. package/cdn/{hotkey-element-DRGCbVj9.js.map → hotkey-element-DWWkfH3A.js.map} +1 -1
  31. package/cdn/media/dash-video.dev.js +1 -1
  32. package/cdn/media/dash-video.js +1 -1
  33. package/cdn/media/hls-video.dev.js +2 -2
  34. package/cdn/media/hls-video.js +1 -1
  35. package/cdn/media/mux-audio.dev.js +3 -3
  36. package/cdn/media/mux-audio.js +1 -1
  37. package/cdn/media/mux-video.dev.js +3 -3
  38. package/cdn/media/mux-video.js +1 -1
  39. package/cdn/media/native-hls-video.dev.js +2 -2
  40. package/cdn/media/native-hls-video.js +1 -1
  41. package/cdn/media/simple-hls-video.dev.js +1 -1
  42. package/cdn/media/simple-hls-video.js +1 -1
  43. package/cdn/{minimal-BnDnlwbj.js → minimal-AX_y2YBU.js} +3 -1
  44. package/cdn/minimal-AX_y2YBU.js.map +1 -0
  45. package/cdn/minimal-Bc74CFqg.js +2 -0
  46. package/cdn/minimal-Bc74CFqg.js.map +1 -0
  47. package/cdn/{minimal-ui-DhxN21v5.js → minimal-ui-CE1sVxKB.js} +4 -4
  48. package/cdn/{minimal-ui-DhxN21v5.js.map → minimal-ui-CE1sVxKB.js.map} +1 -1
  49. package/cdn/minimal-ui-hC8-_9_F.js +2 -0
  50. package/cdn/{minimal-ui-CroDYUGf.js.map → minimal-ui-hC8-_9_F.js.map} +1 -1
  51. package/cdn/minimal-ui-lnw8AjaS.js +2 -0
  52. package/cdn/minimal-ui-lnw8AjaS.js.map +1 -0
  53. package/cdn/{minimal-ui-cy2oEbFm.js → minimal-ui-yKur3jyD.js} +5 -4
  54. package/cdn/minimal-ui-yKur3jyD.js.map +1 -0
  55. package/cdn/mux-BgWl50KW.js +27 -0
  56. package/cdn/mux-BgWl50KW.js.map +1 -0
  57. package/cdn/{mux-B5K6kOzg.js → mux-BhHIeG3e.js} +716 -5
  58. package/cdn/mux-BhHIeG3e.js.map +1 -0
  59. package/cdn/{native-hls-CU2F7L5C.js → native-hls-lhip4tV9.js} +2 -2
  60. package/cdn/{native-hls-CU2F7L5C.js.map → native-hls-lhip4tV9.js.map} +1 -1
  61. package/cdn/{native-hls-DKcYYWRt.js → native-hls-odPBXxK7.js} +2 -2
  62. package/cdn/{native-hls-DKcYYWRt.js.map → native-hls-odPBXxK7.js.map} +1 -1
  63. package/cdn/player-B7jISTmQ.js +2 -0
  64. package/cdn/player-B7jISTmQ.js.map +1 -0
  65. package/cdn/{player-xstFHOgW.js → player-BVGWmIbQ.js} +2 -2
  66. package/cdn/{player-xstFHOgW.js.map → player-BVGWmIbQ.js.map} +1 -1
  67. package/cdn/player-ChdQN3H5.js +2 -0
  68. package/cdn/{player-BK35-ndY.js.map → player-ChdQN3H5.js.map} +1 -1
  69. package/cdn/{player-CatrGW7l.js → player-DX5Ka0vt.js} +85 -4
  70. package/cdn/player-DX5Ka0vt.js.map +1 -0
  71. package/cdn/{skin-element-CDUkmCtS.js → skin-element-D3iVinGP.js} +2 -2
  72. package/cdn/{skin-element-CDUkmCtS.js.map → skin-element-D3iVinGP.js.map} +1 -1
  73. package/cdn/{skin-element-BGP23sop.js → skin-element-DM82PPxz.js} +2 -2
  74. package/cdn/{skin-element-BGP23sop.js.map → skin-element-DM82PPxz.js.map} +1 -1
  75. package/cdn/ui-BGvi0TNr.js +2 -0
  76. package/cdn/{ui-QHwo6iyo.js.map → ui-BGvi0TNr.js.map} +1 -1
  77. package/cdn/ui-BN57BxYZ.js +2 -0
  78. package/cdn/ui-BN57BxYZ.js.map +1 -0
  79. package/cdn/{ui-AFHQtrqa.js → ui-CKR6dVbQ.js} +5 -5
  80. package/cdn/{ui-AFHQtrqa.js.map → ui-CKR6dVbQ.js.map} +1 -1
  81. package/cdn/{ui-Em9rF9Ah.js → ui-CZ4yl3t3.js} +6 -5
  82. package/cdn/ui-CZ4yl3t3.js.map +1 -0
  83. package/cdn/{video-host-ycP7ckxU.js → video-host-BtD61mpF.js} +60 -30
  84. package/cdn/{video-host-ycP7ckxU.js.map → video-host-BtD61mpF.js.map} +1 -1
  85. package/cdn/{video-host-CPRJVRi3.js → video-host-LeB1FKfO.js} +2 -2
  86. package/cdn/{video-host-CPRJVRi3.js.map → video-host-LeB1FKfO.js.map} +1 -1
  87. package/cdn/video-minimal-ui.dev.js +3 -3
  88. package/cdn/video-minimal-ui.js +1 -1
  89. package/cdn/video-minimal.dev.js +12 -6
  90. package/cdn/video-minimal.dev.js.map +1 -1
  91. package/cdn/video-minimal.js +1 -1
  92. package/cdn/video-minimal.js.map +1 -1
  93. package/cdn/video-ui.dev.js +3 -3
  94. package/cdn/video-ui.js +1 -1
  95. package/cdn/video.dev.js +12 -6
  96. package/cdn/video.dev.js.map +1 -1
  97. package/cdn/video.js +1 -1
  98. package/cdn/video.js.map +1 -1
  99. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  100. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  101. package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
  102. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  103. package/dist/default/define/ui/cast-button.js +7 -0
  104. package/dist/default/define/ui/cast-button.js.map +1 -0
  105. package/dist/default/define/video/minimal-skin.css +6 -0
  106. package/dist/default/define/video/minimal-skin.js +1 -1
  107. package/dist/default/define/video/minimal-skin.js.map +1 -1
  108. package/dist/default/define/video/minimal-skin.tailwind.js +1 -1
  109. package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
  110. package/dist/default/define/video/minimal-ui.js +2 -0
  111. package/dist/default/define/video/minimal-ui.js.map +1 -1
  112. package/dist/default/define/video/skin.css +6 -0
  113. package/dist/default/define/video/skin.js +1 -1
  114. package/dist/default/define/video/skin.js.map +1 -1
  115. package/dist/default/define/video/skin.tailwind.js +1 -1
  116. package/dist/default/define/video/skin.tailwind.js.map +1 -1
  117. package/dist/default/define/video/ui.js +2 -0
  118. package/dist/default/define/video/ui.js.map +1 -1
  119. package/dist/default/icons/dist/render/default/index.js +2 -0
  120. package/dist/default/icons/dist/render/default/index.js.map +1 -1
  121. package/dist/default/icons/dist/render/minimal/index.js +2 -0
  122. package/dist/default/icons/dist/render/minimal/index.js.map +1 -1
  123. package/dist/default/index.js +2 -1
  124. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js +5 -0
  125. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
  126. package/dist/default/ui/cast-button/cast-button-element.js +24 -0
  127. package/dist/default/ui/cast-button/cast-button-element.js.map +1 -0
  128. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  129. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  130. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
  131. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  132. package/dist/dev/define/ui/cast-button.d.ts +9 -0
  133. package/dist/dev/define/ui/cast-button.d.ts.map +1 -0
  134. package/dist/dev/define/ui/cast-button.js +7 -0
  135. package/dist/dev/define/ui/cast-button.js.map +1 -0
  136. package/dist/dev/define/video/minimal-skin.css +6 -0
  137. package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
  138. package/dist/dev/define/video/minimal-skin.js +6 -0
  139. package/dist/dev/define/video/minimal-skin.js.map +1 -1
  140. package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
  141. package/dist/dev/define/video/minimal-skin.tailwind.js +5 -0
  142. package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
  143. package/dist/dev/define/video/minimal-ui.js +2 -0
  144. package/dist/dev/define/video/minimal-ui.js.map +1 -1
  145. package/dist/dev/define/video/skin.css +6 -0
  146. package/dist/dev/define/video/skin.d.ts.map +1 -1
  147. package/dist/dev/define/video/skin.js +6 -0
  148. package/dist/dev/define/video/skin.js.map +1 -1
  149. package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
  150. package/dist/dev/define/video/skin.tailwind.js +5 -0
  151. package/dist/dev/define/video/skin.tailwind.js.map +1 -1
  152. package/dist/dev/define/video/ui.js +2 -0
  153. package/dist/dev/define/video/ui.js.map +1 -1
  154. package/dist/dev/icons/dist/render/default/index.js +2 -0
  155. package/dist/dev/icons/dist/render/default/index.js.map +1 -1
  156. package/dist/dev/icons/dist/render/minimal/index.js +2 -0
  157. package/dist/dev/icons/dist/render/minimal/index.js.map +1 -1
  158. package/dist/dev/index.d.ts +2 -1
  159. package/dist/dev/index.js +2 -1
  160. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js +5 -0
  161. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
  162. package/dist/dev/ui/cast-button/cast-button-element.d.ts +19 -0
  163. package/dist/dev/ui/cast-button/cast-button-element.d.ts.map +1 -0
  164. package/dist/dev/ui/cast-button/cast-button-element.js +24 -0
  165. package/dist/dev/ui/cast-button/cast-button-element.js.map +1 -0
  166. package/package.json +8 -8
  167. package/cdn/compounds-CM_NP-ej.js.map +0 -1
  168. package/cdn/compounds-Vvz-YfXP.js +0 -8
  169. package/cdn/compounds-Vvz-YfXP.js.map +0 -1
  170. package/cdn/create-player-Bi6WUwDZ.js.map +0 -1
  171. package/cdn/create-player-CKuX8YI5.js +0 -7
  172. package/cdn/create-player-CKuX8YI5.js.map +0 -1
  173. package/cdn/default-C8KsZ0zK.js +0 -2
  174. package/cdn/default-C8KsZ0zK.js.map +0 -1
  175. package/cdn/default-XHZAb7gP.js.map +0 -1
  176. package/cdn/minimal-BnDnlwbj.js.map +0 -1
  177. package/cdn/minimal-CqBxBoLe.js +0 -2
  178. package/cdn/minimal-CqBxBoLe.js.map +0 -1
  179. package/cdn/minimal-ui-C_G24FML.js +0 -2
  180. package/cdn/minimal-ui-C_G24FML.js.map +0 -1
  181. package/cdn/minimal-ui-CroDYUGf.js +0 -2
  182. package/cdn/minimal-ui-cy2oEbFm.js.map +0 -1
  183. package/cdn/mux-B5K6kOzg.js.map +0 -1
  184. package/cdn/mux-DJhfbcCw.js +0 -25
  185. package/cdn/mux-DJhfbcCw.js.map +0 -1
  186. package/cdn/player-BK35-ndY.js +0 -2
  187. package/cdn/player-C7ajkBi4.js +0 -2
  188. package/cdn/player-C7ajkBi4.js.map +0 -1
  189. package/cdn/player-CatrGW7l.js.map +0 -1
  190. package/cdn/ui-B7vt9mp-.js +0 -2
  191. package/cdn/ui-B7vt9mp-.js.map +0 -1
  192. package/cdn/ui-Em9rF9Ah.js.map +0 -1
  193. package/cdn/ui-QHwo6iyo.js +0 -2
@@ -1,9 +1,720 @@
1
- import { n as Hls, t as HlsMedia } from "./hls-BotloEPN.js";
1
+ import { n as Hls, t as HlsMedia } from "./hls-CcSAx_3I.js";
2
2
 
3
+ //#region ../core/dist/dev/dom/media/castable/utils.js
4
+ var InvalidStateError = class extends Error {};
5
+ var NotSupportedError = class extends Error {};
6
+ var NotFoundError = class extends Error {};
7
+ const HLS_RESPONSE_HEADERS = [
8
+ "application/x-mpegURL",
9
+ "application/vnd.apple.mpegurl",
10
+ "audio/mpegurl"
11
+ ];
12
+ var IterableWeakSet = class {
13
+ #refs = /* @__PURE__ */ new Set();
14
+ #seen = /* @__PURE__ */ new WeakMap();
15
+ add(value) {
16
+ if (this.#seen.has(value)) return this;
17
+ const ref = new WeakRef(value);
18
+ this.#seen.set(value, ref);
19
+ this.#refs.add(ref);
20
+ return this;
21
+ }
22
+ delete(value) {
23
+ const ref = this.#seen.get(value);
24
+ if (!ref) return false;
25
+ this.#seen.delete(value);
26
+ return this.#refs.delete(ref);
27
+ }
28
+ forEach(fn) {
29
+ for (const ref of this.#refs) {
30
+ const value = ref.deref();
31
+ if (value) fn(value);
32
+ else this.#refs.delete(ref);
33
+ }
34
+ }
35
+ };
36
+ function onCastApiAvailable(callback) {
37
+ const whenDefined = () => customElements.whenDefined("google-cast-button").then(callback);
38
+ if (!globalThis.chrome?.cast?.isAvailable) globalThis.__onGCastApiAvailable = whenDefined;
39
+ else if (typeof cast === "undefined" || !cast.framework) whenDefined();
40
+ else callback();
41
+ }
42
+ function requiresCastFramework() {
43
+ return Boolean(globalThis.chrome);
44
+ }
45
+ function loadCastFramework() {
46
+ const sdkUrl = "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1";
47
+ if (globalThis.chrome?.cast || document.querySelector(`script[src="${sdkUrl}"]`)) return;
48
+ const script = document.createElement("script");
49
+ script.src = sdkUrl;
50
+ document.head.append(script);
51
+ }
52
+ function castContext() {
53
+ return typeof cast === "undefined" ? void 0 : cast.framework?.CastContext.getInstance();
54
+ }
55
+ function currentSession() {
56
+ return castContext()?.getCurrentSession();
57
+ }
58
+ function currentMedia() {
59
+ return currentSession()?.getSessionObj().media[0] ?? void 0;
60
+ }
61
+ function editTracksInfo(request) {
62
+ return new Promise((resolve, reject) => {
63
+ currentMedia().editTracksInfo(request, resolve, reject);
64
+ });
65
+ }
66
+ function getMediaStatus(request) {
67
+ return new Promise((resolve, reject) => {
68
+ currentMedia().getStatus(request, resolve, reject);
69
+ });
70
+ }
71
+ const MEDIA_NAMESPACE = "urn:x-cast:com.google.cast.media";
72
+ let requestId = 0;
73
+ function setPlaybackRate(rate) {
74
+ const media = currentMedia();
75
+ return currentSession().sendMessage(MEDIA_NAMESPACE, {
76
+ type: "SET_PLAYBACK_RATE",
77
+ playbackRate: rate,
78
+ mediaSessionId: media?.mediaSessionId,
79
+ requestId: ++requestId
80
+ });
81
+ }
82
+ function setCastOptions(options) {
83
+ castContext().setOptions({
84
+ ...getDefaultCastOptions(),
85
+ ...options
86
+ });
87
+ }
88
+ function getDefaultCastOptions() {
89
+ return {
90
+ receiverApplicationId: "CC1AD845",
91
+ autoJoinPolicy: globalThis.chrome?.cast?.AutoJoinPolicy?.ORIGIN_SCOPED ?? "origin_scoped",
92
+ androidReceiverCompatible: false,
93
+ language: "en-US",
94
+ resumeSavedSession: true
95
+ };
96
+ }
97
+ function getFormat(segment) {
98
+ if (!segment) return void 0;
99
+ const match = segment.match(/\.([a-zA-Z0-9]+)(?:\?.*)?$/);
100
+ return match ? match[1] : null;
101
+ }
102
+ function parsePlaylistUrls(playlistContent) {
103
+ const lines = playlistContent.split("\n");
104
+ const urls = [];
105
+ for (let i = 0; i < lines.length; i++) if (lines[i].trim().startsWith("#EXT-X-STREAM-INF")) {
106
+ const nextLine = lines[i + 1] ? lines[i + 1].trim() : "";
107
+ if (nextLine && !nextLine.startsWith("#")) urls.push(nextLine);
108
+ }
109
+ return urls;
110
+ }
111
+ function parseSegment(playlistContent) {
112
+ return playlistContent.split("\n").find((line) => !line.trim().startsWith("#") && line.trim() !== "");
113
+ }
114
+ async function isHls(url) {
115
+ if (!url) return false;
116
+ if (/\.m3u8?(\?.*)?$/i.test(url)) return true;
117
+ if (url.startsWith("blob:")) return false;
118
+ try {
119
+ const contentType = (await fetch(url, { method: "HEAD" })).headers.get("Content-Type");
120
+ if (!contentType) return false;
121
+ const normalizedContentType = contentType.toLowerCase().split(";")[0].trim();
122
+ return HLS_RESPONSE_HEADERS.some((header) => normalizedContentType === header.toLowerCase());
123
+ } catch (err) {
124
+ console.error("Error while trying to get the Content-Type of the manifest", err);
125
+ return false;
126
+ }
127
+ }
128
+ async function getPlaylistSegmentFormat(url) {
129
+ try {
130
+ const mainManifestContent = await (await fetch(url)).text();
131
+ let availableChunksContent = mainManifestContent;
132
+ const playlists = parsePlaylistUrls(mainManifestContent);
133
+ if (playlists.length > 0) {
134
+ const chosenPlaylistUrl = new URL(playlists[0], url).toString();
135
+ availableChunksContent = await (await fetch(chosenPlaylistUrl)).text();
136
+ }
137
+ return getFormat(parseSegment(availableChunksContent));
138
+ } catch (err) {
139
+ console.error("Error while trying to parse the manifest playlist", err);
140
+ return;
141
+ }
142
+ }
143
+
144
+ //#endregion
145
+ //#region ../core/dist/dev/dom/media/castable/google-cast-provider.js
146
+ const providerInstances = new IterableWeakSet();
147
+ const castElementRef = /* @__PURE__ */ new WeakSet();
148
+ let cf;
149
+ onCastApiAvailable(() => {
150
+ if (!globalThis.chrome?.cast?.isAvailable) {
151
+ console.debug("chrome.cast.isAvailable", globalThis.chrome?.cast?.isAvailable);
152
+ return;
153
+ }
154
+ if (!cf) {
155
+ cf = cast.framework;
156
+ castContext().addEventListener(cf.CastContextEventType.CAST_STATE_CHANGED, () => {
157
+ providerInstances.forEach((p) => p.onCastStateChanged());
158
+ });
159
+ castContext().addEventListener(cf.CastContextEventType.SESSION_STATE_CHANGED, () => {
160
+ providerInstances.forEach((p) => p.onSessionStateChanged());
161
+ });
162
+ providerInstances.forEach((p) => p.init());
163
+ }
164
+ });
165
+ var GoogleCastProvider = class {
166
+ media;
167
+ seeking = false;
168
+ #hooks = {};
169
+ #isInit = false;
170
+ #local;
171
+ #remote;
172
+ #remoteListeners;
173
+ #listenersAttached = false;
174
+ #playbackRate = 1;
175
+ #localPaused = false;
176
+ #onTextTrackChange = () => this.#updateRemoteTextTrack();
177
+ #onMediaUpdate = () => this.#checkPlaybackRate();
178
+ constructor(media, local) {
179
+ this.media = media;
180
+ this.#local = local;
181
+ providerInstances.add(this);
182
+ this.init();
183
+ }
184
+ bindHooks(hooks) {
185
+ Object.assign(this.#hooks, hooks);
186
+ }
187
+ get isCasting() {
188
+ return castElementRef.has(this.media);
189
+ }
190
+ set isCasting(value) {
191
+ if (value) castElementRef.add(this.media);
192
+ else castElementRef.delete(this.media);
193
+ }
194
+ hasDevicesAvailable() {
195
+ const state = castContext()?.getCastState();
196
+ return !!state && state !== cast.framework.CastState.NO_DEVICES_AVAILABLE;
197
+ }
198
+ async requestCastSession() {
199
+ if (!this.#isCastApiAvailable()) throw new NotSupportedError("The RemotePlayback API is disabled on this platform.");
200
+ const willDisconnect = this.isCasting;
201
+ this.isCasting = true;
202
+ this.#applyCastOptions();
203
+ this.#attachRemoteListeners();
204
+ try {
205
+ await castContext().requestSession();
206
+ } catch (err) {
207
+ if (!willDisconnect) this.isCasting = false;
208
+ if (err === "cancel") return;
209
+ throw new Error(err);
210
+ }
211
+ this.#localPaused = this.#local.paused();
212
+ this.#local.pause();
213
+ this.muted = this.#local.muted();
214
+ try {
215
+ await this.load();
216
+ } catch (err) {
217
+ console.error(err);
218
+ }
219
+ }
220
+ async load() {
221
+ const mediaInfo = new chrome.cast.media.MediaInfo(this.media.castSrc, this.media.castContentType ?? "");
222
+ mediaInfo.customData = this.media.castCustomData ?? null;
223
+ const subtitles = [...this.media.querySelectorAll("track")].filter((el) => el.src && (el.kind === "subtitles" || el.kind === "captions"));
224
+ const { Track, TrackType, TextTrackType } = chrome.cast.media;
225
+ const activeTrackIds = [];
226
+ if (subtitles.length) mediaInfo.tracks = subtitles.map((el, i) => {
227
+ const trackId = i + 1;
228
+ if (!activeTrackIds.length && el.track.mode === "showing") activeTrackIds.push(trackId);
229
+ const track = new Track(trackId, TrackType.TEXT);
230
+ track.trackContentId = el.src;
231
+ track.trackContentType = "text/vtt";
232
+ track.subtype = el.kind === "captions" ? TextTrackType.CAPTIONS : TextTrackType.SUBTITLES;
233
+ track.name = el.label;
234
+ track.language = el.srclang;
235
+ return track;
236
+ });
237
+ mediaInfo.streamType = this.media.castStreamType === "live" ? chrome.cast.media.StreamType.LIVE : chrome.cast.media.StreamType.BUFFERED;
238
+ mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();
239
+ mediaInfo.metadata.title = this.media.title;
240
+ mediaInfo.metadata.images = [new chrome.cast.Image(this.media.poster)];
241
+ if (await isHls(this.media.castSrc)) {
242
+ mediaInfo.contentType ||= "application/x-mpegURL";
243
+ const fmt = await getPlaylistSegmentFormat(this.media.castSrc) ?? "";
244
+ const { HlsSegmentFormat: HS, HlsVideoSegmentFormat: HVS } = chrome.cast.media;
245
+ if (fmt.includes("m4s") || fmt.includes("mp4")) {
246
+ mediaInfo.hlsSegmentFormat = HS.FMP4;
247
+ mediaInfo.hlsVideoSegmentFormat = HVS.FMP4;
248
+ } else if (fmt.includes("ts")) {
249
+ mediaInfo.hlsSegmentFormat = HS.TS;
250
+ mediaInfo.hlsVideoSegmentFormat = HVS.TS;
251
+ }
252
+ }
253
+ const request = new chrome.cast.media.LoadRequest(mediaInfo);
254
+ request.currentTime = this.#local.currentTime();
255
+ request.autoplay = !this.#localPaused;
256
+ request.activeTrackIds = activeTrackIds;
257
+ await currentSession()?.loadMedia(request);
258
+ this.media.dispatchEvent(new Event("volumechange"));
259
+ }
260
+ async play() {
261
+ if (!this.#remote.isMediaLoaded) {
262
+ this.#localPaused = false;
263
+ await this.load();
264
+ return;
265
+ }
266
+ if (this.paused) {
267
+ this.#remote.controller?.playOrPause();
268
+ return new Promise((resolve) => {
269
+ this.media.addEventListener("play", () => resolve(), { once: true });
270
+ });
271
+ }
272
+ }
273
+ pause() {
274
+ if (!this.paused) this.#remote.controller?.playOrPause();
275
+ }
276
+ get paused() {
277
+ return this.#remote.isPaused || this.ended;
278
+ }
279
+ get ended() {
280
+ return this.#remote.playerState === chrome.cast.media.PlayerState.IDLE && currentMedia()?.idleReason === chrome.cast.media.IdleReason.FINISHED;
281
+ }
282
+ get muted() {
283
+ return this.#remote.isMuted;
284
+ }
285
+ set muted(value) {
286
+ if (value !== this.#remote.isMuted) this.#remote.controller?.muteOrUnmute();
287
+ }
288
+ get volume() {
289
+ return this.#remote.volumeLevel ?? 1;
290
+ }
291
+ set volume(value) {
292
+ this.#remote.volumeLevel = +value;
293
+ this.#remote.controller?.setVolumeLevel();
294
+ }
295
+ get playbackRate() {
296
+ return currentMedia()?.playbackRate ?? 1;
297
+ }
298
+ set playbackRate(value) {
299
+ setPlaybackRate(value);
300
+ }
301
+ get duration() {
302
+ if (this.#remote?.isMediaLoaded) return this.#remote.duration ?? NaN;
303
+ return this.#local.duration();
304
+ }
305
+ get currentTime() {
306
+ if (this.#remote?.isMediaLoaded) return this.#remote.currentTime ?? 0;
307
+ return this.#local.currentTime();
308
+ }
309
+ set currentTime(value) {
310
+ this.#remote.currentTime = value;
311
+ this.#notifySeeking();
312
+ this.#remote.controller?.seek();
313
+ }
314
+ get readyState() {
315
+ switch (this.#remote.playerState) {
316
+ case chrome.cast.media.PlayerState.IDLE: return 0;
317
+ case chrome.cast.media.PlayerState.BUFFERING: return 2;
318
+ default: return 3;
319
+ }
320
+ }
321
+ init() {
322
+ if (!cf || this.#isInit) return;
323
+ this.#isInit = true;
324
+ this.#applyCastOptions();
325
+ this.media.textTracks.addEventListener("change", this.#onTextTrackChange);
326
+ this.onCastStateChanged();
327
+ this.#remote = new cf.RemotePlayer();
328
+ new cf.RemotePlayerController(this.#remote);
329
+ this.#remoteListeners = {
330
+ [cf.RemotePlayerEventType.IS_CONNECTED_CHANGED]: (event) => {
331
+ if (event?.value === true) this.#hooks.setState?.("connected");
332
+ else {
333
+ this.#disconnect();
334
+ this.#hooks.setState?.("disconnected");
335
+ }
336
+ },
337
+ [cf.RemotePlayerEventType.DURATION_CHANGED]: () => {
338
+ this.media.dispatchEvent(new Event("durationchange"));
339
+ },
340
+ [cf.RemotePlayerEventType.VOLUME_LEVEL_CHANGED]: () => {
341
+ this.media.dispatchEvent(new Event("volumechange"));
342
+ },
343
+ [cf.RemotePlayerEventType.IS_MUTED_CHANGED]: () => {
344
+ this.media.dispatchEvent(new Event("volumechange"));
345
+ },
346
+ [cf.RemotePlayerEventType.CURRENT_TIME_CHANGED]: () => {
347
+ if (!this.isCasting || !this.#remote.isMediaLoaded) return;
348
+ this.#notifySeeked();
349
+ this.media.dispatchEvent(new Event("timeupdate"));
350
+ },
351
+ [cf.RemotePlayerEventType.VIDEO_INFO_CHANGED]: () => {
352
+ this.media.dispatchEvent(new Event("resize"));
353
+ },
354
+ [cf.RemotePlayerEventType.IS_PAUSED_CHANGED]: () => {
355
+ this.media.dispatchEvent(new Event(this.isCasting && this.#remote.isPaused ? "pause" : "play"));
356
+ },
357
+ [cf.RemotePlayerEventType.PLAYER_STATE_CHANGED]: () => {
358
+ const PS = chrome.cast.media.PlayerState;
359
+ const state = this.isCasting ? this.#remote.playerState : void 0;
360
+ if (state !== PS.BUFFERING) this.#notifySeeked();
361
+ if (state === PS.PAUSED) return;
362
+ if (state === PS.IDLE) {
363
+ const finished = currentMedia()?.idleReason === chrome.cast.media.IdleReason.FINISHED;
364
+ this.media.dispatchEvent(new Event(finished ? "ended" : "emptied"));
365
+ return;
366
+ }
367
+ if (state === PS.PLAYING) this.media.dispatchEvent(new Event("playing"));
368
+ else if (state === PS.BUFFERING) this.media.dispatchEvent(new Event("waiting"));
369
+ },
370
+ [cf.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED]: async () => {
371
+ if (!this.isCasting || !this.#remote.isMediaLoaded) return;
372
+ await Promise.resolve();
373
+ this.#onRemoteMediaLoaded();
374
+ }
375
+ };
376
+ }
377
+ onCastStateChanged() {
378
+ if (!this.#isInit) return;
379
+ const CS = cast.framework.CastState;
380
+ const state = castContext().getCastState();
381
+ if (this.isCasting && state === CS.CONNECTING) this.#hooks.setState?.("connecting");
382
+ this.#hooks.setAvailable?.(!!state && state !== CS.NO_DEVICES_AVAILABLE);
383
+ }
384
+ async onSessionStateChanged() {
385
+ if (!this.#isInit) return;
386
+ const { SESSION_RESUMED } = cf.SessionState;
387
+ if (castContext().getSessionState() === SESSION_RESUMED) {
388
+ if (this.media.castSrc === currentMedia()?.media?.contentId) {
389
+ castElementRef.add(this.media);
390
+ this.#attachRemoteListeners();
391
+ try {
392
+ await getMediaStatus(new chrome.cast.media.GetStatusRequest());
393
+ } catch (error) {
394
+ console.error(error);
395
+ }
396
+ this.#remoteListeners[cf.RemotePlayerEventType.IS_PAUSED_CHANGED]();
397
+ this.#remoteListeners[cf.RemotePlayerEventType.PLAYER_STATE_CHANGED]();
398
+ this.media.dispatchEvent(new Event("ratechange"));
399
+ }
400
+ }
401
+ }
402
+ destroy() {
403
+ providerInstances.delete(this);
404
+ currentMedia()?.removeUpdateListener(this.#onMediaUpdate);
405
+ this.media.textTracks?.removeEventListener("change", this.#onTextTrackChange);
406
+ this.#detachRemoteListeners();
407
+ this.isCasting = false;
408
+ this.#isInit = false;
409
+ }
410
+ #isCastApiAvailable() {
411
+ return Boolean(globalThis.chrome?.cast?.isAvailable);
412
+ }
413
+ #applyCastOptions() {
414
+ setCastOptions(this.media.castOptions);
415
+ }
416
+ #attachRemoteListeners() {
417
+ if (this.#listenersAttached) return;
418
+ const controller = this.#remote?.controller;
419
+ if (!controller) return;
420
+ for (const [type, handler] of Object.entries(this.#remoteListeners)) controller.addEventListener(type, handler);
421
+ this.#listenersAttached = true;
422
+ }
423
+ #detachRemoteListeners() {
424
+ if (!this.#listenersAttached) return;
425
+ const controller = this.#remote?.controller;
426
+ if (controller) for (const [type, handler] of Object.entries(this.#remoteListeners)) controller.removeEventListener(type, handler);
427
+ this.#listenersAttached = false;
428
+ }
429
+ #disconnect() {
430
+ if (!this.isCasting) return;
431
+ currentMedia()?.removeUpdateListener(this.#onMediaUpdate);
432
+ this.#detachRemoteListeners();
433
+ this.seeking = false;
434
+ this.#playbackRate = 1;
435
+ this.isCasting = false;
436
+ this.media.muted = this.#remote.isMuted;
437
+ const saved = this.#remote.savedPlayerState;
438
+ if (saved) {
439
+ this.media.currentTime = saved.currentTime;
440
+ if (saved.isPaused === false) this.media.play();
441
+ }
442
+ }
443
+ #notifySeeking() {
444
+ this.seeking = true;
445
+ this.media.dispatchEvent(new Event("seeking"));
446
+ }
447
+ #notifySeeked() {
448
+ if (!this.seeking) return;
449
+ this.seeking = false;
450
+ this.media.dispatchEvent(new Event("seeked"));
451
+ }
452
+ #onRemoteMediaLoaded() {
453
+ this.#playbackRate = currentMedia()?.playbackRate ?? 1;
454
+ currentMedia()?.addUpdateListener(this.#onMediaUpdate);
455
+ this.#updateRemoteTextTrack();
456
+ }
457
+ #checkPlaybackRate() {
458
+ const rate = currentMedia()?.playbackRate ?? 1;
459
+ if (rate !== this.#playbackRate) {
460
+ this.#playbackRate = rate;
461
+ this.media.dispatchEvent(new Event("ratechange"));
462
+ }
463
+ }
464
+ async #updateRemoteTextTrack() {
465
+ if (!this.isCasting) return;
466
+ const localSubs = [...this.media.textTracks].filter(({ kind }) => kind === "subtitles" || kind === "captions");
467
+ const matched = (this.#remote.mediaInfo?.tracks ?? []).filter(({ type }) => type === chrome.cast.media.TrackType.TEXT).flatMap(({ language, name, trackId }) => {
468
+ const local = localSubs.find((l) => l.language === language && l.label === name);
469
+ return local?.mode ? [{
470
+ mode: local.mode,
471
+ trackId
472
+ }] : [];
473
+ });
474
+ const hidden = new Set(matched.filter((m) => m.mode !== "showing").map((m) => m.trackId));
475
+ const showing = matched.find((m) => m.mode === "showing")?.trackId;
476
+ const active = currentSession()?.getSessionObj().media[0]?.activeTrackIds ?? [];
477
+ const next = new Set(active.filter((id) => !hidden.has(id)));
478
+ if (showing) next.add(showing);
479
+ if (next.size === active.length && active.every((id) => next.has(id))) return;
480
+ try {
481
+ await editTracksInfo(new chrome.cast.media.EditTracksInfoRequest([...next]));
482
+ } catch (error) {
483
+ console.error(error);
484
+ }
485
+ }
486
+ };
487
+
488
+ //#endregion
489
+ //#region ../core/dist/dev/dom/media/castable/remote-playback.js
490
+ let callbackIdCount = 0;
491
+ var RemotePlayback = class extends EventTarget {
492
+ #provider;
493
+ #state = "disconnected";
494
+ #available = false;
495
+ #callbacks = /* @__PURE__ */ new Map();
496
+ constructor(provider) {
497
+ super();
498
+ this.#provider = provider;
499
+ provider.bindHooks({
500
+ setState: (next) => this.#setState(next),
501
+ setAvailable: (available) => this.#setAvailable(available)
502
+ });
503
+ }
504
+ get state() {
505
+ return this.#state;
506
+ }
507
+ async watchAvailability(callback) {
508
+ this.#assertEnabled();
509
+ const id = ++callbackIdCount;
510
+ this.#callbacks.set(id, callback);
511
+ queueMicrotask(() => callback(this.#provider.hasDevicesAvailable()));
512
+ return id;
513
+ }
514
+ async cancelWatchAvailability(callbackId) {
515
+ this.#assertEnabled();
516
+ if (callbackId === void 0) {
517
+ this.#callbacks.clear();
518
+ return;
519
+ }
520
+ if (!this.#callbacks.delete(callbackId)) throw new NotFoundError(`Callback not found for id ${callbackId}.`);
521
+ }
522
+ async prompt() {
523
+ this.#assertEnabled();
524
+ await this.#provider.requestCastSession();
525
+ }
526
+ #assertEnabled() {
527
+ if (this.#provider.media.disableRemotePlayback) throw new InvalidStateError("disableRemotePlayback attribute is present.");
528
+ }
529
+ #setState(next) {
530
+ if (this.#state === next) return;
531
+ this.#state = next;
532
+ if (next === "connecting") this.dispatchEvent(new Event("connecting"));
533
+ else if (next === "connected") this.dispatchEvent(new Event("connect"));
534
+ else this.dispatchEvent(new Event("disconnect"));
535
+ }
536
+ #setAvailable(available) {
537
+ if (this.#available === available) return;
538
+ this.#available = available;
539
+ for (const callback of this.#callbacks.values()) callback(available);
540
+ }
541
+ };
542
+
543
+ //#endregion
544
+ //#region ../core/dist/dev/dom/media/castable/index.js
545
+ const CastableMediaMixin = (superclass) => {
546
+ class CastableMedia extends superclass {
547
+ #castOptions = getDefaultCastOptions();
548
+ #castCustomData;
549
+ #castSrc;
550
+ #castContentType;
551
+ #castStreamType;
552
+ #castReceiver;
553
+ #remote;
554
+ #provider;
555
+ #destroyed = false;
556
+ get remote() {
557
+ if (this.#remote) return this.#remote;
558
+ if (this.#destroyed) return super.remote;
559
+ if (requiresCastFramework()) {
560
+ if (!this.disableRemotePlayback) loadCastFramework();
561
+ this.#provider = new GoogleCastProvider(this, {
562
+ duration: () => super.duration,
563
+ currentTime: () => super.currentTime,
564
+ paused: () => super.paused,
565
+ muted: () => super.muted,
566
+ pause: () => super.pause()
567
+ });
568
+ return this.#remote = new RemotePlayback(this.#provider);
569
+ }
570
+ return super.remote;
571
+ }
572
+ attach(target) {
573
+ super.attach(target);
574
+ if (requiresCastFramework() && !this.disableRemotePlayback) loadCastFramework();
575
+ }
576
+ detach() {
577
+ super.detach();
578
+ }
579
+ destroy() {
580
+ this.#provider?.destroy();
581
+ this.#provider = null;
582
+ this.#remote = null;
583
+ this.#destroyed = true;
584
+ super.destroy();
585
+ }
586
+ async load() {
587
+ if (!this.#provider?.isCasting) return super.load();
588
+ return this.#provider.load();
589
+ }
590
+ play() {
591
+ if (this.#provider?.isCasting) return this.#provider.play();
592
+ return super.play();
593
+ }
594
+ pause() {
595
+ if (this.#provider?.isCasting) {
596
+ this.#provider.pause();
597
+ return;
598
+ }
599
+ super.pause();
600
+ }
601
+ get castOptions() {
602
+ return this.#castOptions;
603
+ }
604
+ get castReceiver() {
605
+ return this.#castReceiver;
606
+ }
607
+ set castReceiver(val) {
608
+ if (this.#castReceiver === val) return;
609
+ this.#castReceiver = val;
610
+ if (val) this.#castOptions.receiverApplicationId = val;
611
+ }
612
+ get castSrc() {
613
+ return this.#castSrc ?? this.querySelector("source")?.src ?? this.src ?? this.currentSrc;
614
+ }
615
+ set castSrc(val) {
616
+ if (this.#castSrc === val) return;
617
+ this.#castSrc = val;
618
+ if (this.#provider?.isCasting) this.load();
619
+ }
620
+ get castContentType() {
621
+ return this.#castContentType;
622
+ }
623
+ set castContentType(val) {
624
+ this.#castContentType = val;
625
+ }
626
+ get castStreamType() {
627
+ return this.#castStreamType ?? this.streamType;
628
+ }
629
+ set castStreamType(val) {
630
+ if (this.#castStreamType === val) return;
631
+ this.#castStreamType = val;
632
+ if (this.#provider?.isCasting) this.load();
633
+ }
634
+ get castCustomData() {
635
+ return this.#castCustomData;
636
+ }
637
+ set castCustomData(val) {
638
+ const valType = typeof val;
639
+ if (!["object", "undefined"].includes(valType)) {
640
+ console.error(`castCustomData must be nullish or an object but value was of type ${valType}`);
641
+ return;
642
+ }
643
+ this.#castCustomData = val;
644
+ }
645
+ get seeking() {
646
+ if (this.#provider?.isCasting) return this.#provider.seeking;
647
+ return super.seeking;
648
+ }
649
+ get readyState() {
650
+ if (this.#provider?.isCasting) return this.#provider.readyState;
651
+ return super.readyState;
652
+ }
653
+ get paused() {
654
+ if (this.#provider?.isCasting) return this.#provider.paused;
655
+ return super.paused;
656
+ }
657
+ get ended() {
658
+ if (this.#provider?.isCasting) return this.#provider.ended;
659
+ return super.ended;
660
+ }
661
+ get muted() {
662
+ if (this.#provider?.isCasting) return this.#provider.muted;
663
+ return super.muted;
664
+ }
665
+ set muted(val) {
666
+ if (this.#provider?.isCasting) {
667
+ this.#provider.muted = val;
668
+ return;
669
+ }
670
+ super.muted = val;
671
+ }
672
+ get volume() {
673
+ if (this.#provider?.isCasting) return this.#provider.volume;
674
+ return super.volume;
675
+ }
676
+ set volume(val) {
677
+ if (this.#provider?.isCasting) {
678
+ this.#provider.volume = val;
679
+ return;
680
+ }
681
+ super.volume = val;
682
+ }
683
+ get playbackRate() {
684
+ if (this.#provider?.isCasting) return this.#provider.playbackRate;
685
+ return super.playbackRate;
686
+ }
687
+ set playbackRate(val) {
688
+ if (this.#provider?.isCasting) {
689
+ this.#provider.playbackRate = val;
690
+ return;
691
+ }
692
+ super.playbackRate = val;
693
+ }
694
+ get duration() {
695
+ if (this.#provider?.isCasting) return this.#provider.duration;
696
+ return super.duration;
697
+ }
698
+ get currentTime() {
699
+ if (this.#provider?.isCasting) return this.#provider.currentTime;
700
+ return super.currentTime;
701
+ }
702
+ set currentTime(val) {
703
+ if (this.#provider?.isCasting) {
704
+ this.#provider.currentTime = val;
705
+ return;
706
+ }
707
+ super.currentTime = val;
708
+ }
709
+ }
710
+ return CastableMedia;
711
+ };
712
+
713
+ //#endregion
3
714
  //#region ../core/dist/dev/dom/media/mux/env.js
4
715
  const getEnvPlayerVersion = () => {
5
716
  try {
6
- return "10.0.0-beta.21";
717
+ return "10.0.0-beta.22";
7
718
  } catch {}
8
719
  return "UNKNOWN";
9
720
  };
@@ -3060,13 +3771,13 @@ function isMuxVideoSrc({ src }) {
3060
3771
 
3061
3772
  //#endregion
3062
3773
  //#region ../core/dist/dev/dom/media/mux/index.js
3063
- var MuxVideoMedia = class extends MuxDataMediaMixin(HlsMedia) {
3774
+ var MuxVideoMedia = class extends MuxDataMediaMixin(CastableMediaMixin(HlsMedia)) {
3064
3775
  static PLAYER_SOFTWARE_NAME = "mux-video";
3065
3776
  };
3066
- var MuxAudioMedia = class extends MuxDataMediaMixin(HlsMedia) {
3777
+ var MuxAudioMedia = class extends MuxDataMediaMixin(CastableMediaMixin(HlsMedia)) {
3067
3778
  static PLAYER_SOFTWARE_NAME = "mux-audio";
3068
3779
  };
3069
3780
 
3070
3781
  //#endregion
3071
3782
  export { MuxVideoMedia as n, MuxAudioMedia as t };
3072
- //# sourceMappingURL=mux-B5K6kOzg.js.map
3783
+ //# sourceMappingURL=mux-BhHIeG3e.js.map